Systèmes distribués avec Java RMI
Transcription
Systèmes distribués avec Java RMI
Systèmes distribués avec Java RMI Vania Marangozova-Martin [email protected] ibd.forge.imag.fr Pourquoi Java RMI? u A plus bas niveau nous avons le mécanisme de sockets v “A socket is one end-point of a two-way communication link between two programs running on the network” V.Marangozova-Martin IBD 2 Les sockets… + Simple - Visent uniquement la transmission de données - Ne considèrenet pas la sémantique des données - Les protocoles qui prennent en compte la sémantique des données sont à implémenter au niveau de l’application - L’implémentation est souvent complexe, longue et source d’erreurs V.Marangozova-Martin IBD 3 L’idée de Java RMI u Dans OO, les objets reflètent la sémantique des traitements et des données v u Java RMI v v u Dans les applications, les objets comuniquent à l’aide de méthodesIn local applications, objects communicate via methods Permet l’utilisaton du paradigme OO dans le contexte distribué Définit les mécanismes pour l’accès aux objets et l’appel des méthodes à distance RMI = Remote Method Invocation mechanism V.Marangozova-Martin IBD 4 RMI versus RPC u u RPC = Remote Procedure Call La technologie RPC a été développée dans les années 80 v v u RPC gère les problèmes d’appels de procédures connues dans des espaces d’adressage différents v v u Appel de procédure à distance En dehos du paradigme OO Même machine Machine différente Les problèmes gérés par le RPC v v Accès à des espaces d’adressage différents Gestion de l’hétérogénéité V.Marangozova-Martin IBD 5 RPC Machine 1 Machine 2 0xAB04 Execution Appel de fonction avec des arguments (x) f(?) 0xAB12 ? f(x) Système de communication V.Marangozova-Martin IBD 6 RPC (2) Machine 1 Machine 2 0xAB04 Execution (x) 0xAB12 f(?) 0xAB12 ? f(x) u Lors d’une distribution v Le paramètre doit être passé par valeur i.e envoyer une copie V.Marangozova-Martin IBD 7 RPC (3) u Problème de hétérogénéité v La représentation des données n’est pas la même entre différentes machines § La copie de la valeur x peut ne pas être bien interprêtée Machine 1 Machine 2 Execution f( ) 0xAB12 ? f(x) V.Marangozova-Martin IBD 8 RPC (4) u Pour un appel à distance, les données doivent être converties dans un format qui ne dépend pas de la plate-forme v u e.g. XDR – eXtensible Data Representation) Les données reçues lors d’un appel à distance doivent être converties dans le représentation interne du destinataire V.Marangozova-Martin IBD 9 Planning 1. Motivations 2. Présentation générale des applications RMI 3. L’exemple du “Hello World” 4. Comment développer les applications RMI 5. Architecture de RMI 6. L’exemple étape par étape V.Marangozova-Martin IBD 10 Présentation générale u Les applications RMI sont basées sur l’architecture client-serveur v v Un programme Java client Un programme Java serveur JVM JVM Serveur Client O3 O1 Appels de méthodes à distance O2 Objets accessibles à distance V.Marangozova-Martin IBD 11 Présentation générale (2) u RMI fournit les mécanismes pour que le client et le serveur communiquent JVM JVM Serveur Client O3 O1 Appels de méthodes à distance O2 Objets accessibles à distance V.Marangozova-Martin IBD 12 Enchainement dans les applications RMI u Le client localise les objets distants sur un serveur v Différents mécanismes pour récupérer les références § § u Le client communique avec les objets distants v Les appels de méthodes distantes sont identiques aux appels locaux § u Utiliser un service de nomage comme RMI registry ( Retourner une référence comme un résultat d’un appel à distance Les détails de la communication à distance sont gérés par RMI et sont transparents Chargement des classes des objets v Comme les objets se “baladent”, RMI fournit les mécanismes pour le chargement dynamique des classes correspondantes V.Marangozova-Martin IBD 13 Vue schématique 2 rmiregistry 1 RMI client V.Marangozova-Martin 3 IBD RMI server 14 Les objets distants u u Ce sont des objets qui ont des méthodes qui peuvent être invoquées à An objet devient distant en implémentant une interface distante v Une interface distante étend java.rmi.Remote v Chaque méthode d’une telle interface doit ajouter à sa déclaration java.rmi.RemoteException comme exception possible V.Marangozova-Martin IBD 15 Planning 1. Motivations 2. Présentation générale des applications RMI 3. L’exemple du “Hello World” 4. Comment développer les applications RMI 5. Architecture de RMI 6. L’exemple étape par étape V.Marangozova-Martin IBD 16 “Hello World” Remote object – Interface definition import java.rmi.*; public interface Hello extends Remote { // A method provided by the // remote object public String sayHello() throws RemoteException; } V.Marangozova-Martin IBD 17 Exemple (2) Remote object – Interface definition Remote object – Class implementation import java.rmi.*; import java.rmi.*; import java.rmi.server.*; public interface Hello extends Remote { public class HelloImp implements Hello { // A method provided by the // remore object public String sayHello() throws RemoteException; private String message; public Hello(String s) { message = s ; } } public String sayHello () throws RemoteException { return message ; } } V.Marangozova-Martin IBD 18 Exemple (3) Server import java.rmi.*; import java.rmi.server.*; import java.rmi.registry.*; public class HelloServer { public static void main(String [] args){ try { // Create a Hello remote object HelloImp h = new HelloImp ("Hello world !"); Hello h_stub = (Hello) UnicastRemoteObject.exportObject(h, 0); // Register the remote object in RMI // registry with a given identifier Registry registry= LocateRegistry.getRegistry(); registry.bind("Hello1”, h_stub); System.out.println ("Server ready"); } catch (Exception e) { System.err.println("Error on server :" + e) ; e.printStackTrace(); return; } V.Marangozova-Martin IBD 19 Exemple (4) Client Server import java.rmi.*; import java.rmi.server.*; import java.rmi.registry.*; import java.rmi.*; import java.rmi.registry.*; public class HelloClient { public static void main(String [] args) { public class HelloServer { public static void main(String [] args){… try { // Create a Hello remote object HelloImp h = new HelloImp ("Hello world !"); Hello h_stub = (Hello) UnicastRemoteObject.exportObject(h, 0); try { if (args.lenght < 1) { System.out.println("Usage: java HelloClient <server host>"); return; } String host = arg[0]; // Register the remote object in RMI // registry with a given identifier Registry registry= LocateRegistry.getRegistry(); registry.bind("Hello1”, h_stub); // Get remote object reference Registry registry = LocateRegistry.getRegistry(host); Hello h = (Hello) registry.lookup("Hello1"); System.out.println ("Server ready"); // Remote method invocation String res = h.sayHello(); } catch (Exception e) { System.err.println("Error on server :" + e) ; e.printStackTrace(); return; }… V.Marangozova-Martin System.out.println(res); } catch (Exception e) { System.err.println("Error on client: " + e) ; }… IBD 20 Planning 1. Motivations 2. Présentation générale des applications RMI 3. L’exemple du “Hello World” 4. Comment développer les applications RMI 5. Architecture de RMI 6. L’exemple étape par étape V.Marangozova-Martin IBD 21 Etapes lors du développement d’une application RMI 1. Concevoir et implémenter les composants (code sources) de l’application 2. Compiler les sources. 3. Rendre les classes accessibles à travers le réseau 4. Démarrer l’application V.Marangozova-Martin IBD 22 1/ Conception et implémentation u Définir l’architecture de l’application = décider v v v u Quels objets sont locaux Lesquels sont distants Qui est serveur (createur d’objets distants) et qui est client (utilisation d’objets distants) Définir les interfaces distantes v v Quelles méthodes devraient être appelables à distance Quels sont les paramètres et les résultats § § Quels types Quelles classes § v Définir de nouvelles classes/interfaces sinécessaire Principe de base § § Se détacher des implémentations mais utiliser des interfaces Les clients accèdent à des interfaces, non à des implémentations V.Marangozova-Martin IBD 23 1/ Conception et implémentation (2) Implémenter les objets distants u v v v Les objets distants implémentent une ou plusieurs interfaces distantes Les objets distants peuvent aussi implémenter des interfaces/ méthodes locales Toutes les classes locales qui sont utilisées dans les paramètres/ résultats des appels distants doivent être implémentées aussi Implémenter les serveurs u v v Les serveurs sont ceux qui créent et qui rendent disponibles des objets distants Ils sont impplémentées après les objets distants Implémenter les clients u v Les clients peuvent être implémentées une fois que les interfaces distantes sont définies V.Marangozova-Martin IBD 24 Etapes lors du développement d’une application RMI 1. Concevoir et implémenter les composants (code sources) de l’application 2. Compiler les sources. 3. Rendre les classes accessibles à travers le réseau 4. Démarrer l’application V.Marangozova-Martin IBD 25 Etape 2/ Compilation des sources u Utilisation du compilateur standard javac u Les sources incluent v la déclaration des interfaces distantes v leurs implémentations v les classes serveur v les classes client u Avant Java Platform, Standard Edition 5.0 v il était nécessaire d’effectuer une étape supplémentaire v avec le compilateur rmic v pour créer les stubs/squelettes pour la communication distante v ce n’est plus nécessaire V.Marangozova-Martin IBD 26 RMI Stubs and Skeletons u « RMI uses a standard mechanism (employed in RPC systems) for communicating with remote objects: stubs and skeletons. » v http://docs.oracle.com/javase/7/docs/platform/rmi/spec/rmi-arch2.html Client Serveur O3 O1 O2 V.Marangozova-Martin IBD 27 Etapes lors du développement d’une application RMI 1. Concevoir et implémenter les composants (code sources) de l’application 2. Compiler les sources. 3. Rendre les classes accessibles à travers le réseau 4. Démarrer l’application V.Marangozova-Martin IBD 28 Etape 3/ Rendre les classes accessibles u u Classes? Accessibles? Classes v v v « Compiled code to be executed by the Java Virtual Machine is represented using a hardware- and operating systemindependent binary format, …known as the class file format. » The class file format precisely defines the representation of a class or interface, including details such as byte ordering that might be taken for granted in a platform-specific object file format. Bytecode 0: bipush 2: istore_0 i=5; V.Marangozova-Martin IBD 5 29 Existence des classes au sein de la JVM Source: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html u The Java Virtual Machine dynamically loads, links and initializes classes and interfaces. v v v u Loading is the process of finding the binary representation of a class or interface type with a particular name and creating a class or interface from that binary representation. Linking is the process of taking a class or interface and combining it into the run-time state of the Java Virtual Machine so that it can be executed. Initialization of a class or interface consists of executing the class or interface initialization method <clinit> Dans la JVM, les classes sont représentées par des objets V.Marangozova-Martin IBD 30 Chargement de classes: ClassLoader C’est où? Credit: http://geekrai.blogspot.fr/2013/05/class-loading-and-unloading-in-jvm.html V.Marangozova-Martin IBD 31 Codebase u Codebase = un emplacement où on peut trouver des définitions de classes v v CLASSPATH = emplacement local Possibilité d’avoir des emplacements distants § § accessibles par le réseau HTTP ou FTP V.Marangozova-Martin IBD 32 Etapes lors du développement d’une application RMI 1. Concevoir et implémenter les composants (code sources) de l’application 2. Compiler les sources. 3. Rendre les classes accessibles à travers le réseau 4. Démarrer l’application V.Marangozova-Martin IBD 33 Etape 4/ Démarrer l’application u Démarrer le service de gestion (nommage, enregistrement) d’objets RMI v Outil rmiregistry u Démarrer v le serveur Outil java u Démarrer v 1. rmiregistry le client 3. RMI client 2. RMI server Outil java V.Marangozova-Martin IBD 34 Planning 1. Motivations 2. Présentation générale des applications RMI 3. L’exemple du “Hello World” 4. Comment développer les applications RMI 5. Architecture de RMI 6. L’exemple étape par étape V.Marangozova-Martin IBD 35 Premier objectif de RMI u Cacher v v la distribution Après l’initialisation/récupération de références des objets distants Les appels aux objets distants sont identiques aux appels locaux V.Marangozova-Martin IBD 36 Transparence RMI (2) Client Server import java.rmi.*; import java.rmi.server.*; import java.rmi.registry.*; import java.rmi.*; import java.rmi.registry.*; public class HelloServer { public class HelloClient { public static void main(String [] args) { public static void ... main(String [] args){ try { if (args.lenght < 1) { System.out.println("Usage: java HelloClient <server host>"); return; } String host = arg[0]; // Get remote object reference Registry registry = LocateRegistry.getRegistry(host); Hello h = (Hello) registry.lookup("Hello1"); try { // Create a Hello remote object HelloImp h = new HelloImp ("Hello world !"); Hello h_stub = (Hello) UnicastRemoteObject.exportObject(h, 0); // Register the remote object in RMI // registry with a given identifier Registry registry= LocateRegistry.getRegistry(); registry.bind("Hello1”, h_stub); // Remote method invocation String res = h.sayHello(); System.out.println(res); } catch (Exception e) { System.err.println("Error on client: " + e) ; } System.out.println ("Server ready"); } catch (Exception e) { System.err.println("Error on server :" + e) ; e.printStackTrace(); return; } } } } V.Marangozova-Martin } IBD 37 Transparence RMI (3) u Le serveur et le client RMI v Sont des objets Java normaux v Le serveur fournit une spécification de l’interface distante v A partir de cette spécification, sont générées des classes additionnelles v Ce sont ces classes qui s’occupent de la communication à distance entre le client et le serveur v Ces classes représentent le Stub (client) and le Skeleton (serveur) V.Marangozova-Martin IBD 38 RMI Stub et Skeleton (rappel) Serveur Client O3 O1 O2 V.Marangozova-Martin IBD 39 Couches RMI Client Server Stub Skeleton RMI reference layer RMI transport layer TCP/IP V.Marangozova-Martin IBD 40 Architecture RMI (4) u Couche stub and skeleton v v Stub § Objet de référence qui a la même interface que l’objet distant § Intercepte l’appel § Prépare les arguments Client Server Stub Skeleton RMI reference layer RMI transport layer TCP/IP Skeleton § Reçoit l’appel § Récupère les infos d’objet/méthode/arguments § Redirige vers l’objet serveur § Attend le résultat (modèle client-serveur) § Envoie le résultat au stub V.Marangozova-Martin IBD 41 Architecture RMI (5) u Couche v S’occupe de la sémantique de l’invocation de la méthode § Une invocation ou plusieurs § v référence RMI objet unique ou plusieurs objets dupliqués Sémantique de la référence serveur § Activation du serveur Client Server Stub Skeleton RMI reference layer RMI transport layer TCP/IP V.Marangozova-Martin IBD 42 Architecture RMI (6) u La couche transport RMI v v v v v v Client Server Connexions aux sites distants Stub Skeleton Gestion connexions. RMI reference layer RMI transport layer Monitoring de l’état des connexions TCP/IP Ecoute d’appels rentrants Table des objets accessible à distance géré localement Connexions avec les sites qui appellent les objets serveur locaux V.Marangozova-Martin IBD 43 Outline 1. Motivations 2. Overview of RMI-based distributed applications 3. A simple example 4. Methodology to build distributed applications using RMI 5. The architecture of RMI 6. A detailed example step by step V.Marangozova-Martin IBD 44 Planning 1. Motivations 2. Présentation générale des applications RMI 3. L’exemple du “Hello World” 4. Comment développer les applications RMI 5. Architecture de RMI 6. L’exemple étape par étape V.Marangozova-Martin IBD 45 Les étapes de l’exemple Server side Client side Define the remote interface provided by the remote object Implement the remote object Implement the server program Implement the client program Compile the source files Compile the source files Start the RMI regsitry Start the server V.Marangozova-Martin Start the client IBD 46 L’exemple en détail (2) u Define the remote interface provided by the remote object: v v v Extends java.rmi.Remote Defines the set of methods that can be called remotely Each method must declare java.rmi.RemoteException import java.rmi.Remote; Import java.rmi.RemoteException; public interface Hello extends Remote { // A method provided by the remore object public String sayHello() throws RemoteException; } V.Marangozova-Martin IBD 47 L’exemple en détail (3) u Implement the remote object in a class: v v v Declare the remote interface being implemented Implement the set of methods that can be called remotely Implement any other local method that can not be invoked remotely Import java.rmi.RemoteException; public class HelloImp implements Hello { private String message; public Hello(String s) { message = s ; } public String sayHello () RemoteException { return message ; } } V.Marangozova-Martin IBD 48 L’exemple en détail (4) u Implement the remote object in a class – Passing objects in RMI v Arguments to remote methods or return values from remote methods can be of any type § § § v Non remote objects passed to or returned from r emote methods must be serializable § v Primitive data types (e.g. int, float, etc.) Remote objects Local objects They must implement the java.io.Serializable interface Some object types do not meet any of these criteria; they cannot be passed to or returned from remote methods § § Most of these objects, such as threads or file descriptors, encapsulate information that makes sense only within a single address space Many of the core classes (e.g. classes in the packages java.lang and java.util) implement the Serializable interface V.Marangozova-Martin IBD 49 Invocation de méthode distante JVM Client local object should be remote object primitive=>type Serializable = Serializable Serveur O3 refO3.meth(10, localO, refO2) O1 Appels de méthodes à distance O2 localO V.Marangozova-Martin Objets accessibles à distance IBD 50 L’exemple en détail (5) u Passage d’arguments et de résultats v Objets distants : par référence § § § v La référence est le stub Le stub est un proxy/intercepteur Cela veut dire que tout changement sur ‘objet distant sont réperutés sur le serveur initial Objets locaux : par valeur (copies) § § § § Avec la sérialization Tout est copié sauf les attributs static ou transient La manière dont un objet est sérialisé peut etre modifiée Le destinataire reçoit une copie et tous les changements restent locaux, sur cette copie V.Marangozova-Martin IBD 51 L’exemple en détail (6) u Implement the server program: v v v Create and install a security manager Create and export remote objects Register remote objects with the RMI registry import java.rmi.server.UnicastRemoteObject; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class HelloServer { public static void main(String [] args){ try { if (System.getSecurityManager() == null) { System.setSecurityManager(new SecurityManager());} HelloImp h = new HelloImp ("Hello world !"); Hello h_stub = (Hello) UnicastRemoteObject.exportObject(h, 0); Registry registry= LocateRegistry.getRegistry(); registry.bind("Hello1”, h_stub); System.out.println ("Server ready"); } catch (Exception e) { System.err.println("Error on server :" + e) ; e.printStackTrace(); return; } } } V.Marangozova-Martin IBD 52 SecurutyManager u u u u A security manager is an object that defines a security policy for an application. This policy specifies actions that are unsafe or sensitive. Any actions not allowed by the security policy cause a SecurityException to be thrown. An application can also query its security manager to discover which actions are allowed. u A security manager determines whether downloaded code has access to the local file system or can perform any other privileged operations u If an RMI program does not install a security manager, RMI will not download classes (other than from the local class path) for objects received as arguments or return values of remote method invocations u This restriction ensures that the operations performed by downloaded code are subject to a security policy V.Marangozova-Martin IBD 53 SecurutyManager (2) SecurityManager sm = System.getSecurityManager(); if (sm != null) context = sm.getSecurityContext(); if (sm != null) sm.checkPermission(permission, context); u Permissions fall into these categories: v u The classes managing these various permission categories are v u u File, Socket, Net, Security, Runtime, Property, AWT, Reflect, and Serializable. java.io.FilePermission, java.net.SocketPermission, java.net.NetPermission, java.security.SecurityPermission, java.lang.RuntimePermission, java.util.PropertyPermission, java.awt.AWTPermission, java.lang.reflect.ReflectPermission, and java.io.SerializablePermission. http://docs.oracle.com/javase/7/docs/technotes/guides/security/permissions.html http://docs.oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.html V.Marangozova-Martin IBD 54 Exemples de fichiers de securité (3) u Policy files grant codeBase "file:/home/ann/src/" { permission java.security.AllPermission; }; grant codeBase "file:/home/sysadmin/" { permission java.io.FilePermission "/tmp/abc", "read"; }; grant codeBase "file://f:/derby/lib/derby.jar" { permission java.lang.RuntimePermission "createClassLoader"; permission java.util.PropertyPermission "derby.*", "read"; permission.java.io.FilePermission "${derby.system.home}","read"; permission java.io.FilePermission "${derby.system.home}${/} -", "read,write,delete"; permission java.util.PropertyPermission "derby.storage.jvmInstanceId", "write"; }; V.Marangozova-Martin IBD 55 A detailed example step by step (8) u Implement the client program: v v v Create and install a security manager Get a remote object reference Perform remote method invocations on the remote object import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class HelloClient { public static void main(String [] args) { if (args.lenght < 1) { System.out.println("Usage: java HelloClient <server host>"); return; } try { if (System.getSecurityManager() == null) { System.setSecurityManager(new SecurityManager()); } String host = arg[0]; Registry registry = LocateRegistry.getRegistry(host); Hello h = (Hello) registry.lookup("Hello1"); String res = h.sayHello(); System.out.println(res); } catch (Exception e) { System.err.println("Error on client: " + e); e.printStackTrace(); return; } } } V.Marangozova-Martin IBD 56 L’exemple en détail (9) u Compiler les sources v Dans cette exemple nous séparons § § § § v Compile the remote interface and build a jar file that contains it § § v The remote interface The remote object implementation class The server program class The client program class javac –d classes –classpath .:classes src/Hello.java jar cvf lib/Hello.jar classes/Hello.class Compile the remote object implementation class and build a jar file that contains it § § javac –d classes –classpath .:classes:lib/Hello.jar src/HelloImp.java jar cvf lib/HelloImp.jar classes/HelloImp.class V.Marangozova-Martin IBD 57 A detailed example step by step (10) u Compile and run server-side and client-side programs: v Server-side § Compile the server program § § Start RMI registry § § rmiregistry & Start the server § v javac –d classes –classpath .:classes:lib/Hello.jar:lib/HelloImp.jar src/ HelloServer.java java –classpath .:classes:lib/Hello.jar:lib/HelloImp.jar HelloServer Client-side § Compile the client program § § javac –d classes –classpath .:classes:lib/Hello.jar src/HelloClient.java Start the client § java –classpath .:classes:lib/Hello.jar HelloClient V.Marangozova-Martin IBD 58 Références u u u u u Oracle. Trail: RMI. http://docs.oracle.com/javase/tutorial/rmi/ M. Boger. Java in Distributed Systems: Concurrency, Distribution and Persistence. Wiley, 2001. Lectures given by Sacha Krakowiak, http://sardes.inrialpes.fr/people/krakowia/ http://www.securingjava.com/chapter-two/chaptertwo-7.html https://www.prologin.org/docs/java/technotes/guides/rmi/ codebase.html V.Marangozova-Martin IBD 59 V.Marangozova-Martin IBD 60