44
1 Objets distribués

Objets distribués

  • Upload
    lieu

  • View
    26

  • Download
    0

Embed Size (px)

DESCRIPTION

Objets distribués. RMI Remote Method Invocation. Un objet distribué doit pouvoir être vu comme un objet « normal ». Soit la déclaration suivante : ObjetDistribue monObjetDistribue; - PowerPoint PPT Presentation

Citation preview

Page 1: Objets distribués

1

Objets distribués

Page 2: Objets distribués

2

RMIRemote Method Invocation

Page 3: Objets distribués

3

Un objet distribué doit pouvoir être vu comme un objet « normal ».Soit la déclaration suivante :ObjetDistribue monObjetDistribue;. On doit pouvoir invoquer une méthode de cet objet situé sur une autre machine de la même façon qu’un objet local :monObjetDisribue.uneMethodeDeLOD();

Page 4: Objets distribués

4

. On doit pouvoir utiliser cet objet distribué sans connaître sa localisation. On utilise pour cela un service sorte d’annuaire, qui doit nous renvoyer son adresse.monObjetDistribue=ServiceDeNoms.recherche(‘myDistributedObject’);. On doit pouvoir utiliser un objet distribué comme paramètre d’une méthode locale ou distante.x=monObjetLocal.uneMethodeDeLOL(monObjetDistribue);x=monObjetDistribue.uneMethodeDeLOD(autreObjetDistribue);

Page 5: Objets distribués

5

. On doit pouvoir récupérer le résultat d’un appel de méthode sous la forme d’un objet distribué.

Page 6: Objets distribués

6

RMI: permet la communication entre machines virtuelles Java (JVM) qui peuvent se trouver physiquement sur la même machine ou sur deux machines distinctes ( espace d’adressage différents) .Un but primaire pour les concepteurs de RMI était de permettre à des programmeurs de développer des programmes distribués de Java avec la mêmes syntaxe et sémantique utilisées pour des programmes non-distribués

Page 7: Objets distribués

7

Présentation

RMI est un système d’objets distribués constitué uniquement d’objets java ;. RMI est une Application Programming Interface (intégrée au JDK 1.1 et plus) ;. Développé par JavaSoft ;

Page 8: Objets distribués

8

Objectifs

•Rendre transparent l’accès à des objets distribués sur un réseau• Faciliter la mise en œuvre et l’utilisation d’objets distants Java• Préserver la sécurité (inhérent à l’environnement Java)RMISecurityManager Distributed Garbage Collector (DGC)

Page 9: Objets distribués

9

. Mécanisme qui permet l’appel de méthodes entre objets Java qui s’exécutent éventuellement sur des JVM distinctes ;. L ‘appel peut se faire sur la même machine ou bien sur des machines connectées sur un réseau ;. Utilise les sockets ;. Les échanges respectent un protocole propriétaire :Remote Method Protocol ;. RMI repose sur les classes de sérialisation.

Page 10: Objets distribués

10

•Une référence à un OD peut être passée enargument ou retournée en résultat d’unappel dans toutes les invocations (locales oudistantes)• Un OD peut être transformé (cast) enn’importe quelles interfaces distantessupportées par l’implémentation de l’objet

Page 11: Objets distribués

11

•Les clients (objets clients) des OD (objetsserveurs) interagissent avec des interfacesdistantes,• Les arguments locaux et les résultats d’uneinvocation distante sont toujours passés parcopie et non par référence•leurs classes doivent implémentéesjava.io.Serializable (sérialisation d ’objets)

Page 12: Objets distribués

12

Le passage de paramètres

Pour résumer :•l’argument ou la valeur de retour d’une méthodedistante peut être de n’importe quel type Java ycompris les types simples, les objets locaux oules objets distants.•Si jamais le type n’est pas disponiblelocalement, il est chargé dynamiquement(RMIClassLoader)

Page 13: Objets distribués

13

Le passage de paramètres

pour les paramètres locaux (objets ou typesprimitifs), le transfert se fait nécessairement parcopie. S’il s’agit d’un objet, l’ensemble de sesvariables est copié par sérialisation— il doit donc implémenter java.io.Serializablepour les paramètres qui seraient déjà desréférences d’OD, l’objet amorce (Stub) est passé— impossible de passer en paramètre un objetuniquement visible par les classes serveurs

Page 14: Objets distribués

14

La notion d’interfaceL’interface constitue le contrat - abstrait -liant objets serveurs et objets clientselle est destinée à être implémentée par l’OD et constitue la base d’appel pour les objets clients— elle définie les signatures (noms, types de retours,paramètres) d’un ensemble de méthodes et seules ces méthodes seront accessibles par un objet client

Page 15: Objets distribués

15

La notion d’interface

Pour RMI, c’est une interface Javatraditionnelle … mais dérivant de la classejava.rmi.Remote

Page 16: Objets distribués

16

L’exception RemoteException

•Les objets clients doivent traiter des exceptions supplémentaires commeRemoteException• Toute invocation distante de méthode doitlever ou traiter cette exception Peut se produire si la connexion a étéinterrompue ou si le serveur distant ne peutêtre trouvé

Page 17: Objets distribués

17

Architecture

Invocation de la méthode distante

Stub

Couche référencesdistantes

TCP/IP TCP/IP

Squelette

Objetdistant

Couche référencesdistantes

Application

Présentation

Session

Transport/Réseau

Liaison de données /Physique

Page 18: Objets distribués

18

Client Objet

ObjetClient

interface Appel local

Appel distant

interface interfacestub skeleton

méthode+ arguments

retour + exceptionRéseau

Page 19: Objets distribués

19

Stub/ Skeleton

Les amorces ( Stub/ Skeleton). 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). Les amorces sont créées par le générateur rmic.

Page 20: Objets distribués

20

Les Stubs

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

Page 21: Objets distribués

21

Les Stubs

S’appuient sur la sérialisation.•il les transforme en un flot de données (flux depliage) transmissible sur le réseau•les objets doivent implémenter l’interfacejava.io.Serializable oujava.io.Externalizable

Page 22: Objets distribués

22

Les squelettes

. 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.

Page 23: Objets distribués

23

La couche des références d’objetsRemote 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 par défaut;

Page 24: Objets distribués

24

La couche transport

. Réalise les connexions réseau basées sur les flux entre les JVM.emploie un protocole de communication propriétaire (JRMP:Java Remote Method Invocation) basé sur TCP/IP• Connecte les 2 espaces d’adressage (JVM)• Suit les connexions en cours• Ecoute et répond aux invocations• Construit une table des OD disponibles• Réalise l’aiguillage des invocations

Page 25: Objets distribués

25

Développer une application avec RMI : Mise en œuvre

1. Définir une interface distante (Xyy.java) ;2. Créer une classe implémentant cette interface (XyyImpl.java) ;3. Compiler cette classe (javac XyyImpl.java) ;4. Créer une application serveur (XyyServer.java) ;5. Compiler l’application serveur ;6. Créer les classes stub et skeleton à l’aide de rmic XyyImpl_Stub.java et XyyImpl_Skel.java;7. Démarrage du registre avec rmiregistry ;8. Lancer le serveur pour la création d’objets et leur enregistrement dans rmiregistry;9. Créer une classe cliente qui appelle des méthodes distantes de l’objet distribué (XyyClient.java) ;10. Compiler cette classe et la lancer.

Page 26: Objets distribués

26

Example

The first step is to write and compile the Java code for the service interface. The Calculator interface defines all of the remote features offered by the service: public interface Calculator extends java.rmi.Remote { public long add(long a, long b) throws java.rmi.RemoteException; public long sub(long a, long b) throws java.rmi.RemoteException; public long mul(long a, long b) throws java.rmi.RemoteException; public long div(long a, long b) throws java.rmi.RemoteException; }

Page 27: Objets distribués

27

Notice this interface extends Remote, and each method signature declares that it may throw a RemoteException object. Copy this file to your directory and compile it with the Java compiler:

>javac Calculator.java

Page 28: Objets distribués

28

Implementation

Next, you write the implementation for the remote service. This is the CalculatorImpl class:

public class CalculatorImpl extends java.rmi.server.UnicastRemoteObject implements Calculator { // Implementations must have an explicit constructor // in order to declare the RemoteException exception public CalculatorImpl() throws java.rmi.RemoteException { super(); } public long add(long a, long b) throws java.rmi.RemoteException { return a + b;}

Page 29: Objets distribués

29

public long sub(long a, long b) throws java.rmi.RemoteException { return a - b; } public long mul(long a, long b)throws java.rmi.RemoteException { return a * b;} public long div(long a, long b) throws java.rmi.RemoteException {return a / b; } }

Page 30: Objets distribués

30

Stubs and Skeletons

You next use the RMI compiler, rmic, to generate the stub and skeleton files. The compiler runs on the remote service implementation class file.

>rmic CalculatorImpl

Try this in your directory. After you run rmic you should find the file Calculator_Stub.class and, if you are running the Java 2 SDK, Calculator_Skel.class.

Page 31: Objets distribués

31

Host Server

import java.rmi.Naming; public class CalculatorServer { public CalculatorServer() { try { Calculator c = new CalculatorImpl(); Naming.rebind("rmi://localhost:1099/CalculatorService", c); } catch (Exception e) { System.out.println("Trouble: " + e); } } public static void main(String args[]) { new CalculatorServer(); } }

Page 32: Objets distribués

32

Le client import java.rmi.Naming; import java.rmi.RemoteException;import java.net.*;import java.rmi.NotBoundException; public class CalculatorClient { public static void main(String[] args) { try { Calculator c = (Calculator) Naming.lookup( "rmi://localhost /CalculatorService"); System.out.println( c.sub(4, 3) );System.out.println( c.add(4, 5) );System.out.println( c.mul(3, 6) ); System.out.println( c.div(9, 3) ); ……

Page 33: Objets distribués

33

Un autre exemple

Un « echo » distribué :invocation distante de la méthode echo() d’unobjet distribué avec le mécanisme RMI.— 4 programmes sont nécessaires :Echo : l’interface décrivant l’objet distant (OD)EchoImpl : l’implémentation de l’ODEchoAppliServer : une application serveur RMIEchoClient : l’application cliente utilisant l’OD

Page 34: Objets distribués

34

1) définir l’interface pour la classedistante

Rappel : les classes placées à distance sont spécifiées par des interfaces qui doivent dériver de java.rmi.Remote et dont les méthodes lèvent une java.rmi.RemoteException

package demo.rmi;import java.rmi.*;public interface Echo extends Remote { public String echo(String str) throws RemoteException;}

Page 35: Objets distribués

35

2) définir l’implémentation del’OD

package demo.rmi;import java.rmi.*;import java.rmi.server.*;public class EchoImpl extends UnicastRemoteObject implements Echo { public EchoImpl() throws RemoteException {super();}public String echo(String str) throws RemoteException {return "Echo : " + str;}}

Page 36: Objets distribués

36

3) définir une application serveur

C’est le programme qui sera à l’écoute desdemandes des clients.il lui faut un SecurityManager spécifique :RMISecurityManagerpour rendre l’objet disponible, il faut l’enregistrerdans le « RMIregistry » par la méthode statique :— Naming.rebind("echo", od);

Page 37: Objets distribués

37

3) définir une application serveur(suite)

Par la suite, cet objet distant sera accessible par les autres machines en indiquant son nom et la machine sur laquelle est exécuté ce serveur parString url = "rmi://nomServeurRMI:port/nomOD"String url = "rmi://patate.univ-tours.fr/echo »Cet " url RMI " sera utilisé par les clients pourinterroger le serveur grâce à l’appel :Naming.lookup(url);

Page 38: Objets distribués

38

3) définir une application serveur(suite)

package demo.rmi;public class EchoAppliServer { public static void main(String args[]) {// Création et installation du manager de sécuritéSystem.setSecurityManager(new RMISecurityManager());try {// Création de l’ODEchoImpl od = new EchoImpl();// Enregistrement de l’OD dans RMINaming.rebind("echo", od);}catch(Exception e) {…}}}

Page 39: Objets distribués

39

Compiler les classes

> javac -d $HOME/classes Echo.java> javac -d $HOME/classes EchoImpl.java> javac -d $HOME/classes EchoAppliServer.javaCes commandes créent les fichiers .classcorrespondants et les déposent dans$HOME/classes/demo/rmi/

Page 40: Objets distribués

40

4) créer les amorces

Il s’agit d’invoquer le compilateur d’amorces rmic sur la classe compilée de l’OD :> rmic -d $HOME/classes demo.rmi.EchoImpl2 classes sont alors créees représentant lasouche (ou Stub) et le Skeleton :EchoImpl_Stub.classEchoImpl_Skel.class

Page 41: Objets distribués

41

5) Lancer rmiregister etl’application serveur

Il faut d ’abord lancer le rmiregister puis leserveur :> rmiregister&> java demo.rmi.EchoAppliServerCe qui rend maintenant le serveur disponiblepour de futurs clients ...

Page 42: Objets distribués

42

6) définir l’application clienteutilisant l’OD

package demo.rmi;import java.rmi.*;import java.rmi.registery.*;public class EchoClient { public static void main(String args[]) { // Création et installation du manager de sécuritéSystem.setSecurityManager(new RMISecurityManager());// Recherche de l’ODString url = "rmi://" + args[0] + "/echo";Echo od = (Echo)Naming.lookup(url);System.out.println(od.echo(args[1]));}}

Page 43: Objets distribués

43

6) définir l’application clienteutilisant l’OD

(suite)

Remarque :ce code manipule l’OD comme s’il était local.Après avoir installé un RMISecurityManager, leclient recherche l’objet distant en interrogeant leservice « d’annuaire » RMI par :— Naming.lookup(url) ou url est un « url RMI » dela forme :String url="rmi://nomServeurRMI:port/nomOD"— si une seule machine : nomServeurRMI= " localhost  "

Page 44: Objets distribués

44

6) compiler et lancer l’applicationcliente

% javac -d $HOME/classes EchoClient.java% java demo.rmi.EchoClient patate.univ-tours.fr coucou% Echo : coucou