Vous êtes sur la page 1sur 41

1

Université Sidi Mohammed Ben Abdellah


Ecole Nationale des Sciences Appliquées – Fès

SYSTÈMES RÉPARTIS

Pr. Karima AISSAOUI


Karima.aissaoui1@usmba.ac.ma
Plan de la séance
2

 Cours RMI
 TP RMI
Introduction et rappel
3

 RPC (Remote Procedure Call)


 modèle client/serveur
 appel de procédures à distances entre un client et un
serveur
 le client appelle une procédure

 le serveur exécute la procédure et renvoie le résultat


Introduction et rappel
4

 Limitations
 paramètres et valeur de retour sont des types primitifs
 programmation procédurale

 dépendance à la localisation du serveur

 pas d’objet

 pas de « référence distante »


Introduction et rappel
5

 Evolutions
 CORBA
 Multi-langage, multi-plateforme
 Java RMI
 mono-langage : Java, multiplateforme : de JVM à JVM
 DCOM / Object RPC / .NET Remoting
 multi-langages, plateforme Win32 principalement, il existe des implémentations
(non MicroSoft) pour Unix, Propriétaire
 .NET Remoting
 multi-langages (CLR), plateforme Win32 principalement
 Normalisé à l’ ECMA et à l’ ISO
 SOAP (Simple Access Object Protocol)
 multi-langages, multi-plateforme
 Réponse et requête en XML (DTD SOAP), Transport sur HTTP, IETF
Introduction et rappel
6

 Appel de procédure vs appel de méthode sur un


objet
 Exemple : insérer une entrée dans un annuaire
Java RMI: RPC orienté objet
7

 RMI (Remote Method Invocation): Interface de


programmation (API) pour le langage Java qui permet
d’appeler des méthodes distantes
 Intégré au JDK
 Système distribué simplifié
 Uniquement pour des objets Java
 Un objet distant (OD) est bien manipulable comme un
objet standard :
 Variable
 paramètre de fonctions
 valeur de retour
Principes de RMI
8

 RPC à la Java: invoquer de façon simple des méthodes sur des objets
distribués.
 Outils: pour la génération des stub/skeleton, l’enregistrement par le nom,
l’activation
 Tous les détails ( connexion, transfert de données ..) sont transparents pour le
développeur grâce au stub/skeleton généré
 Mono-langage et Multiplateforme: Java : de JVM à JVM (les
données et objets ont la même représentation qqs la JVM)
 Orienté Objet: Les RMIs utilisent le mécanisme standard de sérialisation
de JAVA pour l’envoi d’objets.
 Dynamique: Les classes des Stubs et des paramètres peuvent être
chargées dynamiquement via HTTP (http://) ou NFS (file:/)
 Sécurité: un SecurityManager vérifie si certaines opérations sont autorisés
par le serveur
Caractéristiques de Java RMI
9

 Mécanisme permettant l’appel de méthodes entre


des objets JAVA qui s’exécutent éventuellement sur
des JVM (Java Virtual Machine) distinctes.
 L’appel peut se faire sur la même machine ou bien
sur des machines connectées en réseau.
 Les échanges respectent un protocole propriétaire :
Remote Method Protocol.
 RMI repose sur les classes de sérialisation
Architecture java RMI
10

 Le fonctionnement repose initialement sur le modèle


client/serveur:
 Le serveur présente des objets décrits par une interface
 Le serveur s’enregistre auprès d’un annuaire (registry)

 Chaque client obtient une référence distante auprès


de l’annuaire.
 La communication haut-niveau s’appuie sur la
communication des objets Java sous-jacents de JVM à
JVM.
Structure des couches RMI
11
architecture logique
Les amorces (Stub/Skeleton)
12

 Elles assurent le rôle d’adaptateurs pour le


transport des appels distants.
 Elles réalisent les appels sur la couche réseau.
 Elles réalisent l’assemblage et le désassemblage
des paramètres (marshalling, unmarshalling).
 Une référence d’objets distribués correspond à une
référence d’amorce.
 Les amorces sont créées par le générateur rmic.
Souche (Stub)
13

 Représentants locaux de l’objet distribué.


 Initient une connexion avec la JVM distante en
transmettant l’invocation distante à la couche des
références d’objets.
 Assemblent les paramètres pour leur transfert à la JVM
distante.
 Attendent les résultats de l’invocation distante.
 Désassemblent la valeur ou l’exception renvoyée.
 Renvoient la valeur à l’appelant.
 S’appuient sur la sérialisation.
Squelette (Skeleton)
14

 Désassemblent les paramètres pour la méthode


distante.
 Font appel à la méthode demandée.
 Assemblage du résultat (valeur renvoyée ou
exception) à destination de l’appelant.
Couche des références d’objets Remote
15
Reference Layer
 Permet d’obtenir une référence d’objet distribué à partir de
la référence locale au stub.
 Cette fonction est assurée grâce à un service de noms
rmiregister (qui possède une table de hachage dont les clés
sont des noms et les valeurs sont des objets distants).
 Un unique rmiregister par JVM.
 rmiregister s’exécute sur chaque machine hébergeant des
objets distants.
 rmiregister accepte des demandes de service sur le port
1099.
Couche transport
16

 Elle réalise les connexions réseaux basées sur les flux


entre les JVM.
 Elle emploie un protocole de communication
propriétaire (JRMP :Java Remote Method Invocation)
basé sur TCP/IP.
 Le protocole JRMP a été modifié afin de supprimer la
nécessité des squelettes car depuis la version 1.2 de
Java, une même classe skeleton générique est partagée
par tous les objets distants
Etapes de création d’un objet distant et
17
l'appeler avec RMI
 Développement côté serveur se compose de :
 La définition d'une interface qui contient les méthodes qui peuvent
être appelées à distance
 L'écriture d'une classe qui implémente cette interface
 L'écriture d'une classe qui instanciera l'objet et l'enregistrera en
lui affectant un nom dans le registre de noms RMI (RMI Registry)

 Développement côté client se compose de :


 L'obtention d'une référence sur l'objet distant à partir de son nom
 L'appel à la méthode à partir de cette référence

 Enfin, il faut générer les classes stub et skeleton en exécutant le


programme rmic avec le fichier source de l'objet distant.
Création et manipulation d' objets
18
distants
 5 Packages
 java.rmi : pour accéder à des objets distants
 java.rmi.server : pour créer des objets distants

 java.rmi.registry : lié à la localisation et au nommage


d’objets distants
 java.rmi.dgc : ramasse-miettes pour les objets distants

 java.rmi.activation: support pour l’activation d’objets


distants
Création et manipulation d' objets
19
distants
 Etapes du développement
1. Spécifier et écrire l’interface de l'objet distant.
2. Ecrire l'implémentation de cette interface.
3. Générer les Stub/Skeleton correspondants. (outil rmic)
 Etapes de l ’exécution
 Ecrire le serveur qui instancie l'objet implémentant l' interface,
exporte son Stub puis attend les requêtes via le Skeleton.
 Ecrire le client qui réclame l’objet distant, importe le Stub
et invoque une méthode de l'objet distant via le Stub.
1. Spécifier l ’interface d' un objet
20
distant
 Format
 l’interface
étend java.rmi.Remote
 les méthodes doivent pouvoir lever l’exception
java.rmi.RemoteException
 Exemple
import java.rmi.*;
public interface Information extends Remote {
public String getInformation() throws RemoteException; }
Implémentation de l’objet distant
21

 Classe qui implémente l’interface créée


 Cette classe correspond à l'objet distant. Elle doit donc
implémenter l'interface définie et contenir le code
nécessaire.
 Cette classe doit obligatoirement hériter de la classe
UnicastRemoteObject qui:
 contient les différents traitements élémentaires pour un objet
distant dont l'appel par le stub du client est unique.
 offre toutes les fonctionnalités des classes distantes
 appelle la classe squelette pour la (dé)marshalisation
 utilise TCP/IP pour la couche transport
Implémentation de l’objet distant
22

 Exemple
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class InformationImpl extends UnicastRemoteObject implements Information {
private static final long serialVersionUID = 2674880711467464646L;
protected InformationImpl() throws RemoteException {
super();
}
public String getInformation() throws RemoteException { System.out.println("Invocation de la méthode
getInformation()");
return "bonjour";
}
}

Remarque: même si le constructeur ne contient pas de code il doit être redéfini pour inhiber la génération
du constructeur par défaut qui ne lève pas cette exception.
Classe qui instancie l’objet et
23
l’enregistre dans le registre
 Ces opérations peuvent être effectuées dans la
méthode main d'une classe dédiée ou dans la
méthode main de la classe de l'objet distant.
 L'intérêt d'une classe dédiée et qu'elle permet de
regrouper toutes ces opérations pour un ensemble
d'objets distants
Classe qui instancie l’objet et
24
l’enregistre dans le registre
 Trois étapes:
 La mise en place d'un security manager dédié qui est
facultative
 l'instanciation d'un objet de la classe distante

 l'enregistrement de la classe dans le registre de noms


RMI
Mise en place d'un security manager
25

 Opération non obligatoire mais elle est recommandée en


particulier si le serveur doit charger des classes récupérées
sur des machines distantes.
 Sans security manager, il faut obligatoirement mettre à la
disposition du serveur toutes les classes dont il aura besoin
(Elles doivent être dans le CLASSPATH du serveur).
 Avec un security manager, le serveur peut charger
dynamiquement certaines classes.
 Cependant, le chargement dynamique de ces classes peut
poser des problèmes de sécurité car le serveur va exécuter
du code d'une autre machine. Cet aspect peut conduire à ne
pas utiliser de security manager.
Mise en place d'un security manager
26

public static void main(String[] args) {


try {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
}
catch (Exception e) { e.printStrackTrace(); }
}
L'instanciation d'un objet de la classe
27
distante
 Consiste simplement en la création d'un objet de la
classe de l'objet distant
 public static void main(String[] args) {
try {
if (System.getSecurityManager() == null)
{
System.setSecurityManager(new
RMISecurityManager());
}
InformationImpl informationImpl = new InformationImpl();
} catch (Exception e) { e.printStrackTrace(); } }
Enregistrement dans le registre de
28
noms RMI
 Consiste à enregistrer l'objet créé dans le registre de noms en lui
affectant un nom.
 Ce nom est fourni au registre sous forme d'une URL constituée du
préfix rmi://, du nom du serveur (hostname) et du nom associé à
l'objet précédé d'un slash.
 Le nom du serveur peut être fourni « en dur » sous forme d'une
constante chaîne de caractères ou peut être dynamiquement obtenu
en utilisant la classe InetAddress pour une utilisation en locale.
 C'est ce nom qui sera utilisé dans une URL par le client pour obtenir
une référence sur l'objet distant.
 L'enregistrement se fait en utilisant la méthode rebind de la classe
Naming. Elle attend en paramètre l'URL du nom de l'objet et l'objet
lui-même.
Exemple
29

public static void main(String[] args) {


try {
if (System.getSecurityManager() == null) { System.setSecurityManager(new
RMISecurityManager());
}
InformationImpl informationImpl = new InformationImpl();
String url = "rmi://" + InetAddress.getLocalHost().getHostAddress() + "/TestRMI";
System.out.println("Enregistrement de l'objet avec l'url : " + url); Naming.rebind(url,
informationImpl);
System.out.println("Serveur lancé");
}
catch (RemoteException e) { e.printStackTrace(); }
catch (MalformedURLException e) { e.printStackTrace(); }
catch (UnknownHostException e) { e.printStackTrace(); }
}
Développement côté client
30

 L'appel d'une méthode distante peut se faire dans


une application ou dans une applet
 La mise en place d'un security manager
 L'obtention d'une référence sur l'objet distant à partir
de son nom
 L'appel de la méthode à partir de la référence sur
l'objet distant
 L'appel d'une méthode distante dans une applet
Mise en place de Security Manager
31

 Comme pour le côté serveur, cette opération est


facultative.
 Le choix de la mise en place d'un sécurity manager
côté client suit des règles identiques à celles
appliquées côté serveur.
 Sans son utilisation, il est nécessaire de mettre dans
le CLASSPATH du client toutes les classes nécessaires
dont la classe stub.
Mise en place de Security Manager
32

public static void main(String[] args) {


if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}}
Obtention d'une référence sur l'objet
33
distant
 Pour obtenir une référence sur l'objet distant à partir de son nom, il
faut utiliser la méthode statique lookup() de la classe Naming.
 Cette méthode attend en paramètre une URL indiquant le nom qui
référence l'objet distant. Cette URL est composée de plusieurs
éléments : le préfix rmi://, le nom du serveur (hostname) et le nom
de l'objet tel qu'il a été enregistré dans le registre précédé d'un
slash.
 Il est préférable de prévoir le nom du serveur sous forme de
paramètres de l'application ou de l'applet pour plus de souplesse.
 La méthode lookup() va rechercher l'objet dans le registre du
serveur et retourner un objet stub. L'objet retourné est de la classe
Remote (cette classe est la classe mère de tous les objets distants).
 Si le nom fourni dans l'URL n'est pas référencé dans le registre, la
méthode lève l'exception NotBoundException.
Exemple
34

public static void main(String[] args) {


if (System.getSecurityManager() == null) {
System.setSecurityManager(new
RMISecurityManager());
}
try {
Remote r = naming.lookup("rmi://10.0.0.13/TestRMI");
}
catch (Exception e) { e.printStrackTrace(); }
}
Appel de la méthode à partir de la
35
référence sur l'objet distant
 L'objet retourné étant de type Remote, il faut
réaliser un cast vers l'interface qui définit les
méthodes de l'objet distant.
 Pour plus de sécurité, on vérifie que l'objet retourné
est bien une instance de cette interface.
 Une fois le cast réalisé, il suffit simplement
d'appeler la méthode.
Exemple
36

public class LanceClient {


public static void main(String[] args) { System.out.println("Lancement du client");
if (System.getSecurityManager() == null) { System.setSecurityManager(new
RMISecurityManager());
}
try { Remote r = Naming.lookup("rmi://10.0.0.13/TestRMI"); System.out.println(r);
if (r instanceof Information) {
String s = ((Information) r).getInformation();
System.out.println("chaine renvoyee = " + s); }
}
catch (MalformedURLException e) { e.printStackTrace(); }
catch (RemoteException e) { e.printStackTrace(); }
catch (NotBoundException e) { e.printStackTrace(); }
System.out.println("Fin du client");
}
}
Génération de la classe stub
37

 Pour générer la classe stub, il suffit d'utiliser


l'outil rmic fourni avec le JDK en lui donnant en
paramètre le nom pleinement qualifié de la
classe
 Remarque: la classe doit avoir été compilée :

rmic a besoin du fichier .class


Mise en œuvre des objets RMI
38

 La mise en œuvre et l'utilisation d'objets distants


avec RMI nécessite plusieurs étapes :
 Démarrer le registre RMI sur le serveur soit en utilisant
le programme rmiregistry livré avec le JDK soit en
exécutant une classe qui effectue le lancement.
 Exécuter la classe qui instancie l'objet distant et
l'enregistre dans le serveur de noms RMI
 Lancer l'application ou l'applet pour tester.
Lancement du registre RMI
39

 La commande rmiregistry est fournie avec le JDK. Il


faut la lancer en tâche de fond :
 Sous Unix : rmiregistry&
 Sous Windows : start rmiregistry

 Ce registre permet de faire correspondre un objet


à un nom et inversement. C'est lui qui est sollicité lors
d'un appel aux méthodes Naming.bind() et
Naming.lookup()
Instanciation et enregistrement de
40
l'objet distant
 Il faut exécuter la classe qui va instancier l'objet
distant et l'enregistrer sous son nom dans le registre
précédemment lancé.
 Pour ne pas avoir de problème, il faut s'assurer que
toutes les classes utiles (la classe de l'objet distant,
l'interface qui définit les méthodes) sont présentes
dans un répertoire défini dans le classpath.
 Si un gestionnaire de sécurité est mis en place, il
faut définir un fichier qui va contenir la politique de
sécurité qu'il doit mettre en œuvre.
Lancement de l'application cliente
41

 L'archive de la partie cliente doit contenir le client,


l'interface de l'objet distant et le stub qui a été
généré par rmic.

Vous aimerez peut-être aussi