M.3.
3: Génie Logiciel Objet
M.3.3.2
Programmation Objet Avancée
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 1
M.3.3.2 Programmation Objet Avancée
RMI
et
objets distribués
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 2
Plan
Pourquoi RMI ?
Principe de fonctionnement
Développement RMI
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 3
Pourquoi RMI ?
Contexte
Un objet peut demander à un autre objet de faire
un travail (généralement spécialisé)
machine locale machine distante
od
Le problème est que l’objet qui fait le travail n’est
pas localisé sur la même MV. Et peut ne pas être
implémenté en Java.
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 4
Pourquoi RMI ?
Système distribué objet : l’idéal serait de pouvoir
Invoquer une méthode d’un objet distant (od) de la
même manière que s’il était local.
machine locale machine distante
[Link](); od
Demander à un service « dédié » de renvoyer
l’adresse de l’od …
od = [Link]("monObjet");
… sans savoir où l’objet se trouve.
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 5
Pourquoi RMI ?
Système distribué objet : l’idéal serait de pouvoir
Passer un od en paramètre à une méthode (distante
ou locale)
[Link](od);
[Link](od);
Récupérer le résultat d’un appel distant sous forme
d’un nouvel objet qui aurait été créé sur la machine
distante
od = [Link]() ;
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 6
Pourquoi RMI ?
Système distribué objet : la difficulté ?
En local, le programme (client) doit
─ traduire la requête dans un format Mach. Locale Mach. distante
intermédiaire pour la transmission, Client Serveur
─ envoyer les données de la requête au
serveur
Envoi requête
─ analyser la réponse et l’afficher à
l’utilisateur
Retour réponse
A distance, le programme (serveur) doit
─ analyser la requête,
─ évaluer la réponse,
─ formater la réponse pour la transmettre au client
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 7
Pourquoi RMI ?
Solution: proxys
Ajouter des représentants (proxys) pour faire ce travail
Ni le client ni le serveur n’ont à se soucier de l’envoi des
données dans le réseau ni de leur analyse
Machine A Machine B
Client proxy proxy Serveur
Appel proxy Appel méthode
Envoi requête localement
localement
Retour résultat
Retour réponse
Retour résultat
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 8
Pourquoi RMI ?
Comment les proxys communiquent-il ?
Cela dépend de la technologie d’implémentation.
Généralement trois choix :
► CORBA (Common Object Request Brocker Architecture)
► SOAP (Simple Object Access Protocol)
► RMI (Java Remote Method Invocation)
► COM de Microsoft («oublié » au profit de SOAP)
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 9
Pourquoi RMI ?
Comment les proxys communiquent-il ?
CORBA
─ Client et serveur peuvent être écrits en C, C++, Java ou
tout autre langage
─ utilise le protocole IIOP (Internet Inter-ORB Protocol)
pour communiquer entre les objets
─ Interface de description qui spécifie les signatures des
méthodes et les types de données des objets. Un langage
spécial : IDL (Interface Definition Language)
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 10
Pourquoi RMI ?
Comment les proxys communiquent-il ?
SOAP
est aussi neutre vis-à-vis des langages de programmation.
Utilise un format de transmission basé sur XML
L’interface de description est spécifiée dans un langage
spécial : WSDL (Web Services Description Language)
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 11
Pourquoi RMI ?
Comment les proxys communiquent-il ?
RMI est une core API (intégré au JDK 1.1)
100 % Java, gratuit (différent de CORBA)
Une version "orientée objet" de RPC
Permet aux Objets Java Distants de communiquer Mais
sans écrire une seule ligne de code réseau
RMI est suffisant car plus simple.
Lorsque les objets communicants sont implémentés
en Java, la complexité et la généralité de CORBA
ou de SOAP les rendent plus difficile que RMI.
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 12
Pourquoi RMI ?
Comment les proxys communiquent-il ?
RMI
RMI utilise directement les sockets
RMI code ses échanges avec un protocole propriétaire :
RMP (Remote Method Protocol)
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 13
Principe
L’objet client appelle les méthodes de l’objet distant
─ Bien entendu les paramètres doivent être envoyés d’une façon
ou d’une autre à l’autre machine
─ Le serveur doit en être informé pour exécuter la méthode et la
valeur de retour doit être renvoyés.
JVM JVM
Programme client Programme serveur
public class A{ public class B{
RMI prend en void f(){
Method
void m(){
Call
B o; ...
charge ces détails ... }
o.m(); }
...
Network Socket Network Socket
Network
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 14
Principe
La terminologie objet client, objet serveur concerne
un appel distant : Un ordinateur peut être client pour
un appel et serveur pour un autre
JVM JVM
L’objet proxy Programme client Programme serveur
qui se trouve objet OD
sur le client est
appelé stub stub
Représentant Network Socket Network Socket
local de l’OD
Network
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 15
Principe
Le client utilise toujours des variables de type interface
interface Warehouse {
int getQuantity(String description) throws RemoteException;
Product getProduct(Customer cust) throws RemoteException;
Le client n’a pas de connaissance sur le type
d’implémentation
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 16
Principe
A l’appel la variable fait référence au stub
Warehouse centralWarehouse = …
//doit être lié à un objet courant d’un certain type
La syntaxe est la même que pour un appel local
int q = [Link]("Super Cleaner");
Les classes du stub et les objets associés sont créés
automatiquement
La plupart des détails sont cachés au programmeur, mais
un certain nombre de techniques doivent être maitrisées
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 17
Principe
Entités : Client – Serveur– RMI Registry
1. Exposer l’OD via UniCastRemoteObject
2. L’OD doit s’enregistrer auprès du Serveur de Noms
JVM JVM
Programme client Programme serveur
RMI Registry [Link]()
Serveur de 2
Noms OD
Serveur 1
UniCastRemoteObject
stub d’objets
Network Socket Network Socket
Network
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 18
Principe
Entités : Client – Serveur– RMI Registry
3. Demander l’existence de l’OD
4. Récupérer une instance de l’OD
JVM JVM
Programme client Programme serveur
3 RMI Registry
[Link]() Serveur OD
Serveurde
de
noms
noms
4
Serveur
stub d’objets
Network Socket Network Socket
Network
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 19
Principe
Entités : Client – Serveur– RMI Registry
5. Le stub récupère les paramètres de la méthode
6. Le stub emballe les paramètres qu’il envoi au skeleton via
le serveur d’objets
JVM JVM
Programme client Programme serveur
RMI Registry
OD
5 Serveur de
noms
6 Serveur 6
stub d’objets Skeleton
Network Socket Network Socket
Network
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 20
Principe
Entités : Client – Serveur– RMI Registry
7. Le skeleton déballe les infos et fait appel à la méthode de l’OD
8. Il renvoie le résultat après emballage
JVM JVM
Programme client Programme serveur
RMI Registry
OD
Serveur de
8 noms
7
8 Serveur 8
stub d’objets Skeleton
Network Socket Network Socket
Network
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 21
Remote Method Invocation
Interface pour l’objet distant
import [Link].*;
[Link]
public interface Produit extends Remote {
String getDescription() throws RemoteException;
}
Cette interface doit résider sur le client et le serveur
Elle doit étendre “Remote”
Ces méthodes doivent lancer une RemoteException puisque
des problèmes réseau peuvent survenir.
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 22
Remote Method Invocation
Implémentation de l’objet distant
import [Link].*; [Link]
import [Link].*;
public class ProduitImpl extends UnicastRemoteObject
implements Produit{
private String name;
public ProduitImpl(String n) throws RemoteException {
name = n;
}
public String getDescription() throws RemoteException {
return " Je suis " + name + ". Achete moi!";
}
}
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 23
Remote Method Invocation
Génération de la classe stub nécessaire au client
javac [Link]
─ JDK 1.2
• rmic –v1.2 ProductImpl
• Deux fichiers sont générés
Fichier stub
Product_Skel.class
─ JDK 5.0
• Toutes les classes stub sont générées automatiquement
• La classe skeleton n’est plus nécessaire à partir de JDK1.2
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 24
Remote Method Invocation
Les classes RMI
Object
Remote
RemoteObject classe abstraite :
définit uniquement les
mécanismes de base pour
la communication entre
les objets serveur et les
stubs.
RemoteStub RemoteServer
classe concrète :
UnicastRemoteObject Traitements
élémentaires pour
un objet distant.
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 25
Remote Method Invocation
Les classes RMI
─ Il est possible de ne pas étendre UnicastRemoteObject
(héritage multiple par exemple).
─ Dans ce cas, il faut :
instancier manuellement les objets serveur et les
passer à la méthode statique exportObject()
Dans le constructeur de l’objet serveur par exemple :
[Link](this,0);
(0 pour indiquer que n’importes quel port peut
être utilisé pour écouter les connexions client)
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 26
Remote Method Invocation
Le programme serveur
import [Link].*; [Link]
import [Link].*;
public class ProduitServer {
public static void main(String args[]) {
[Link]("Construction des implémentations");
ProduitImpl ref1 = new ProduitImpl("Sony 40p");
ProduitImpl ref2 = new ProduitImpl("ZapXpress Microwave");
Le serveur crée les objets distants
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 27
Remote Method Invocation
Le programme serveur
[Link]
[Link]("Binding implementations to registry");
[Link]("television", ref1);
[Link]("microwave", ref2);
[Link]("Enregistrement effectué attente de
clients...");
Le serveur enregistre les objets auprès du serveur de noms
en donnant un nom unique et une reference à chaque objet.
rebind() à la place de bind() pour éviter l’erreur
AlreadyBoundException lorsque l’entrée existe déjà
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 28
Remote Method Invocation
Le programme serveur
API [Link] 1.1
static void bind(String name, Remote obj)
binds name to the remote object obj. Throws a AlreadyBoundException if the
object is already bound.
static void unbind(String name)
unbinds the name. Throws a NotBoundException if the name is not currently
bound.
static void rebind(String name, Remote obj)
binds name to the remote object obj. replaces an existing binding.
static String[] list(String url)
returns an array of strings of the URLs in the registry located at the given URL.
The array contains a snapshot of the names present in the registry.
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 29
Remote Method Invocation
Le programme serveur
Le registre de noms RMI doit s'exécuter avant de pouvoir
enregistrer un objet ou obtenir une référence.
Le registre de noms RMI peut être lancé :
─ par rmiregistry
─ Ou dynamiquement dans la classe qui enregistre l'objet.
[Link](1099);
[Link](url, od);
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 30
Remote Method Invocation
Lancer le serveur
─ L’objet UnicastRemoteObject réside sur le serveur. Il doit
être actif lorsqu’un service est demandé et doit être
joignable à travers le protocole TCP/IP
─ Où est donc l’attente ?
En fait nous créons des objets d’une classe qui étend
UnicastRemoteObject, un thread séparé est alors
lancé, il garde le programme indéfiniment en vie .
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 31
Passage de paramètres
Une référence à un od peut être passée en argument
ou retournée en résultat d’un appel dans toutes les
invocations (locales ou distantes)
Les arguments locaux et les résultats d’une invocation
distante sont toujours passés par copie et non par
référence
leurs classes doivent implémenter [Link]
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 32
Chargement dynamique de classes
Si jamais le type n’est pas disponible localement, il est
chargé dynamiquement.
C’est [Link] (un chargeur de
classes spécial RMI) qui s’en charge.
Le processus est le même que pour les applets qui
s’exécutent dans un navigateur
A chaque fois qu’un programme charge du code à partir
d’une autre machine sur le réseau, le problème de la
sécurité se pose.
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 33
Sécurité
Il faut donc utiliser un gestionnaire de sécurité
dans les applications clientes RMI.
Le comportement par défaut lors de l'exécution d'une
application Java est qu’aucun gestionnaire de
sécurité n’est installé.
Le gestionnaire de sécurité par défaut pour RMI est
[Link]
[Link](RMISecurityManager)
Les Applets, elles, installent un gestionnaire de
sécurité assez restrictif : AppletSecurityManager
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 34
Sécurité
Pour des applications spécialisées, les programmeurs
peuvent utiliser leur propre « ClassLoader » et «
SecurityManager » mais pour un usage normal, ceux
fournis par RMI suffisent.
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 35
Remote Method Invocation
Le programme client
import [Link].*; [Link]
public class ProduitClient {
public static void main(String args[]) {
[Link]( new RMISecurityManager());
Par défaut, RMISecurityManager empêche tout le code dans
le programme d'établir des connexions réseau.
Mais ce programme a besoin de connexions réseau :
• Pour atteindre le "RMI Registry"
• Pour contacter les "objets serveur"
• Lorsque le client est déployé, il a aussi besoin de permissions
pour charger ces classes de stub.
Donc, Java exige que nous écrivons un "policy file”
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 36
Remote Method Invocation
Policy File : « [Link] »
grant
{ permission [Link]
"*:1024-65535", "connect";
};
Autorise l’application à faire des connections réseau sur un
port supérieur à 1024. (Le port RMI est 1099 par défaut)
A l’exécution du client, on doit fixer une propriété système :
javac [Link]
java –[Link]=[Link] ProduitClient
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 37
Remote Method Invocation
Le programme client
[Link]
String url = "rmi://localhost/";
//stub
Produit c1 = (Produit)[Link](url + "television");
Produit c2 = (Produit)[Link](url + "microwave");
[Link]([Link]());
[Link]([Link]());
Le serveur de noms fournit la méthode statique lookup(url) pour
localiser un objet serveur. L’URL RMI : "rmi://serveur:[port]/objet"
c1 et c2 ne font pas référence à des objets sur le serveur. Ils font
plutôt référence à un stub qui doit exister sur le client
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 38
Remote Method Invocation
Récapitulatif des activités
1. Compiler les fichiers java
javac *.java
2. Avant JDK1.5: générer les stub
rmic –v1.2 ProduitImpl
3. Lancer le RMI registry (serveur de nom)
start rmiregistry
4. Lancer le serveur
start java ProduitServer
5. Exécuter le client
java –[Link]=[Link] ProduitClient
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 39
Remote Method Invocation
Fichiers en jeu
Machine A Machine B
JVM1 Client JVM2 Serveur
copie
[Link] [Link]
OD [Link]
copie
ProduitImpl_Stub.class ProduitImpl_Stub.class
[Link] [Link]
Network
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 40
Remote Method Invocation
Déploiement
─ Préparer le déploiement (JDK1.5)
─ Trois dossiers
server/
[Link]
[Link]
[Link]
client/
[Link]
[Link]
[Link]
download/
[Link]
download contient les classes utilisées par
RMI registry, le client et le serveur.
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 41
M.3.3: Génie Logiciel Objet
M.3.3.2
Programmation Objet Avancée
M3.3.2 POA Leçon n°4: RMI et objets distribués Pr. A. El FAKER - 2015 43