systèmes et applications distribués intergiciels et...
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