L P R O C M S II Java RMI
Transcription
L P R O C M S II Java RMI
Java RMI Des RPC aux Objets Distribués Olivier Flauzac LPRO CMSII [email protected] Java RMI – p. 1/36 Java RMI Remote Method Invocation LPRO CMSII introduit dans Java 1.1 objectifs : facilité le développement d’application distribuées utilisation de la même syntaxe qu’une application non distribuée (locale) moyens : ensemble de classes (API) java.rmi ensemble d’outils de développement ensemble de services réseau Java RMI – p. 2/36 RPC et RMI LPRO CMSII RPC entités actives : processus interaction : appel de procédure distante serveur : processus distant les processus supportent des programmes RMI entités actives : objets distibués interaction : invocation de méthode distante serveur : processus distant les objets ont des interfaces distantes plusieurs objets par processus Java RMI – p. 3/36 LPRO CMSII Des Objets Objet : unité de désignation et de distribution attributs (état et données) accessibles au travers d’accesseurs opérations (code et actions) appelées méthodes référence Propriétés des objets encapsulation instanciation héritage polymorphisme objectifs de mise en œuvre modularité réutilisation composition ... Java RMI – p. 4/36 LPRO CMSII Procédures et Méthodes Langage procédural données : variables code : procédure Procédure exécutée sur des variables variable : argument explicite Langage orienté objet données : attribut code : méthode Procédure exécutée sur des variables variable : argument explicite Java RMI – p. 5/36 LPRO CMSII Programmes Java distribués et non distribués (1) définition d’un objet local : depuis une classe Java RMI : exportation du comportement définit dans une interface étendant l’interface Remote implémentation d’un objet local : par à une classe Java RMI : par une classe Java implémentant l’interface distante instanciation local : à l’aide de new RMI : créé par l’hôte du service à l’aide de new accès local : via une référence locale RMI : via une référence à l’aide d’un objet «proxy» Java RMI – p. 6/36 Programmes Java distribués et non distribués (2) LPRO CMSII référence local : direct vers un objet dans le «tas» RMI : au travers d’un objet «proxy» ramasse miette local : périodique en fonction des objets déréférencés RMI : combinaison de ramasse miettes locaux exceptions local : gestion de Runtime exception et des Exception RMI : gestion de RemoteException Java RMI – p. 7/36 Architecture de RMI LPRO CMSII utilisation d’interfaces définition du comportement (client) de l’implémentation (serveur) architecture en couches : Stub et Skeleton Reférence distante couche de transport (TCP/IP) possibilité de réimplémenter certains éléments ou certaines couches Java RMI – p. 8/36 LPRO CMSII Caractéristiques RPC pour des objects Java stubs côté client skeletons côté serveur masquage des dencodages / désencodages et des communications métaéléments (int, float ...) locaux transmis par valeur objets locaux transmis par valeur paramètre objets distants transmis par référence services chargement dynamique des souches garbage collector réparti objets serveurs activable Java RMI – p. 9/36 RMI : Principe Client Serveur Objet Client Objet Serveur Talon Client Stub Squelette Serveur Skeleton LPRO CMSII Remote Reference Layer Transport interaction d’objets situés dans des espaces différents Java RMI – p. 10/36 RMI côté client LPRO CMSII le talon offre la même interface que le serveur lié à un seul serveur mise en forme des requêtes génération d’un flot d’octets identification de la méthode mise en forme des arguments éléments de contrôle (statistiques, partage de charge ...) liaison de l’objet client avec le talon de l’objet distant gestion de la référence sur le serveur invoquation de la méthode Java RMI – p. 11/36 RMI côté serveur LPRO CMSII le squelette (obsolète dans Java 2) représentation de l’objet sur le serveur lié à un seul serveur plusieurs squelettes possibles pour un serveur récupération du flot d’octets d’appel instanciation des objets répartis liaison et enregistrement des objets Java RMI – p. 12/36 La couche de références distantes LPRO CMSII assure l’invocation distante mets en œuvre un objet RemoteRef (lien vers le service distant) la stub utilise la méthode invoke() sur l’objet RemoteRef plusieurs sémantiques de connexion : unicast (point à point) java 1 multicast java 2 ... Java RMI – p. 13/36 La couche de transport LPRO CMSII basé sur TCP/IP utilisation de Java Remote Method Protocol autre protocoles utilisés dans différentes implémentations de RMI : BEA Weblogic NinjaRMI mise en œuvre dans le cadre de RMI-IIOP d’une nouvelle couche : Inter-ORB respectant le standard de l’OMG Java RMI – p. 14/36 Localisation de l’objet distant LPRO CMSII utilisation d’un service de naming (directory) plusieurs services utilisables : Java Naming and Directory Interface rmiregistry offert par RMI (port 1099) tnameserv (Corba) URL pour la localisation : rmi://Nomhost:port/nomService Java RMI – p. 15/36 Architecture générale de RMI rmiregistry 3 5 Naming Naming 4 3 6 Client LPRO CMSII 8 7 1 6 Stub JVM Client 2 8 Serveur 2 Skeleton 2 JVM Serveur Java RMI – p. 16/36 LPRO CMSII Opérations côté serveur 1. enregistrement de l’objet serveur auprès de sa JVM (bind, rebind) 2. création de l’objet skeleton, du port de communication associé, référencement de l’objet serveur 3. enregistrement (naming) auprès d’un serveur de nom (rmiregistry) de l’objet serveur du port associé à l’objet serveur est prêt Java RMI – p. 17/36 Opérations côté client LPRO CMSII 4. localisation de l’objet serveur à l’aide du Naming (lookup) 5. le Naming obtient la référence vers l’objet serveur 6. création de l’objet Stub, création du port de communication associé 7. maintenance d’une référence vers le stub 8. appel au serveur à travers l’objet stub Java RMI – p. 18/36 Conception d’une application RMI 1. 2. 3. 4. 5. écriture de l’interface de service écriture de la classe de service écriture du seveur écriture du client compilation de l’application (javac) 6. génération des squelettes et talons (rmic) LPRO CMSII 7. lancement du serveur de noms (rmiregistry) 8. lancement du serveur 9. lancement du client Java RMI – p. 19/36 Interface distantes LPRO CMSII les objets sont accessibles à distance à travers l’interface distante l’interface étend (dérive) l’interface java.rmi.Remote l’interface distante doit : être publique contenir des méthodes relayant des exceptions du type : java.rmi.RemoteException contenir des paramètres sérialisables : dont les classes implémentent la classe Serializable import j a v a . r m i . ∗ ; public i n t e r f a c e H e l l o extends Remote { public S t r i n g p r i n t ( ) throws RemoteException ; } Java RMI – p. 20/36 Classe de l’interface distante LPRO CMSII permet l’instanciation d’un objet java standard définition de constructeurs définition du corps des méthodes implémente l’interface distante étend (dérive) la classe UnicastRemoteObject Java RMI – p. 21/36 LPRO CMSII Code de l’interface distante import j a v a . r m i . ∗ ; import j a v a . r m i . s e r v e r . ∗ ; public class H e l l o I m p l extends UnicastRemoteObject implements H e l l o { p r i v a t e S t r i n g msg ; public H e l l o I m p l ( S t r i n g msg ) throws RemoteException { super ( ) ; t h i s . msg=msg ; } public S t r i n g p r i n t ( ) throws RemoteException { r e t u r n " H e l l o World " + msg ; } } Java RMI – p. 22/36 Le serveur LPRO CMSII assure la construction de l’objet distant l’enregistrement de l’objet import j a v a . r m i . ∗ ; import j a v a . r m i . s e r v e r . ∗ ; public class H e l l o S e r v e r { public s t a t i c void main ( S t r i n g arg [ ] ) { try { H e l l o I m p l o b j = new H e l l o I m p l ( " depuis l e s e r v e u r " ) ; Naming . r e b i n d ( " r m i : / / l o c a l h o s t / mon_svc " , o b j ) ; System . o u t . p r i n t l n ( " Objet enregistré " ) ; } catch ( E x c e p ti o n e ) { System . o u t . p r i n t l n ( " E r r e u r " ) ; } } } Java RMI – p. 23/36 Le client LPRO CMSII récupère la référence de l’objet invoque les méthodes import j a v a . r m i . ∗ ; public class H e l l o C l i e n t { public s t a t i c void main ( S t r i n g arg [ ] ) { try { H e l l o o b j = ( H e l l o ) Naming . lookup ( " r m i : / / l o c a l h o s t / mon_svc " ) ; System . o u t . p r i n t l n ( o b j . p r i n t ( ) ) ; } catch ( E x c e p ti o n e ) { System . o u t . p r i n t l n ( " E r r e u r " ) ; } } } Java RMI – p. 24/36 Compilation et implantation compilation des différents éléments javac HelloServer.java HelloClient.java Génération des talons rmic HelloImpl LPRO CMSII HelloImpl_Skel.class HelloImpl_Stub.class activation du serveur de noms Unix : rmiregistry & Win : start rmiregistry lancement du serveur java HelloServer lancement du client java HelloClient Java RMI – p. 25/36 Exercices LPRO CMSII 1. écrire un serveur de date et d’heure 2. écrire un un système simple de MOM et donnez un exemple de client associé Java RMI – p. 26/36 Services de nommage classe java.rmi.Naming enregistrement d’un objet s t a t i c void b i n d ( S t r i n g name , Remote o b j ) ré enregistrement d’un objet s t a t i c void r e b i n d ( S t r i n g name , Remote o b j ) désenregistrement d’un objet LPRO CMSII s t a t i c void unbind ( S t r i n g name ) liste des noms d’objets enregistrés (String : URL du rmiregistry) s t a t i c S t r i n g [ ] l i s t ( S t r i n g name ) recherched d’un objet s t a t i c Remote lookup ( S t r i n g name ) Java RMI – p. 27/36 Services d’activation LPRO CMSII service d’activation d’objets (JDK 1.2) activation à l’aide d’un démon java.rmi.activation intérêt : activation à la demande (moins coûteux) références persistantes évite les références «perdues» en cas de crash utilisation d’une référence unique sur le client Java RMI – p. 28/36 Service d’activation : Mise en œuvre éxtension de java.rmi.activation.Activatable surcharge du constructeur protected A c t i v a t a b l e ( A c t i v a t i o n I D aid , i n t p o r t ) LPRO CMSII protected A c t i v a t a b l e ( S t r i n g l o c a t i o n , M a r s h a l l e d O b j e c t data , boolean r e s t a r t , int port ) récupération des données via MarshalledObject au moins 1 constructeur d’activation enregistrement avec le serveur d’activation possibilité d’enregistrement avec le service de nommage Java RMI – p. 29/36 Service d’activation : Interface du service import j a v a . r m i . ∗ ; LPRO CMSII public i n t e r f a c e LaDate extends Remote { public byte j o u r ( ) throws RemoteException ; public byte mois ( ) throws RemoteException ; public i n t annee ( ) throws RemoteException ; } Java RMI – p. 30/36 Service d’activation : Implémentation du service LPRO CMSII import j a v a . r m i . ∗ ; import j a v a . r m i . s e r v e r . ∗ ; import j a v a . u t i l . ∗ ; import j a v a . r m i . a c t i v a t i o n . ∗ ; public class LaDateImpl extends A c t i v a t a b l e implements LaDate { p r i v a t e Calendar c ; public LaDateImpl ( A c t i v a t i o n I D aid , M a r s h a l l e d O b j e c t mo) throws E x c e p ti o n { super ( aid , 0 ) ; c = ( Calendar ) mo. g e t ( ) ; } public byte j o u r ( ) throws RemoteException { r e t u r n ( byte ) c . g e t ( Calendar .DAY_OF_MONTH ) ; } public byte mois ( ) throws RemoteException { r e t u r n ( byte ) c . g e t ( Calendar .MONTH) ; } public i n t annee ( ) throws RemoteException { r e t u r n c . g e t ( Calendar .YEAR ) ; } } Java RMI – p. 31/36 Service d’activation : Programme serveur LPRO CMSII création du groupe d’activation création du descripteur d’activation import j a v a . l a n g . ∗ ; import j a v a . r m i . ∗ ; import j a v a . r m i . a c t i v a t i o n . ∗ ; public class LaDateServer { public s t a t i c void main ( S t r i n g [ ] arg ) throws E x c e p ti o n { A c ti v a ti o n G r o u p De sc gDesc = new A c ti v a ti o n G r o u p De s c ( n u ll , n u l l ) ; A c t i v a t i o n G r o u p I D gID = A c t i v a t i o n G r o u p . getSystem ( ) . r e g i s t e r G r o u p ( gDesc ) ; A c t i v a t i o n G r o u p . createGroup ( gID , gDesc , 0 ) ; M a r s h a l l e d O b j e c t mo = new M a r s h a l l e d O b j e c t ( " svc " ) ; A c t i v a t i o n D e s c desc = new A c t i v a t i o n D e s c ( " LadateImpl " , " " ,mo ) ; LaDateImpl da = ( LaDateImpl ) A c t i v a t a b l e . r e g i s t e r ( desc ) ; Naming . b i n d ( " svc " , da ) ; } } Java RMI – p. 32/36 Service d’activation : utilisation LPRO CMSII programme client sans modification utilisation du rmiregistry utilisation du démon d’activation rmid attention à la gestion de sécurité ! ! ! Java RMI – p. 33/36 Interface distante et sécurité LPRO CMSII «éclatement» des fichiers : possibilité de chargement dynamique du client possibilité de chargement dynamique du stub possibilité de mise en œuvre en trois parties : client, serveur, serveur RMI Gestion de la sécurité RMISecurityManager limitation des opérations mise en place de droits locaux mise en place de droits réseaux Java RMI – p. 34/36 Avantages de RMI LPRO CMSII «simple» à mettre en œuvre compatibilité des applications distribuées possibilité d’exploiter la totalité de l’API Java gestion distribuée de la mémoire (garbage collector distribué) possibilité de gestion de la sécurité applicable au WEB ne nécssite pas d’installation autre qu’une JVM Java RMI – p. 35/36 Inconvénients de RMI LPRO CMSII obligation d’homogénéité du langage problème de mise enœuvre avec les threads pas ou peu de services distribuées associés limité au développements Java RMI – p. 36/36