Upload
ngotruc
View
233
Download
0
Embed Size (px)
Citation preview
1
2A-SI - Réseaux :Programmation par RPC et JavaRMI
Stéphane Vialle
[email protected]://www.metz.supelec.fr/~vialle
Programmation par RPCet Java-RMI :
- Principes des RPC- Utilisation d’un IDL- Principes des Java-RMI- Mode opératoire des Java-RMI- Hiérarchie de classes Java- Exemple de client-serveur en Java-RMI- RMI entre plusieurs serveurs
2
Programmation par RPC et Java-RMI
Principes des RPC
• 1ère version : Birrel & Nelson en 1984– L’utilisateur écrit toute l’application : le client, le serveur et
les mécanismes d’envoi et de réception de messages !!– Concepts simples, mais complexes à mettre en œuvre→ Peu utilisé
• SUN RPC en 1988– Plus simple, – Utilise « rpcgen » : génère une partie des fichiers de RPC– Utilise le DNS (localisation du serveur : adresse IP) +
Portmap (localisation du service : # port)
RPC = « Remote Procedure Call »Objectif : appels locaux et distants avec la même syntaxe
Programmation par RPC et Java-RMI
Principes des RPC
Service RPC(talon)
appel
Service RPC(talon)
retour
Protocole decommunication
Protocole decommunication
Appelé
retour
1
5
2
4
3RéseauAppel
Serveur (appelé)Client (appelant)
3
Programmation par RPC et Java-RMI
Principes des RPC
Talon client : stub• C’est la procédure
d’interface du site clientqui reçoit l’appel en mode localle transforme en appel distant en envoyant un messagereçoit les résultats après l'exécutionretourne les paramètres résultats comme dans un retour de procédure
Talon serveur : skeleton
• C’est la procédure sur le site serveur
qui reçoit l’appel sous forme de messagefait réaliser l’exécution sur le site serveur par la procédure serveur (choix de la procédure)retransmet les résultats par message
Programmation par RPCet Java-RMI :
- Principes des RPC- Utilisation d’un IDL- Principes des Java-RMI- Mode opératoire des Java-RMI- Hiérarchie de classes Java- Exemple de client-serveur en Java-RMI- RMI entre plusieurs serveurs
4
• Un langage pour la spécification des interfaces entre les clients et les serveurs :– Spécification commune au client et au serveur
• Le « contrat » entre le client et le serveur – Définition des types et natures des paramètres
• IN, OUT, IN-OUT, par valeur, par référence– Définition indépendante de la plate-forme
• Indépendante du langage, de l’OS et de la machine
• Utilisation de ces définitions pour générer automatiquement :– Le talon client (ou proxy, ou stub)– Le talon serveur (ou squelette, ou skeleton)
• « projection » dans un langage de programmation
Programmation par RPC et Java-RMI
Utilisation d’un IDL
Programmation par RPC et Java-RMI
Utilisation d’un IDL
Compilateur IDL
Interfaceécrite en « IDL »
Talon coté client(Stub)
Talon coté Serveur(Skeleton)
Client Serveur
Protocole decommunication
Protocole decommunicationRéseau
5
Programmation par RPCet Java-RMI :
- Principes des RPC- Utilisation d’un IDL- Principes des Java-RMI- Mode opératoire des Java-RMI- Hiérarchie de classes Java- Exemple de client-serveur en Java-RMI- RMI entre plusieurs serveurs
Programmation par RPC et Java-RMI
Principes des Java-RMI• Un RPC objet intégré à Java
• Interaction d'objets situés dans des espaces d'adressage différents sur des machines distinctes
• Simple à mettre en œuvre : un objet distribué se manipule comme tout autre objet Java
• Différences RPC/RMI :– Il existe un module de localisation sur le host-serveur distant
(la rmiregistry) : localisation de chaque objet-serveur.– Les RMI sont plus vulnérables aux pannes: impossible de
distinguer le cas de panne du serveur d’un problème réseau (moins de détails dans les CR d’erreurs).
• Les interfaces (contrats) sont des interfaces Java→ L’IDL est Java lui-même
6
Programmation par RPC et Java-RMI
Principes des Java-RMI
méthode_1()
méthode_n()
état
objet serveurobjet client
appel
Système de communication
Talonserveur
Talonclient
référence
Référence d'objet + méthode + arguments
Résultat ou exception
• désignation• envoi de requêtes• exécution de requête• retour de résultat
Programmation par RPCet Java-RMI :
- Principes des RPC- Utilisation d’un IDL- Principes des Java-RMI- Mode opératoire des Java-RMI- Hiérarchie de classes Java- Exemple de client-serveur en Java-RMI- RMI entre plusieurs serveurs
7
0 - A la création de l’objet-serveur, un stub et un skeleton (avec un port de communication) sont créés sur le host-serveur
1 - L'objet-serveur s'enregistre auprès du Naming de sa JVM (méthode rebind)
2 - Le Naming enregistre le stub de l’objet (sérialisé) auprès du serveur de noms (rmiregistry)
3 - Le serveur de noms est prêt à fournir des références sur l’objet-serveur
JVM Client JVM Serveur
ClientClientClient
SkeletonSkeletonSkeleton
ServeurServeurServeur
NamingNamingNaming
stubstubstub
rmiregistryrmiregistryrmiregistry
stubstubstub
Programmation par RPC et Java-RMI
Mode opératoire des Java-RMI
4 - L'objet client fait appel à son Naming pour localiser l'objet-serveur sur l’host-serveur (méthode lookup)
5 - Le Naming récupère le stub vers l'objet-serveur auprès de la rmiregistry
6 – Le naming installe l’objet Stub sur le poste client et retourne sa référence au client
7 - Le client effectue l'appel à l’objet serveur par appel à l’objet local Stub
JVM Client JVM Serveur
NamingNamingNaming
ClientClientClient
StubStubStubSkeletonSkeletonSkeleton
ServeurServeurServeur
NamingNamingNaming
Programmation par RPC et Java-RMI
Mode opératoire des Java-RMI
rmiregistryrmiregistryrmiregistry
stubstubstub
8
Programmation par RPC et Java-RMI
Mode opératoire des Java-RMI
1. Codage– description de l’interface du service– écriture du code du serveur qui implante l’interface– écriture du client qui appelle le serveur
2. Compilation– génération des stub et skeleton (rmic)– compilation des sources (javac)
3. Activation– lancement du serveur de noms (rmiregistry)– lancement du serveur– lancement du client
Etapes du développement et déploiement :
Programmation par RPC et Java-RMI
Mode opératoire des Java-RMI
2.1 - rmic Server Server_Stub.classServer_Skel.class
Server.class(2.2 - javac Server.java)
Client.class2.3 - javac Client.java
3.1 – rmiregistry
3.2 – java Server3.3 – java Client
Client.java
Server.java
1 – programmation: Interfacejava
Etapes du développement et déploiement :
9
Programmation par RPCet Java-RMI :
- Principes des RPC- Utilisation d’un IDL- Principes des Java-RMI- Mode opératoire des Java-RMI- Hiérarchie de classes Java- Exemple de client-serveur en Java-RMI- RMI entre plusieurs serveurs
Programmation par RPC et Java-RMI
Hiérarchie de classes Java
Interface :RemoteObject
Interface :RemoteServer
Classe :UnicastRemoteObject
Interface :Activatable
Interface :RemoteStubs
Interface :ActivationGroup_Stub
Stubs/SkeletonsServeurs
10
Programmation par RPC et Java-RMI
Hiérarchie de classes JavaInterface :
RemoteObject
Interface :RemoteServer
Classe :UnicastRemoteObject
Interface :Activatable
Interface :RemoteStubs
Interface :ActivationGroup_Stub
• Serveurs démarrés explicitement• Objet/Service ayant la durée devie du processus serveur
• Pour des comm. P2P entre processus actifs
• Utilise des comm. TCP
Public class MyServerRmiextends UnicastRemoteObjectImplements MyInterfaceRmi {
…}
Programmation par RPC et Java-RMI
Hiérarchie de classes Java
Interface :RemoteObject
Interface :RemoteServer
Classe :UnicastRemoteObject
Interface :Activatable
Interface :RemoteStubs
Interface :ActivationGroup_Stub
• Serveurs démarrables par lesystème
• Objet/Service persistant (non liésà la durée de vie d’un processus)
• Les constructeurs proposentde définir un port sur lequelsera exporté le service.Sinon un port quelconquesera choisi.
11
Programmation par RPC et Java-RMI
Hiérarchie de classes Java
Interface :RemoteObject
Interface :RemoteServer
Classe :UnicastRemoteObject
Interface :Activatable
Interface :RemoteStubs
Interface :ActivationGroup_Stub
• Interfaces à destination des classes « stubs » et « skeletons »(les tallons client et serveur générés par rmic)
• Gérées par le mécanisme des Java-RMI
Programmation par RPCet Java-RMI :
- Principes des RPC- Utilisation d’un IDL- Principes des Java-RMI- Mode opératoire des Java-RMI- Hiérarchie de classes Java- Exemple de client-serveur en Java-RMI- RMI entre plusieurs serveurs
12
Programmation par RPC et Java-RMI
Ex. client–serveur en Java-RMI
• Les objets locaux passés en paramètres doivent être (juste) « serializable »
– Dans la majorité des cas il suffit d’ajouter :« extends Serializable » dans l’interface de leur classe« implements Serializable » dans la définition de leur classe
– Rien à faire pour les objets de base (int, double, …)
– Les objets difficiles à « serialiser » sont les threads … éviter de passer des threads en paramètres d’appel RMI !
Règles d’écriture des RMI :
Programmation par RPC et Java-RMI
Ex. client–serveur en Java-RMI
• Les objets distants ont plus de contraintes :– L’interface distante doit être publique– L’interface distante doit étendre l’interface java.rmi.Remote
– La classe distante hérite (généralement) de java.rmi.server.UnicastRemoteObject …
… qui implémente java.rmi.Remote (parfait!)
– Chaque méthode distante doit déclarer au moins l’exception java.rmi.RemoteException
• Les objets distants doivent être déclarés par une référencesur leur interface (uniquement).
Règles d’écriture des RMI :
13
Programmation par RPC et Java-RMI
Ex. client–serveur en Java-RMI
// l'interface à exporter (deux services définis)
public interface CalculRmi extends java.rmi.Remote {
public int plus(int un, int deux)throws java.rmi.RemoteException;
public int mult(int un, int deux)throws java.rmi.RemoteException;
}
Cas simple : • Le client connaît le nom du serveur (« TheServer »)• La rmiregistry est lancée sur le serveur• Le client passe des arguments « de base » (int)
« TheServer »
Client JavaServeur Java
rmiregistry
Programmation par RPC et Java-RMI
Ex. client–serveur en Java-RMI// Client utilisant des services d’un objet-serveur distantimport java.rmi.*;
public class ClientRmi {
static public void main(String arg[]){int i1, i2, res;String NomHostServeur, NomObjServeur;CalculRmi ObjServeur;// Parse la ligne de commandeNomHostServeur = arg[0]; NomObjServeur = arg[1];i1 = Integer.parseInt(arg[2]); i2 = Integer.parseInt(arg[3]);
try {// Recherche de l’objet-serveur distant dans la rmiregistryObjServeur = (CalculRmi) Naming.lookup(
"rmi://" + NomHostServeur + "/" + NomObjServeur);// Usage du service distant trouvéres = ObjServeur.plus(i1, i2);
} catch (Exception e){System.out.println("Erreur RMI " + e.getMessage());System.exit(1);
}
System.out.println("Résultat appel RMI: " + res);}
}
14
Programmation par RPC et Java-RMI
Ex. client–serveur en Java-RMI// Objet-Serveur RMI (debut)import java.util.*;import java.rmi.*;import java.rmi.server.*;public class ObjServeurRmi extendsUnicastRemoteObjectimplements CalculRmi {private String nomObjServeur;public ObjServeurRmi(String s) throws RemoteException { super();
nomObjServeur = s;}public String getNomObjServeur() {
return nomObjServeur;}
Programmation par RPC et Java-RMI
Ex. client–serveur en Java-RMI// Objet-Serveur RMI (fin)
// Fonction main : pour le lancement du serveurstatic public void main(String arg[]) {
System.setSecurityManager(new RMISecurityManager());
try {ServeurRmi srmi = new ObjServeurRmi("Calculateur");Naming.rebind("//localhost/Calculateur", srmi);System.out.println("Enregistrement objet-serv OK");
} catch (Exception e) {System.out.println("Pb enregistrement service: " +
e.getMessage());System.exit(1);
}}}
15
Programmation par RPCet Java-RMI :
- Principes des RPC- Utilisation d’un IDL- Principes des Java-RMI- Mode opératoire des Java-RMI- Hiérarchie de classes Java- Exemple de client-serveur en Java-RMI- RMI entre plusieurs serveurs
Programmation par RPC et Java-RMI
Mode opératoire des Java-RMI
rmiregistry
Client
…Res = Server.service(ObjLoc)…
ObjLoc
Stub Server
Skeleton Server
ObjLoc-copie par valeurObjets locaux :- passés par valeurs- doivent être serializable
Objets distants :- passés par « références » : stubs
ObjServeur
Déploiement simple entre deux machines distantes :
serveur
16
Programmation par RPC et Java-RMI
Mode opératoire des Java-RMI
Passage d’objets locaux :- passés par valeurs- doivent être serializable
Passage d’objets distants :- Nécessitent l’invocation dynamique de classes …
Déploiement complexe entre N machines : ➔ invocation dynamique de classe
rmiregistry
Client
…Res = Server.service(ObjLoc, « IdObjAndClassDistants »)…
ObjDist
ObjLoc
Skeleton ObjDistStub ObjDistStub Server
Skeleton Server
Stub ObjDistObjLoc-copie par valeur
ObjServeur
serveur
Invoc. Dyna
Programmation par RPCet Java-RMI
FIN