systèmes et applications distribués intergiciels et...

64
L’appel procédural à distance L’appel de méthode à distance Troisième partie Appel de procédure et de méthode à distance Intergiciels et applications communicantes 1 / 64

Upload: vannhan

Post on 10-Sep-2018

215 views

Category:

Documents


0 download

TRANSCRIPT

L’appel procédural à distanceL’appel de méthode à distance

Troisième partie

Appel de procédure et de méthode àdistance

Intergiciels et applications communicantes 1 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Plan

1 L’appel procédural à distanceIntroductionTransparence

SémantiquesParamètresDésignation et liaison

Mise en œuvre2 L’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Exemple basiqueExemple : callback

III – Appel à distance 2 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Communication par appel procédural à distance

Extension répartie du mécanisme d’appel procéduralProcédure appelée exécutée dans un espace différent de celuide l’appelantSynchronisation appelant-appeléTransaction de messages

(question - réponse - [acquittement])Fiabilité bien moindre qu’en centraliséComment transmettre les paramètres ?Problème de l’hétérogénéité

du matérieldu système d’exploitationde la représentation des données (paramètres)des langages de programmation

III – Appel à distance 3 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Communication par appel procédural à distancealias Remote Procedure Call (RPC)

Pile

proc

Processus

Machine hôte

Pile

Proxyd’appel

Processus client

Pile

Processus serveur

proc

Requêted’appel

Réponse résultat

Machine cliente Machine serveur

III – Appel à distance 4 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Transparence

But : rendre l’utilisation de l’appel à distance aussi conforme(transparent) que l’appel local de procédure

passage des paramètresliaison (nommage)protocole de transportexceptionssémantique de l’appelreprésentation des donnéesperformancesécurité

III – Appel à distance 5 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Principe général

III – Appel à distance 6 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Sémantique de l’appel procédural à distanceQuelques problèmes. . .

Proc(a,7,...)

Proc(x,y,...)

Perte dumessagerésultat

Délai de garde ! Echec

Plusieurs sémantiques possibles !« Sans garantie » (May-be)« Au moins une fois » (At-least-once)« Au plus un fois » (At-most-once)« Exactement une fois » (Exactly-once).

III – Appel à distance 7 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Sémantique de l’appel procédural à distanceSémantique minimaliste : « Sans garantie »

Proc(a,7,...)

Proc(x,y,...)

Appel sans réponse

Requête

Avantages et inconvénientsSimple à implanter : envoyer un messagePas de réponse donc pas de garantie d’exécutionUtile dans certains cas (logging)

III – Appel à distance 8 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Sémantique de l’appel procédural à distanceSémantique « Au moins une fois »

Proc(a,7,...)

Proc(x,y,...)

Perte dumessagerésultat

Délai de garde ! Rappel

Requêteinitiale

Requêtedupliquée

Proc(x,y,...)

MessageRésultat

Fin de l’appelDébut de l’appel

Avantages et inconvénientsRobuste face aux pertes et lenteursSi terminaison correcte → garantie d’une exécution au moinsSi terminaison incorrecte (après plusieurs « rappels »), pas degarantie sur ce qui s’est passé « à distance »Risque de plusieurs exécutions pour un seul appel logique

III – Appel à distance 9 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Sémantique de l’appel procédural à distanceSémantique « Au plus un fois »

Proc(a,7,...)

Proc(x,y,...)

Perte dumessagerésultat

Délai de garde ! Rappel

Requêteinitiale

Requêtedupliquée Message

Résultat

Fin de l’appelDébut de l’appel

Détecter que l’appel a déjà été satisfait

Avantages et inconvénientsPlus proche de l’appel procédural centraliséSi terminaison correcte ⇒ garantie d’une seule exécution àdistanceSi terminaison incorrecte, pas de garantie sur ce qui s’estpassé « à distance » ⇒ entre autre, risque d’exécutionpartielle à distance

III – Appel à distance 10 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Sémantique de l’appel procédural à distanceSémantique « Exactement une fois »

Proc(a,7,...)

Proc(x,y,...)

Requêteinitiale

Perte d’une requêtedupliquée

Fin de l’appel surdélai de garde !nalDébut de l’appel

Arrêt surdéfaillance

Risque d’exécution partielle de

Avantages et inconvénientsSi terminaison correcte ⇒≡ à « au + une fois »Si terminaison incorrecte ⇒ garantie d’atomicité à distance

III – Appel à distance 11 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Espace d’adressage séparés

+ Isolation des données du serveurSécuritéConception modulaire

− Passage des paramètres au moyen de messagespas de variables globales implicitespassage par valeur (copie)Références ?

Interdire le passage de références ⇒ expressivité faibleSérialisation : transfert et reconstruction du graphe (structurede données)Références globales opaques (objets répartis)

III – Appel à distance 12 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Représentation des donnéesProblèmes

hétérogénéité du matérielordre des octets pour les entierstaille des types élémentaires (booléen, entier. . . )nombres réelscodage des caractèresdonnées composites : structures, tableaux

Approchesdéfinir une représentation standard

typage implicite : seules les valeurs sont transmisestypage explicite : information de type + valeur

préfixer par le type local, et laisser le destinataire convertir sinécessaire

III – Appel à distance 13 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Désignation et liaisonCorrespondance : nom symbolique (externe) → nom interne(adresse réseau,identifiant)Cas des RPC :

nom de service ↔ port et adresse serveurnom d’opération ↔ procédure sur le serveur correspondant

Instant(s) d’évaluation de la liaisonLiaison statique (précoce) : localisation du serveur fixée aumoment de la compilation du programme clientLiaison dynamique (tardive) : localisation à l’exécution

désignation symbolique des servicesimplémentation ou sélection retardéelocalisation du service au premier appel seulement, ou àchaque appeladaptation à une reconfiguration du système : régulation,pannes, évolutions

III – Appel à distance 14 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Liaison dynamique : serveur de noms

1,2 : Enregistrement du servicedans l’annuaire sous :〈nom〉 → 〈adr. serv., no port〉

3,4,5 : Consultation del’annuaire pour trouver 〈adr.serv., no port〉 à partir de〈nom〉

L’appel peut alors avoir lieuTolérance aux pannes (service critique) : mémoire stable,duplication des tables, des serveursLocalisation du serveur de noms par le client :

diffusion de la requête par le clientou variable de configuration du systèmeou utilisation d’une adresse conventionnelle

III – Appel à distance 15 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Serveurs de noms local à un site : portmapperCas où le site hébergeant le service est connu, mais où le portcorrespondant au service n’est pas connu ⇒ utiliser un service denommage local au serveur, le portmapper.

Le portmapper a un numéro de port fixé par convention (111)Un service enregistre le numéro de port de son veilleur auprèsdu portmapperLe veilleur se met en attente sur ce port

III – Appel à distance 16 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Mise en œuvre

Définition d’un protocole de transaction de messagesSérialisation/Désérialisation des paramètresGénération de talon d’appel (stub) et d’acceptation (skeleton)Assistance par génération automatique de code

Langage de description d’interface (IDL)III – Appel à distance 17 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Mise en œuvreNiveaux de protocole

Protocolede transactionde messagesX = talon_proc(A,1,B) {

ma = new Message(); ma.entete(S,C,np); ma.sérialiser(A,1,B) ; Trans.appel_envoyer(ma);

Trans.réponse_recevoir(mres); return mres.désérialiser();}

Talon d'appel

Trans.accepter(ma,mr) { Message.identifier(ma,S,C,np); Message.désérialiser(ma,X,Y,Z); R = S.proc[np](X,Y,Z); mr=new Message(); mr.entete(C); mr.serialiser(R); return mr ;}

Skelette d'acceptation

III – Appel à distance 18 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Description d’interface en IDLExemple minimaliste (SUN)

Les langages IDL (Interface Definition Language)Langage commun de description d’interfacePurement déclaratif : types de données, interfacesBase pour la génération des talons et squelettes

struct Arg ... ;program MS {

version MSV {int PROC (Arg) = 1 ;

} = 1 ;} = 0x30000050 ;

III – Appel à distance 19 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

eXternal Data Representation

Description et codage des données indépendantes du matérielStructures de données arbitraires (structures, tableaux,séquences)RPC convertit les données machine en XDR avant de lesenvoyer sur le réseau (sérialisation)RPC convertit les données XDR en données machine aprèslecture sur le réseau (désérialisation)Génération automatique des routines de sérialisation et dedésérialisation à partir d’une description proche du langage Cou codage manuel de ces routines à partir d’une librairie pourles types élémentaires

III – Appel à distance 20 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Programmation par appel explicite

enum clnt_stat rpc_call (const char *host, u_long prognum,u_long versnum, u_long procnum,xdrproc_t inproc, char *in, xdrproc_t outproc, char *out,const char *nettype);

Appel d’une procédure 〈prognum, versnum, procnum〉 sur lamachine host. La procédure reçoit en paramètre in codé avecinproc et retourne out décodé avec outproc.bool_t rpc_reg (u_long prognum, u_long versnum, u_long procnum,

char * (*procname) (char *arg),xdrproc_t inproc, xdrproc_t outproc,const char *nettype);

Enregistrement de la procédure procname sous le nom〈prognum, versnum, procnum〉. Le paramètre est décodé avecinproc et le résultat est encodé avec outproc.

III – Appel à distance 21 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Appel explicite : client

#include <stdio.h>#include <rpc/rpc.h>#include <netconfig.h>int main(){

enum clnt stat stat ;int result ;char *argin = "546" ;stat = rpc call (/*host*/ "mozart",

/*prognum*/ 87654321, /*versnum*/ 1, /*procnum*/ 12,/*inproc*/ xdr string,/*in*/ (char*) &argin,/*outproc*/ xdr int,/*out*/ (char*) &result,/*nettype*/ NULL) ;

if (stat != RPC SUCCESS) { fprintf (stderr, "Call failed: ") ; /*. . .*/ }printf ("Call succeeded: \"%s\" = %d\n", argin, result) ;

}

III – Appel à distance 22 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Appel explicite : serveur#include <rpc/rpc.h>#include <stdlib.h>int resultat ;char *maproc (char *argin){

char *argument = *(char**)argin ;resultat = atoi(argument) ;return (char*) &resultat ;

}int main(){

bool t stat ;stat = rpc reg (/*prognum*/ 87654321, /*versnum*/ 1, /*procnum*/ 12,

/*procname*/ maproc,/*inproc*/ xdr string, /*outproc*/ xdr int,/*nettype*/ NULL) ;

if (stat != 0) { fprintf (stderr, "Registering failed\n") ; /* . . . */ }svc run() ; /* veilleur/aiguilleur */

}III – Appel à distance 23 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

Génération automatique : rpcgen

À partir d’une description des types et d’une déclaration desprocédures, RPCGEN engendre :

les routines XDR pour convertir les types de donnéesle talon client masquant l’appel à distancele talon serveur gérant l’appella procédure principale (main) et la procédure de sélection(dispatch) pour le serveur

Le programmeur doit :décrire les types de données échangéesécrire la programme principal clientécrire le code des procédures coté serveur

III – Appel à distance 24 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

RPCGEN : exempleUn programme (fichier prog.c) appelle deux procédures distantes(implantées dans rproc.c, décrites dans rpspec.x) d’un serveur

prog

prog.c rpspec.x rproc.c

rproc_svc

cc cc

RPCGEN

rpc lib

rpspec_clnt.c

rpspec.h rpspec_xdr.c

rpspec_svc.c

space

$ rpcgen rpspec.x$ cc -o server rproc.c rpspec_svc.c rpspec_xdr.c -lnsl$ cc -o client prog.c rpspec_clnt.c rpspec_xdr.c -lnsl

III – Appel à distance 25 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

RPCGEN : Fichier d’interfacerpspec.x contient :

les noms, et les numéros de programme, de version et deprocédures, des procédures distantesles types de données manipulés

/* rpspec.x */struct arga {

int arga1 ;int arga2 ;

} ;

program MONPROG {version MAVERS {

long RPROCA (arga) = 1 ; /* proc #1 */arga RPROCB (void) = 2 ; /* proc #2 */

} = 1 ; /* version #1 */} = 0x1234567 ; /* prog num */

III – Appel à distance 26 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

RPCGEN : client#include <rpc/rpc.h>#include "rpspec.h"main(){

CLIENT *cl ;struct arga val1 ;long *res1 ;struct arga *res2 ;. . ./* Mise en place du lien. server est le nom de la machine distante. */cl = clnt create (server, MONPROG, MAVERS, NULL) ;if (cl == NULL) { clnt pcreateerror (server) ; exit(1) ; }. . .res1 = rproca 1 (&val1, cl) ; /* appel de rproca version 1 */if (res1 == NULL) { clnt perror (clnt, server) ; exit (1) ; }. . .res2 = rprocb 1 (NULL, cl) ; /* appel de rprocb version 1 */. . .clnt destroy (cl) ; /* fin du lien */

}III – Appel à distance 27 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

RPCGEN : serveur#include "rpspec.h"

/* Implantation de RPROCA version 1 *//* Passage par pointeur du paramètre et du retour *//* req contient des informations de contexte */long *rproca 1 svc (struct arga *a, struct svc req *req){

static long res ;res = (a−>arga1) + (a−>arga2) ;return &res ;

}

/* Implantation de RPROCB version 1 */struct arga *rprocb 1 svc (void *unused, struct svc req *req){

. . .}

III – Appel à distance 28 / 64

L’appel procédural à distanceL’appel de méthode à distance

IntroductionTransparenceMise en œuvre

rpc : bilan

ApportsTransparence partielle (désignation, localisation)Modèle de programmation classique (appel procédural ↔interaction C/S )Conception modulaireOutils de génération automatique des talons

LimitationsDéveloppement traditionnel monolithiqueConstruction et déploiement statiqueStructure d’exécution asymétrique, centralisée sur le serveurPeu de services extra-fonctionnels : supervision, équilibrage decharge, tolérance aux pannes, données rémanentes...

III – Appel à distance 29 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Plan

1 L’appel procédural à distanceIntroductionTransparence

SémantiquesParamètresDésignation et liaison

Mise en œuvre2 L’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Exemple basiqueExemple : callback

III – Appel à distance 30 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

L’appel de méthode centralisé

Principe et propriétésUn seul espaced’exécutionPoint de contrôle uniqueFort couplageFiabilitéSécurité

A oa B obm(){...}ob.m();

Processus

III – Appel à distance 31 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

L’appel de méthode à distance

Principe et propriétésDeux espaces d’exécutionDeux points de contrôleCouplage plus faibleProtocole de communication entre processus.

A oa B obm(){...}ob.m(); Réseau

Processus client Processus serveur

III – Appel à distance 32 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

L’appel de méthode à distance

Différences avec l’appel de procédureContexte d’exécution différent : l’un « module », l’autre «objet »Appel d’une méthode sur un objetAspect dynamique : création de « services »+ transmission de services à distance

A oa B obm(){...}ob.m();

C ocm'(){ };

procx(...);

Processusclient

Processusserveur

Service Sprocx(...) { ...};

Processusclient

Processusserveur

Modèle d'exécution modulaireModèle

d'exécution à objets

III – Appel à distance 33 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Le passage de paramètres

Classe d'objet

primitif non primitiflocal

accessibleà

distance

Passagepar valeur

! sérialisablePassagepar copie

Passagepar

référence (handle)

III – Appel à distance 34 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Sérialisation

DéfinitionLa sérialisation d’un graphe d’objets consiste à obtenir unereprésentation linéaire inversible de ces objets et de leurs relations.La désérialisation reconstruit une forme interne et structurée dugraphe d’objet.

28 76

123

null

null

coucou

A C C

BString

but : exportation vers unfichier ou un autre processusDifficulté : la présence decycles

III – Appel à distance 35 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Sérialisation

Un objet est sérialisable, s’il appartient à une classe :qui implante l’interface java.io.Serializable⇒ pas de code à fournir, mécanisme par défaut :Sont récursivement sérialisés les attributs non statiques nitransients contenant :

des types primitifs (int, bool. . . )ou des objets qui doivent être sérialisables.

ou qui implante l’interface java.io.Serializable et fournitles méthodes (code utilisateur arbitraire) :private void writeObject(java.io.ObjectOutputStream out)

throws IOException;private void readObject(java.io.ObjectInputStream in)

throws IOException, ClassNotFoundException;

III – Appel à distance 36 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Exemple sérialisation

class A implements java.io.Serializable {public B b;public A a;

}class B implements java.io.Serializable {

public A a;}

A a1 = new A(); A a2 = new A();B b1 = new B(); B b2 = new B();a1.a = a2; a1.b = b1;a2.a = a1; a2.b = b2;b1.a = a1; b2.a = a1;ObjectOutputStream oos = new ObjectOutputStream(

new FileOutputStream("/tmp/toto"));oos.writeObject(a1);

ab

a

ab

a

a1 a2

b2b1

III – Appel à distance 37 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Compatibilité de versions

Comment s’assurer, à l’endroit et au moment de la désérialisation,que l’implantation de la classe est la même qu’à la sérialisation(mêmes attributs en particulier) ?⇒ gestionnaire de version des classes

Solution élémentaire : un attribut statique serialVersionUID(type long) dans chaque classe :private static final long serialVersionUID = 76428734L;

Par défaut si absent, le compilateur calcule un tel champ (à partirdes attributs notamment), mais le calcul est sensible à son humeur⇒ à gérer soi-même.

III – Appel à distance 38 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Le mécanisme RMI (Remote Method Invocation)

ProxyObjet local « remplaçant » l’objet distant = objet ayant la mêmeinterface que l’objet distant, et sachant appeler l’objet distant.

ServantObjet interne sachant discuter à distance avec des proxys etlocalement avec l’objet applicatif.

Service de nommageDésignation globale par serveurs de noms (Registry)

III – Appel à distance 39 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Talons : proxy/servant

pA sA A

P1 P2

Proxy = talon client = stub = a la même interface que l’objetapplicatif distant.

Servant = talon serveur = squelette = reçoit les requêtes, appellela méthode correspondant de l’objet applicatif, et gère les erreurs.Le servant peut être un objet distinct (association), ou êtrecommun à l’objet applicatif (héritage).

III – Appel à distance 40 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Obtenir un proxy ?

Comment obtenir un proxy sur un objet distant :Utiliser un service de nommage, qui conserve des associationsentre objet accessible à distance et nom externe (une chaînede caractères ou un URL) : le client demande au service denommage de lui fournir un proxy correspondant à un nomexterne donné.Avoir appelé une méthode (à distance) qui transmet/renvoieun (autre) objet accessible à distance : création implicite desproxys.

III – Appel à distance 41 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Le mécanisme RMILa gestion des proxys et squelettes

sBB

pA

pC

sA A

sBB

pA

pC

sA A

sBB

pA

pC

sA A

sC C sC CsC C

S1

S2

S3S1: Appel de pA.foo(B,4,pC)

S2 : création du proxy pB

création du proxy pC

appel de A.foo(pB,4,pC)

S1 −> S2 : Envoi de la requête (A, foo, B, 4, C)

R

pB pC

III – Appel à distance 42 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

RéalisationL’environnement Java fournit :

la génération dynamique des talons, en s’appuyant sur l’APId’introspection

le proxy est généré à l’exécution, lors de la création d’uneréférence à un objet accessible à distance, à partir del’environnement d’exécution du serveur ;les fonctions du servant sont fournies et intégrées à l’objetaccessible à distance, par héritage ;historiquement, il existait un générateur statique de talons(rmic), analogue à rpcgen.

un service de nommage (package java.rmi.registry), pournommer symboliquement des objets accessibles à distance.un mécanisme de chargement de code dynamique, qui permetaux clients de charger le code des objets fournis en paramètrelorsqu’il n’est pas disponible localement (en particulier le codedes proxys).

III – Appel à distance 43 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Mise en œuvre du protocoleComposants d’une classe d’objet accessible à distance

interfaceObjetDistant

interface java.rmi.Remote class java.rmi.server.UnicastRemoteObject

classObjetImpl_Stub

classObjetImpl_Skel

implements

extends

extendsimplements

classObjetImpl

utilise

classClientdObjet

classServeurObjet

utilise

utilise

III – Appel à distance 44 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

La description d’une classe d’objet accessible à distance

Définition de l’interface d’appelHérite de l’interface Remote

Chaque méthode lève l’exception RemoteException

Un objet local non primitif doit être sérialisable :class ObjParam implements Serializable

Un objet accessible à distance peut être passé en paramètre

Exempleinterface ObjetAAD extends Remote {

void m(int i,ObjParam p) throws RemoteException;String mm(OAADParam pr) throws RemoteException;...

}

III – Appel à distance 45 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

La description d’une classe d’objet accessible à distance

Définition de la classe d’implantationHérite de la classe UnicastRemoteObject

Implante l’interface du proxy correspondant

Exempleclass ObjetAADImpl extends UnicastRemoteObject

implements ObjetAAD {void m(int i,ObjParam p) {...}String mm(OAADParam pr) {... }...

}

III – Appel à distance 46 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Exemple 1Classe sérialisable

Faire référence à l’interface Serializable.

public class Tel implements java.io.Serializable {private int indic ;private int[] numero ;

public String toString(){... }

public Tel (int indicatif, int[] nn){this.indic=indicatif;this.numero=nn;

}}

III – Appel à distance 47 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Exemple 1Interface

import java.rmi.*;

interface Annuaire extends Remote {public void ajouter(String nom, Tel num)

throws RemoteException;public boolean present(String nom) throws RemoteException;public void effacer(String nom) throws RemoteException;public String[] lister() throws RemoteException;public void copier(String nom, Annuaire orig)

throws RemoteException;}

III – Appel à distance 48 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Exemple 1Implantation « serveur »

import java.rmi.*;import java.rmi.server.*;import java.util.*;

public class AnnuaireImplextends UnicastRemoteObject implements Annuaire {

private Map<String,Tel> table = new HashMap<String,Tel>();

AnnuaireImpl() throws RemoteException { }...public boolean present(String nom) {

return table.containsKey(nom) ;}

}

III – Appel à distance 49 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Structure des classes

Génération statique ou dynamique des stubs et des skeletons.

Annuaire

AnnuaireImplClient

Serveur

Tel

AnnuaireImpl_Stub AnnuaireImpl_Skel

Remote UnicastRemoteObject

extendsextends

implements

imple

ments

⇒ Cas statique : utilisation du générateur rmic

III – Appel à distance 50 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Exemple 1Un processus serveur

Le serveur de noms est créé en tant que thread interne

import java.rmi.registry.*;public class Serveur {public static void main(String args[]) throws Exception {Annuaire AA = new AnnuaireImpl();Registry dns = LocateRegistry.createRegistry(1099);dns.bind("Travail",AA);

}}

Exemple d’exécution : java Serveur

III – Appel à distance 51 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Exemple 1Un programme client

import java.rmi.registry.*;public class Client {// args[0] contient le site support du service de nommagepublic static void main(String args[]) throws Exception {Registry dns = LocateRegistry.getRegistry(args[0],1099);Annuaire proxy = (Annuaire)dns.lookup("Travail");int[] unNumero = {05,34,32,20,00};Tel unTel = new Tel(33, unNumero);proxy.ajouter("N7",unTel);String[] contenu = proxy.lister();

}}

Exemple d’appel : java Client emeraude.enseeiht.fr

III – Appel à distance 52 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Concurrence

Chaque invocation d’une méthode par un appel à distance se faitdans une activité (thread) distincte.

Objet O

Appelde

O.m1()

Appelde

O.m2()

Site 1 Site 2

⇒ nécessité de gérer la protection des attributs et autres donnéespartagées (p.e. synchronized pour toutes les méthodes).

III – Appel à distance 53 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Interface du service de nommagejava.rmi.registry.Registry : interface d’accès au nommage.Les noms d’objets doivent obéir à la syntaxe générale des URL :rmi://host:port/name, ou name si le contexte est non ambigu.public class Registry {

public Remote lookup(String name)throws NotBoundException, MalformedURLException,

UnknownHostException, RemoteException;public void bind(String name, Remote obj)

throws AlreadyBoundException, MalformedURLException,UnknownHostException, RemoteException;

public void unbind(String name)throws RemoteException, NotBoundException,

MalformedURLException, UnknownHostException;public String[] list(String name)

throws RemoteException, MalformedURLException,UnknownHostException;

}III – Appel à distance 54 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Localisation et accès au service de nommage

La classe java.rmi.registry.LocateRegistry offre unensemble de méthodes pour créer ou obtenir l’accès à un serveurde noms local ou distant :

public final class LocateRegistry {public static Registry getRegistry(String host, int port)

throws RemoteException, UnknownHostException;...public static Registry createRegistry()

throws RemoteException;}

III – Appel à distance 55 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Remarques sur le service de nommage

Le service de nommage peut aussi être une applicationautonome (programme rmiregistry), et peut résider sur unsite différent.Un objet accessible à distance n’a pas nécessairement à êtreenregistré dans le service de nommage : seuls les objetsracines le doivent.

III – Appel à distance 56 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Implantation du service de nommageLe service de nommage n’est lui-même qu’un objet accessible àdistance. C’est un objet « notoire », avec une identité fixée : 〈adrmachine, no port〉 suffit à le trouver.class RegistryImpl extends java.rmi.server.RemoteServer {

private Map<String, Remote> bindings= new HashMap<String, Remote>();

public Remote lookup(String name)throws RemoteException, NotBoundException

{synchronized (bindings) {

Remote obj = bindings.get(name);if (obj == null) throw new NotBoundException(name);return obj;

}...

III – Appel à distance 57 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Schéma de callback (rappel)But : permettre au serveur d’appeler un client l’ayant contactéauparavant

Augmenter l’asynchronisme : schéma publier/s’abonner :1 appel client → serveur avec retour immédiat (s’abonner)2 rappel serveur → client quand le service est exécuté (publier)

Augmenter les interactions : le serveur peut demander auclient des données complémentairesProgrammation événementielle

PrincipeLe client passe en paramètre au serveur l’objet à rappelerLe serveur exécute un appel sur cet objet

La relation client/serveur est conceptuelle, pas une relationd’usage !

III – Appel à distance 58 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Callback

III – Appel à distance 59 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Exemple 2 : callbackInterfaces

// les deux interfaces des objets appelés à distance

public interface ICallback extends Remote {public void wakeUp(String msg) throws RemoteException;

}

public interface IServer extends Remote {public void callMeBack(int time, String param,

ICallback callback) throws RemoteException;}

III – Appel à distance 60 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Exemple 2 : callbackServant

public class Servant extends Thread {private int time;private String param;private ICallback callback;

public Servant(int time, String param, ICallback cb) {this.time = time; this.param = param; this.callback = cb;

}

public void run() { // exécution du servant comme threadtry {

Thread.sleep(1000*time); // attend time secondescallback.wakeUp(param);

} catch(Exception e) { e.printStackTrace(); }}

}III – Appel à distance 61 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Exemple 2 : callbackServeur

import java.rmi.*;import java.rmi.server.*;

public class Server extends UnicastRemoteObjectimplements IServer {

public Server() throws RemoteException { }public void callMeBack(int time, String param,ICallback cb)

throws RemoteException {Servant servant = new Servant(time, param,cb);servant.start();

}

public static void main(String[] args) throws Exception {Server server = new Server();Naming.rebind("ReveilMatin", server);

}}III – Appel à distance 62 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

Exemple 2 : callbackCallback & client

public class Callback extends UnicastRemoteObjectimplements ICallback {

public Callback() throws RemoteException { }public void wakeUp(String message) throws RemoteException {

System.out.println(message);}

}

public class Client {public static void main(String[] args) throws Exception {

Callback callback = new Callback();IServer serv = (IServer) Naming.lookup("ReveilMatin");serv.callMeBack(5, "coucou", callback);...

}}

III – Appel à distance 63 / 64

L’appel procédural à distanceL’appel de méthode à distance

Sémantique et propriétésSérialisationRMI de JavaExemples

RMI : Conclusion

Génération automatique des stubs et skeletonsSérialisation automatique (en général) par simple référence àl’interface Serializable

Serveur multi-threadSémantique au plus une fois (at-most-once)Problème : ramassage des objets accessibles à distanceAttention à la fiabilité : RemoteException

III – Appel à distance 64 / 64