Rappels
CORBA est une norme rédigée par l'OMG. Elle définit une
architecture distribuée fondée sur le concept d'objet.
CORBA est une architecture distribuée dans laquelle des clients émettent
des requêtes à destination d'objets, qui s'exécutent dans
des processus serveurs. Clients et objets s'exécutent dans des environnements
hétérogènes, sur des machines généralement
distantes.
Architectures client/serveur
Architecture client/serveur traditionnelle
L'application cliente (interface homme/machine et traitements) est située sur le poste client. Le lien entre le client et le serveur (serveur de BD par exemple) est direct. L'application cliente accède aux données de la base via des requêtes SQL. Peu de traitements sont localisés au niveau du serveur.
Architecture client/serveur à trois niveaux
Le client n'accède jamais directement au serveur. Il émet des requêtes à un serveur d'application qui exécute les traitements et transmet les requêtes au serveur de données.
On parle d'architecture à 3 niveaux (ou tiers) :
client : où est placée la couche présentation (interface
homme/machine)
serveur d'application : on y trouve l'ensemble des traitements applicatifs séparés
des données physiques
serveur de bases de données : stockage des données
Cette architecture ne repose pas sur le concept objet. Les appels distants sont transparents sous forme RPC.
Architecture distribuée
Dans cette architecture l'ensemble des dialogues entre machines est pris en charge par le "middleware". Il prend en charge tous les problèmes de communication liés à l'intégration des différentes plates-formes utilisées :
Exemple :
Corba
Corba repose sur la notion de bus logiciel (Object
Request Broker).
En Corba, tout est objet. On bénéficie
donc des mécanismes d'héritage, polymorphisme
et encapsulation.
Les
avantages de Corba
Objets distribués de CORBA
Composants logiciels
Le modèle objet client-serveur CORBA
Il est fondé sur une entité virtuelle, l'objet CORBA, gérée
par le bus CORBA. Chaque application peut exporter ses services sous la forme
d'objets CORBA.
La coopération client-serveur se déroule de la manière
suivante :
Le contrat IDL (J.M. Geib, C.Gransart, P.Merle, URL : corbaweb.lifl.fr)
Il permet d'exprimer, sous la forme d'un contrat,
la coopération entre les fournisseurs et les utilisateurs de services.
Il sépare l'interface des objets de leur implantation et masque les problèmes
liés à la localisation des objets, à l'interopérabilité
et à l'hétérogénéité. Il spécifie
sous la forme d'interfaces IDL les types manipulés
par un ensemble d'applications réparties.
Le contrat IDL rend transparent aux fournisseurs et clients l'infrastructure
logicielle et matérielle. Il met client et fournisseur en relation à
travers un bus CORBA.
La compilation d'un contrat IDL créé une souche
(talon) IDL (ou SII, interface d'invocation statique) dans l'environnement
de programmation du client et une souche (squelette) IDL
(ou SSI, interface de squelette statique) dans l'environnement de programmation
du fournisseur.
Le client invoque localement la souche pour accéder à l'objet.
La souche construit alors la requête qui est ensuite transportée
par le bus logiciel pour être délivrée au squelette IDL
(coté serveur donc) qui la délègue à l'objet.
IDL : langage de définition d'interfaces
Structure syntaxique d'un module IDL
<module> /* un contexte ou espace de nommage */
<déclaration
de types>
<déclaration de constantes>
<déclaration d'exceptions>
<interface> /* une classe */
<déclaration de types>
<déclaration de constantes>
<déclaration d'exceptions>
<déclaration d'attributs> /* variables */
<déclaration d'opérations> /* méthodes */
<modules>
Exemple
/* définition
du contexte mes_animaux */
module mes-animaux;
{
/* définition de l'interface Chien */
interface Chien:Animal_de_compagnie, Animal /*
héritage */
{
readonly attribute long age;
exception non_interesse{string explication;};
void aboie(in short
combien_de_temps) raises (non_interesse);
void assis(in string ou) raises (non_interesse);
void grogne(in short apres_qui) raises (non_interesse);
}
/*
interface Chat */
interface Chat:Animal
{
void mange();
void viens();
}
}
La syntaxe IDL est très proche de la syntaxe C++.
Les interfaces définissent les classes de l'environnement. Elles peuvent
hériter la structure d'une ou plusieurs autres interfaces.
Les attributs définissent les variables publiques. Les clients peuvent
lire ou écrire ces attributs. Cependant, ils peuvent être marqués
en lecture seule :
readonly
attribute float position;
Les opérations sont les méthodes de l'objet. elles retournent
une valeur (éventuellement vide void)
et transmettent une liste de paramètres : in
( en entrée), out
(en sortie), inout
(en entrée/sortie). Elles peuvent lever une exception.
Mappings
Un mapping est une traduction des éléments fournis par l'IDL
en éléments d'un langage de programmation.
Les principaux mappings disponibles sont : C, C++, Java, Smalltalk, CLOS, Python,
Ada95, Cobol Objet.
Les compilateurs IDL ne traduisent que des squelettes. Les objets clients utilisent
ces squelettes pour déterminer les opérations légales qu'ils
peuvent invoquer sur un serveur. Les objets serveur fournissent une implantation
pour ces squelettes.
Référentiel d'interfaces
C'est une base de données en ligne de définitions d'objets, d'interfaces,
de modules. Les définitions d'objets sont fournies par les compilateurs
d'IDL ou par des fonctions d'écriture du référentiel.
Les référentiels d'interfaces peuvent se fédérer
et coopérer à travers les ORBs.
ORB
ou Bus CORBA
C'est un bus à objets. Il permet aux objets de faire des requêtes
vers des objets locaux ou distants et de recevoir des réponses en rendant
transparents les mécanismes de communication à travers le réseau.
Quelques
propriétés des ORBs
Architecture CORBA
La relation entre objets distribués est une relation client-serveur.
Le serveur fournit une interface distante. Le client invoque une interface
distante. Le client peut lui-même jouer le rôle de serveur s'il
implante une interface qui peut être invoquée à distance
par d'autres objets.
Coté
client
Le client connaît l'interface d'un objet spécifique (il dispose
de l'IDL). Le client possède une représentation de l'objet distant
appelée talon ("stub") générée par l'IDL.
Le talon transmet la requête à l'objet distant via le bus logiciel
(ORB). Il s'agit d'une représentation de l'objet distant responsable
de la transmission d'une invocation de méthode du talon vers l'objet
distant. Il ne s'agit pas d'une copie de l'objet distant.
A travers le talon le client voit l'interface de l'objet sans savoir où
est l'objet et sans connaître le langage de programmation utilisé
pour son implantation.
En pratique, le client :
Coté
serveur
L'ORB utilise un squelette de code pour traduire l'invocation distante en un
appel de méthode sur l'objet local. Le squelette traduit l'appel et les
paramètres dans le format de l'implantation spécifique et appelle
la méthode invoquée.
Au retour de la méthode, les résultats ( ou erreurs ) sont traduits
par le squelette et renvoyés au client via l'ORB.
Communication entre ORB, protocoles réseaux
Tout bus à la norme CORBA 2.0 doit fournir les protocoles GIOP et IIOP.
GIOP est un protocole générique. Il fournit :
Les ORBs partagent un protocole commun IIOP ((Internet Inter ORB Protocol),
implantation de GIOP sur TCP/IP et donc de l'internet. Ce protocole définit
comment les ORBs (répondant à la spécification CORBA) se
transmettent de l'information.
Autres services fournis par les ORBs :
L'Object Management Architecture (OMA)
Elle identifie les différents composants d'une architecture distribuée.
L'ORB
Il se charge de localiser les objets, de les charger en mémoire, de transmettre au serveur les demandes du client. Il assure les opérations de maintenance, cycle de vie, gestion des erreurs.
Les services objets (CORBAServices)
Il s'agit d'un ensemble de services spécifiés par l'OMG que l'on peut retrouver dans la plupart des applications :
service de nommage : tout objet est enregistré
dans un catalogue sous la forme d'une couple (nom symbolique, référence).
Tout utilisateur peut donc obtenir la référence d'un objet connaissant
son nom symbolique.
service d'évènements : produit des
évènements asynchrones au niveau des serveurs
service de cycle de vie : fournit un ensemble d'opérations
pour créer, supprimer, déplacer, copier des objets
service de persistance : stockage et restauration
d'objets
service d'externalisation : permet de placer des
objets dans un flux
service transactionnel : garantit l'intégrité
des données lors d'un traitement
service de sécurité : authentification
des clients, cryptage des données, gestion des certificats
service de courtage : rechercher un objet dont
on ne connait pas le nom à partir de critères.
etc ...
Les utilitaires communs (CORBAFacilities)
Gestionnaires d'impression, outils de gestion documentaire, diverses boites à outils.
Les interfaces de domaines
Il s'agit d'un ensemble d'interfaces d'objets utilitaires liés à un domaine d'activité spécifique.
Les objets applicatifs
Il s'agit des objets crées par les utilisateurs qui vont s'insérer comme un sous-ensemble de l'architecture OMA.
Le marché CORBA actuel
Chaque éditeur est libre de répondre à tout ou partie de la norme. Tous les services ne sont pas implantés .
Inprise
|
VisiBroker
|
nombreux services
|
IONA
|
Orbix
|
passerelle DCOM
|
IBM
|
SOMObjects
|
OS2 et Windows seulement
|
Object Oriented Concepts
|
ORBacus
|
code source
|
Développement d'une application à objets distribués avec JavaIDL
L'ORB fourni par JavaIDL ne supporte que la recherche d'objets par leur nom
(service de nommage).
Ces différentes étapes sont décrites concrètement
à travers l'exemple HelloWorld
qui établit une relation client-serveur simple :
1. Le client (applet ou appli) invoque la méthode sayHello
du serveur HelloServer.
2. L'ORB transfère l'invocation à l'objet distant correspondant
à cette interface (dans le référentiel d'interfaces).
3. La méthode sayHello
du servant s'exécute et retourne la chaine de caractères "Hello".
4. L'ORB transfère la chaine vers le client
5. Le client l'imprime
L'invocation de la méthode est statique.
1- Définir l'interface distante
L'interface est écrite en IDL
2- Compiler l'interface distante
Le compilateur idlj
traduit l'interface en Java.
Il produit une version Java de l'interface, le talon et le squelette
3- Implanter le serveur
A l'aide des squelettes générés. Implanter les méthodes
de l'interface distante. Lancer l'ORB qui se met en attente d'un client.
4- Implanter le client
A l'aide des talons générés. Le code client recherche le
serveur en utilisant le service de nommage, obtient une référence
sur l'objet distant et invoque sa méthode.
5- Lancement de l'application
Lancement du service de nommage, lancement du serveur et exécution de
l'application.
Développement
d'une autre application à objets distribués avec JavaIDL
Reprendre l'application de gestion de comptes bancaires de manière simplifiée. Le but est de réaliser à distance des requêtes sur un objet compte.
On considère un serveur capable de créer un unique compte sécurisé avec un code donné et un solde initial quelconque puis de répondre aux requêtes de débit, d'interrogation et de crédit qui lui sont adressées.
Le client, pour sa part se contentera d'interroger le solde du compte, de le débiter puis d'à nouveau interroger son solde.
Il serait de bon ton de se préoccuper des exceptions possibles.