L P R O C M S II Java RMI

publicité
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
Téléchargement