16
1 2A-SI - Réseaux : Programmation par RPC et JavaRMI Stéphane Vialle [email protected] http://www.metz.supelec.fr/~vialle Programmation par RPC et 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-RMIkhalid.najeddine.free.fr/.../RPC-RMI.pdf · 2 Programmation par RPC et Java-RMI Principes des RPC • 1ère version : Birrel & Nelson en 1984 –

  • Upload
    ngotruc

  • View
    233

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programmation par RPC et Java-RMIkhalid.najeddine.free.fr/.../RPC-RMI.pdf · 2 Programmation par RPC et Java-RMI Principes des RPC • 1ère version : Birrel & Nelson en 1984 –

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

Page 2: Programmation par RPC et Java-RMIkhalid.najeddine.free.fr/.../RPC-RMI.pdf · 2 Programmation par RPC et Java-RMI Principes des RPC • 1ère version : Birrel & Nelson en 1984 –

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)

Page 3: Programmation par RPC et Java-RMIkhalid.najeddine.free.fr/.../RPC-RMI.pdf · 2 Programmation par RPC et Java-RMI Principes des RPC • 1ère version : Birrel & Nelson en 1984 –

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

Page 4: Programmation par RPC et Java-RMIkhalid.najeddine.free.fr/.../RPC-RMI.pdf · 2 Programmation par RPC et Java-RMI Principes des RPC • 1ère version : Birrel & Nelson en 1984 –

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

Page 5: Programmation par RPC et Java-RMIkhalid.najeddine.free.fr/.../RPC-RMI.pdf · 2 Programmation par RPC et Java-RMI Principes des RPC • 1ère version : Birrel & Nelson en 1984 –

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

Page 6: Programmation par RPC et Java-RMIkhalid.najeddine.free.fr/.../RPC-RMI.pdf · 2 Programmation par RPC et Java-RMI Principes des RPC • 1ère version : Birrel & Nelson en 1984 –

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

Page 7: Programmation par RPC et Java-RMIkhalid.najeddine.free.fr/.../RPC-RMI.pdf · 2 Programmation par RPC et Java-RMI Principes des RPC • 1ère version : Birrel & Nelson en 1984 –

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

Page 8: Programmation par RPC et Java-RMIkhalid.najeddine.free.fr/.../RPC-RMI.pdf · 2 Programmation par RPC et Java-RMI Principes des RPC • 1ère version : Birrel & Nelson en 1984 –

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 :

Page 9: Programmation par RPC et Java-RMIkhalid.najeddine.free.fr/.../RPC-RMI.pdf · 2 Programmation par RPC et Java-RMI Principes des RPC • 1ère version : Birrel & Nelson en 1984 –

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

Page 10: Programmation par RPC et Java-RMIkhalid.najeddine.free.fr/.../RPC-RMI.pdf · 2 Programmation par RPC et Java-RMI Principes des RPC • 1ère version : Birrel & Nelson en 1984 –

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.

Page 11: Programmation par RPC et Java-RMIkhalid.najeddine.free.fr/.../RPC-RMI.pdf · 2 Programmation par RPC et Java-RMI Principes des RPC • 1ère version : Birrel & Nelson en 1984 –

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

Page 12: Programmation par RPC et Java-RMIkhalid.najeddine.free.fr/.../RPC-RMI.pdf · 2 Programmation par RPC et Java-RMI Principes des RPC • 1ère version : Birrel & Nelson en 1984 –

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 :

Page 13: Programmation par RPC et Java-RMIkhalid.najeddine.free.fr/.../RPC-RMI.pdf · 2 Programmation par RPC et Java-RMI Principes des RPC • 1ère version : Birrel & Nelson en 1984 –

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);}

}

Page 14: Programmation par RPC et Java-RMIkhalid.najeddine.free.fr/.../RPC-RMI.pdf · 2 Programmation par RPC et Java-RMI Principes des RPC • 1ère version : Birrel & Nelson en 1984 –

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);

}}}

Page 15: Programmation par RPC et Java-RMIkhalid.najeddine.free.fr/.../RPC-RMI.pdf · 2 Programmation par RPC et Java-RMI Principes des RPC • 1ère version : Birrel & Nelson en 1984 –

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

Page 16: Programmation par RPC et Java-RMIkhalid.najeddine.free.fr/.../RPC-RMI.pdf · 2 Programmation par RPC et Java-RMI Principes des RPC • 1ère version : Birrel & Nelson en 1984 –

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