Академический Документы
Профессиональный Документы
Культура Документы
Eric Cariou Universit de Pau et des Pays de l'Adour Dpartement Informatique Eric.Cariou@univ-pau.fr
1
Middleware
Services de plus haut niveau que les communications via sockets TCP/UDP, augmentation du niveau d'abstraction Client 1 Middleware Client 2 Middleware Couches rseau Systme Exploit. Matriel Rseau physique Serveur Middleware
...
Extension naturelle de l'appel local d'opration dans le contexte des systmes distribus Une partie serveur offre une opration appele par une partie client Permet d'appeler une procdure/mthode sur un lment/objet distant (presque) aussi facilement que localement Exemples (dans ordre historique d'apparition) RPC (Remote Procedure Call) : solution de Sun pour C/Unix CORBA (Common Object Request Broker Architecture) : standard de l'OMG permettant l'interoprabilit quelque soit le langage ou le systme Java RMI (Remote Method Invocation) : solution native de Java Famille des MOM (Message Oriented Middleware) Event Service de CORBA, JMS de Java Accs une mmoire commune distribue JavaSpace de Java
Mmoire partage
Middleware
Modle RPC/RMI
Interaction forte entre parties client et serveur Appel synchrone (pour le client) d'opration sur le serveur Gnralement, le client doit explicitement connatre le serveur Peu dynamique (point de vue serveur) car les lments serveurs doivent tre connus par les clients et lancs avant eux Mode 1 vers 1 : opration appele sur un seul serveur la fois Asynchrone et pas d'interaction forte entre lments Envoi de message est asynchrone Pas de ncessit de connatre les lments accdant la mmoire Permet une plus forte dynamicit : ajout et disparation d'lments connects au middleware facilits par les faibles interactions et l'anonymat Mode 1 vers n Diffusion de messages plusieurs lments en mme temps Accs aux informations de la mmoire par plusieurs lments
Transparence la localisation
Accs des objets/ressources distantes aussi facilement que localement et indpendamment de leur localisation
CORBA par exemple : fait interoprer via du RPC/RMI des lments logiciels crits dans n'importe quel langage
Tout autre type de transparence (voir cours intro), selon le middleware Un ou plusieurs services de communication/interaction
Service de nommage
Middleware
Pour enregistrer, identifier et rechercher les lments et services connects via le middleware Service d'un lment = (interfaces d') opration(s) offerte(s) par un lment et pouvant tre appele(s) par d'autres Un lment enregistre les oprations qu'il offre Recherche d'une opration ou d'un lment, 2 modes
On demande recevoir une rfrence sur un lment qui offre une opration compatible avec celle que l'on cherche On sait identifier l'lment distant et on demande rcuprer la rfrence sur cet lment
Une fois la rfrence sur l'lment distant connu, on peut appeler l'opration sur cet lment via cette rfrence
6
Middleware RPC/RMI
Middleware RPC/RMI
Talon (stub) : lment/proxy du cot client qui offre localement les mmes oprations (la mme interface) que le servant Squelette (skeleton) : lment du cot serveur qui reoit les requtes d'appels d'oprations des clients et les lance sur le servant 8
Middleware RPC/RMI
Partie client : partie qui appelle l'opration distante Partie serveur : partie qui offre l'opration distante via une interface
Appele aussi servant pour certains middleware A implmenter par le dveloppeur : contient le code des oprations de l'interface
Internes au middleware Attaquent les couches TCP ou UDP via des sockets pour grer la communication entre les talons et squelettes
Middleware RPC/RMI
En ralit, une rfrence sur le talon local Appel synchrone : la partie client attend que l'appel de l'opration soit termin pour continuer son excution
3. Le talon, qui reoit cet appel, compacte (marshall) toutes les donnes relatives l'appel (identificateur opration + paramtres) 4. L'lment de communication envoie les donnes l'lment de communication cot serveur 5. L'lment de communication cot serveur envoie les donnes au squelette 6. Le squelette dcompacte les donnes (unmarshall) pour dterminer l'opration appeler sur le servant 7. L'opration est appele sur le servant par le squelette 10
Middleware RPC/RMI
8. Le squelette rcupre la valeur de retour de l'opration, la compacte et l'envoie au talon via les lments de communication
9. Le talon dcompacte la valeur et la retourne la valeur la partie client 10.L'appel de l'opration distante est termin, la partie client continue son excution
11
Middleware RPC/RMI
Le servant est plant ou inaccessible La requte d'appel d'opration n'a pas t reue cot servant La rponse la requte n'a pas t reue par la partie client L'excution de l'opration s'est mal passe ...
Doit renvoyer la requte au serveur a priori Mais cot serveur, si l'opration modifie un tat doit viter de rappeller l'opration a priori Plusieurs cas possibles pour grer cela
12
Middleware RPC/RMI
On ne sait pas si l'opration a t appele L'opration a t appele au moins une fois mais peut-tre plusieurs fois galement
L'opration est appele une seule fois ou on reoit un message informant qu'un problme a eu lieu et que l'opration n'a pas t appele Cas idal mais difficile atteindre 13
Une fois
Middleware RPC/RMI
Le client peut redemander au serveur d'appeler l'opration en cas de non rponse reue de sa part Si le serveur dtecte qu'il s'agit d'une redemande d'appel d'opration, il n'excute pas une nouvelle fois l'opration Le serveur garde un historique des valeurs de retour des oprations et peut renvoyer le rsultat retourn pour une opration en cas de nouvelle demande de cette mme opration
14
Middleware RPC/RMI
Smantique peut-tre
Retransmission des requtes, filtrage des duplicats de requtes et utilisation de l'historique des rponses
15
Rfrence sur un objet distant = rfrence locale sur un proxy pour cet objet Quand localement un proxy n'est plus rfrenc par aucun objet, on peut informer le GC grant l'objet distant de la perte de rfrence Ne pourra pas prciser un GC que l'objet n'est plus rfrenc Solution : utiliser une dure de bail (lease) Si au bout d'un certain temps, un objet distant n'a pas utilis un objet local, localement, on considre que l'objet distant ne rfrence plus l'objet local 18
Java RMI
19
Java RMI
Java RMI Une mise en oeuvre de CORBA Spcifique au langage Java : ne fait communiquer que des lments crits en Java Suit l'architecture et les rgles de fonctionnement des middlewares de type RPC/RMI Cas particulier du squelette cot serveur : depuis Java 1.2, plus besoin de squelette
Java RMI
20
Java RMI
Interface
Spcialise java.rmi.Remote : prcise qu'il s'agit d'une interface de service appelables distance Chaque opration doit prciser dans sa signature qu'elle peut lever l'exception RemoteException
RemoteException est la classe mre d'une hirarchie d'une vingtaine d'exceptions prcisant un problme lors de l'appel de l'opration, comme, par exemple
NoSuchObjectException : ne peut rcuprer la ref sur l'objet distant StubNotFoundException : un stub correct n'a pas t trouv UnknowHostException : la machine distante n'a pas t trouve AlreadyBoundException : le nom associ l'objet est dj utilis ConnectException : connexion refuse par la partie serveur
22
Exemple d'interface
Les oprations sont quelconques, avec type de retour et paramtres de types primitifs ou de n'importe quelle classe Lors de l'implmentation des oprations de l'interface
On ne traite pas directement les cas d'erreurs correspondant la leve d'une exception RemoteException C'est le middleware/Java qui le fera cot client en cas de besoin 23
Exemple d'interface
24
Servant : exportation
L'objet de la classe implmentant l'interface doit s'exporter pour accepter des connexions de clients Cration et utilisation des ressources, lments ncessaires la communication via sockets TCP Unicast : l'objet de la classe implmentant l'interface n'existe qu'un en seul exemplaire sur une seule machine L'objet meurt avec la fin de l'excution du serveur qui le lance Deux modes La classe tend directement la classe UnicastRemoteObject Le constructeur par dfaut appele super(); Pas de spcialisation et le constructeur doit excuter l'instruction suivante :
UnicastRemoteObject.exportObject(this);
Le constructeur par dfaut doit prciser dans sa signature qu'il peut lever RemoteException
25
Servant
Les oprations de l'interface sont standards , rien de particulier RMI ( part l'exception RemoteException dans la signature) La classe peut implmenter d'autres oprations mais seules celles d'interfaces tendant Remote sont appelables distance
26
Une partie client doit pouvoir rcuprer une rfrence sur l'objet distant implmentant l'interface
Registry
Utilise les services du registry (registre, annuaire ...) Le registry est lanc part cot des applis Java Un objet accde au registry via la classe Naming
Via une URL de la forme rmi://hote:port/nomObj hote : nom de la machine distante (sur laquelle tourne un registry) port : port sur lequel coute le registry nomObj : nom donn un objet offrant des oprations Si pas prcision du port : port par dfaut utilis par le registry Si pas prcision de l'hte : registry local par dfaut (localhost)
27
Lancement du registry
Registry
Unix/Linux : $ rmiregistry [port] Windows : > start rmiregistry [port] En paramtre, on peut prciser un numro de port : port d'coute du registry
Opration de java.rmi.registry.LocateRegistry
public static Registry createRegistry(int port) throws RemoteException
28
Classe java.rmi.Naming
Registry
5 oprations statiques pour enregistrer des objets et rcuprer leurs rfrences (lvent toutes plusieurs exceptions voir API)
Enregistre un objet sous le nom name (erreur si dj un objet avec ce nom) Enregistre un objet sous le nom name, en crasant la prcdente liaison objet/nom si elle existait Supprime du registry la rfrence vers l'objet nomm name Retourne l'ensemble des noms des objets enregistrs sur le registry Retourne une rfrence sur l'objet dont le nom est pass en paramtre Exception NotBoundException leve si objet pas trouv par le registry
Attribut name dans les 5 oprations : sous la forme URL de type RMI
29
Pour pouvoir appeler les oprations distance, il faut gnrer le stub (talon)
Et le squelette avant la version 1.2 de Java Pour notre exemple : $ rmic RectangleImpl On passe en paramtre rmic le nom de la classe qui implmente l'interface (ou les interfaces) Gnre et compile automatiquement le fichier RectangleImpl_Stub.java (option -keep de rmic pour conserver les sources Java)
Gnration stub/squelette
Utilitaire : rmic
{ ... }
32
Rsultat du lookup
Si objet trouv par le registry distant, retourne un objet implmentant l'interface gnrique Remote En pratique ici : un objet implmentant IRectangle
Comme par exemple RectangleImpl instantie cot serveur On rcupre en fait une rfrence sur une instance de RectangleImpl_Stub
Le talon local cot client qui sert de proxy pour l'accs l'instance de RectangleImpl cot serveur
On passe ou rcupre la rfrence sur un objet distant L'objet est clon, on passe ou rcupre une copie de l'objet
Les paramtres ou valeurs de retour sont forcment srialiss pour tre transmis via le rseau 34
Appels en retour
Appels en retour
Appels en retour
Une mthode pour s'enregistrer comme observateur de la valeur et une pour se dsenregistrer Le paramtre est de de type IChangeValue
Implmentation de l'observateur
Appels en retour
public class Observer extends UnicastRemoteObject implements IchangeValue { // mthode qui sera appele par l'observ distant public void newValue(int value) throws RemoteException { System.out.println(" nouvelle valeur : "+value); } // mthode appeller pour s'enregistrer auprs de l'observ public void subscribeToObservee() { try { ISubscription sub = (Isubscription) Naming.lookup("rmi://scinfe222/observee"); sub.subscribe(this); } catch (Exception e) { ... } } // constructeur qui appelle super pour exporter l'objet public Observer() throws RemoteException { super(); } }
38
Implmentation de l'observ
// liste des observateurs protected Vector observerList; // donne observe protected int value = 0;
Appels en retour
// enregistrement d'un observateur distant public synchronized void subscribe(IChangeValue obs) throws RemoteException { observerList.add(obs); } // dsenregistrement d'un observateur distant public synchronized void unsubscribe(IChangeValue obs) throws RemoteException { observerList.remove(obs); }
39
Appels en retour
40
Appels en retour
Lancement de l'observ
Observee obs = new Observee(); Naming.rebind("observee", obs); for (int i=1; i<=5; i++) { obs.changeValue(i*10); Thread.sleep(1000); }
Note 1
Appels en retour
Quand un observateur appelle subscribe sur l'observ distant, il passe sa rfrence distante car il implmente une interface Remote
L'appel de newValue se fait donc bien sur l'observateur distant (distant du point de vue de l'observ qui appelle newValue)
Note 2
On peut noter que les observateurs ne se sont pas enregistrs via le registry On peut en effet communiquer avec un objet distant partir du moment o il s'est export
L'enregistrement via le registry n'est utile que pour rcuprer sa rfrence partir de son nom associ Inutile ici car les observateurs passent eux-mmes leurs rfrences l'observ 42
Cot servant
43
Mobilit de code
En ralit une rfrence sur un stub local qui implmente la mme interface d'oprations que l'objet distant Mme si la classe du stub n'apparat pas explicitement dans le code, elle doit pouvoir tre retrouve l'excution Contraintes d'une application distribue
Les diffrents objets ne s'excutent pas dans les mmes JVM ni sur les mmes machines : accs aux .class peuvent diffrer Malgr cela, on doit pouvoir cot client rcuprer la classe du stub
Localement, la classe se retrouve via le CLASSPATH A distance, en tlchargeant la classe partir d'un emplacement prcis
44
Mobilit de code
Une proprit de Java permet de prciser une URL o aller tlcharger les classes requises
java.rmi.server.codebase, positionner en lanant le programme Java URL est de type file , ftp ou http Exemples
Scurit : ne doit pas pouvoir par dfaut tlcharger n'importe quelle classe de n'importe o 45
Gestion de la scurit
Mobilit de code
Il n'est pas possible de tlcharger des classes sans mettre en place un security manager Classe java.lang.SecurityManager
Permet de prciser les permissions pour l'accs aux fichiers, au rseau, la rflexion sur les objets, la srialisation ... Classe spcialiser pour prciser les permissions selon le contexte
Trs restrictif par dfaut : interdit notamment le tlchargement de classe et peu prs tout le reste aussi ... 46
Mobilit de code
47
Mobilit de code
Ces permissions sont positionner pour les programmes qui tlchargeront les classes, inutiles pour les autres Assez complexe apprhender et comprendre... Voir les documentations spcialises ce sujet
48
Mobilit de code
Quand serveur enregistre un objet sur le registry, le registry doit pouvoir rcuprer la classe du stub distant pour l'associer l'objet
Soit le serveur est lanc avec un codebase positionn et le registry va l'y chercher Soit le registry la trouve en local (registry lanc du mme rpertoire que le serveur par exemple) Le registry lui envoie le nom de la classe du stub et le codebase associ (sauf si le registry a trouv la classe en local, il envoie pas de codebase) Si le client trouve cette classe via son CLASSPATH, c'est celle l qui est choisie en priorit Sinon, il la rcupre via le codebase envoy par le registry Si on lui avait pass en paramtre un codebase son lancement, il la cherche galement cet endroit Le client instantie la classe du stub, l'instantie dynamiquement et utilise cette instance pour accder l'objet distant
49
Mobilit de code
Pas besoin de prciser de codebase, tout sera charg localement Dynamique cot client
Le serveur est lanc en prcisant un codebase Le client est lanc sans codebase et retrouvera les classes via les informations envoyes par le registry Dynamique cot serveur
Le client est lanc en prcisant un codebase Le serveur, en cas d'appel en retour par exemple, rcupre les stubs cot client via ce codebase
50
Mobilit de code
Mobilit de code
Ne concerne pas que les stubs Toute classe ncessaire au bon fonctionnement de l'application peut-tre tlcharge au besoin
51
Exemple (suite)
Mobilit de code
L'interface est inchange : IRectangle Cot servant, on modifie decaleRectangle() pour renvoyer une instance de Rectangle2
public class RectangleImpl implements IRectangle { (...) public Rectangle decalerRectangle(Rectangle rect, int x, int y) throws RemoteException { return new Rectangle2(rect.x1 + x, rect.y1 + y, rect.x2 + x, rect.y2 + y); } (...)
52
Exemple (suite)
Mobilit de code
Elle doit donc positionner un security manager pour commencer // positionne le security manager acceptant tout
Rectangle r1, r2; r1 = new Rectangle(10, 10, 20, 30); IRectangle opRectangle = (IRectangle) Naming.lookup("rmi://scinfe222/opRect"); r2 = opRectangle.decalerRectangle(r1, 15, 10); System.out.println("classe de IRectangle = " +opRectangle.getClass()); System.out.println("classe de r2 = "+r2.getClass());
System.setSecurityManager(new SecurityManagerOuvert());
53
Exemple (suite)
Mobilit de code
Le serveur (Serveur.java) est lanc en prcisant un codebase pour accder aux classes requises
Le registry est lanc d'un rpertoire quelconque (et pas celui o se trouvent les classes) Le client est lanc sans avoir accs via son CLASSPATH aux bonnes classes (RectangleImpl et Rectangle2)
$ java Client Ce qui affiche le rsultat suivant classe de IRectangle = class RectangleImpl_Stub classe de r2 = class Rectangle2 54
Mobilit de code
Exemple (fin)
Les classes RectangleImpl et Rectangle2 ont donc t rcupres par le client en les tlchargeant l'URL http://www.univ-pau.fr/~ecariou/test-rmi/
Si l'excution des exceptions UnmarshalException, AccessDeniedException ou ClassNotFoundException sont leves
Note
Correspond souvent des tentatives de tlchargement de classes mais sans avoir les permissions suffisantes ou sans savoir o aller les rcuprer Si c'est du cot serveur : le registry n'arrive pas rcuprer le stub, le codebase a t oubli cot serveur 55
Mobilit de code
Note
Ne pas oublier de prendre en compte les packages
Garbage collector
Redfinition de la mthode finalize() de java.lang.Object Interface java.rmi.server.Unreferenced dfinissant : public void unreferenced() Cette interface peut tre implmente par un objet offrant des oprations appellables distance L'opration unreferenced est appele quand plus aucun objet distant ne possde de rfrence sur l'objet courant
Ce que l'on peut faire par exemple dans cette mthode : dsexporter l'objet : unexporteObject(this, true);
57
Garbage collector
$ java -Djava.rmi.dgc.leaseValue=20000 Serveur La dure est prcise en milli-secondes, 20 secondes donc ici
Note
Ne pas oublier que le registry possde aussi une rfrence sur l'objet si ce dernier a t enregist dans le registry
58
Exportation de l'objet
Permet de limiter le nombre d'objets actifs en mme temps : gain de mmoire au besoin Plus complexe utiliser : voir documentation spcialise
59
Plusieurs solutions en RMI, dont l'encapsulation des communications dans des paquets HTTP
Tunneling HTTP Evite le filtrage sur les ports non standards
60