Plan. Java Remote Method Invocation. 1. Caractéristiques. 1. Caractéristiques



Documents pareils
Remote Method Invocation (RMI)

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

RMI le langage Java XII-1 JMF

Conception de serveurs d'applications ouverts

Remote Method Invocation en Java (RMI)

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

Calcul Parallèle. Cours 5 - JAVA RMI

Remote Method Invocation Les classes implémentant Serializable

Intergiciel - concepts de base

Programmation répartie RPC & RMI

Java - RMI Remote Method Invocation. Java - RMI

Java Naming and Directory Interface

Programmation réseau avec Java. 3/7 RMI, un peu de sécurité et CORBA

Cours 1: Java et les objets

Initiation à JAVA et à la programmation objet.

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Gestion distribuée (par sockets) de banque en Java

Implementing a simple RMI Application over the Internet (using and comparing HTTP tunneling, RMI Proxy)

Programmer en JAVA. par Tama

Dis papa, c est quoi un bus logiciel réparti?

Modèle client-serveur Plan. Modèle client-serveur. Modèle client-serveur définition. Modèle client-serveur communication par messages.

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Une introduction à Java

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

as Architecture des Systèmes d Information

TP1 : Initiation à Java et Eclipse

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

Systèmes répartis. Fabrice Rossi Université Paris-IX Dauphine. Systèmes répartis p.1/49

Plan du cours. Historique du langage Nouveautés de Java 7

Intergiciels pour la répartition CORBA : Common Object Request Broker. Patrice Torguet torguet@irit.fr Université Paul Sabatier

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

.NET remoting. Plan. Principes de.net Remoting

Projet gestion d'objets dupliqués

Traitement de données

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Projet de programmation (IK3) : TP n 1 Correction

Auto-évaluation Programmation en Java

Développement, déploiement et sécurisation d'applications JEE

La carte à puce. Jean-Philippe Babau

Etude critique de mécanismes de sécurité pour l architecture Jini

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Architecture JEE. Objectifs attendus. Serveurs d applications JEE. Architectures JEE Normes JEE. Systèmes distribués

Chapitre I Notions de base et outils de travail

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

Connexion à SQL Server 2005 à partir du serveur d application SJSAS 9 Utilisation d une interface JDBC

Présentation de Java. Olivier de Pertat IT GROUP

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

2 Chapitre 1 Introduction

Java Licence Professionnelle CISII,

JOnAS Day 5.1. Clustering

INITIATION AU LANGAGE JAVA

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Premiers Pas en Programmation Objet : les Classes et les Objets

2. MAQUETTAGE DES SOLUTIONS CONSTRUCTIVES. 2.2 Architecture fonctionnelle d un système communicant.

Bases Java - Eclipse / Netbeans

Objets et Programmation. origine des langages orientés-objet

Généralités sur le Langage Java et éléments syntaxiques.

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Utiliser Java sans BlueJ

Java Aspect Components (JAC)

Java DataBaseConnectivity

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Principes. 2A-SI 3 Prog. réseau et systèmes distribués 3. 3 Programmation en CORBA. Programmation en Corba. Stéphane Vialle

PROGRAMMATION PAR OBJETS

Création d une application JEE

Chapitre 10. Les interfaces Comparable et Comparator 1

Applications des patrons de conception

Programmation par les Objets en Java

NFP111 Systèmes et Applications Réparties

JAVA TD0. Prise en main du langage Environnement de base JAVA 1

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

JAVA. Introduction à la programmation objet avec java 1/4. Nadir BOUSSOUKAIA

Programmation Par Objets

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

Java c est quoi? Java pourquoi?

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Héritage presque multiple en Java (1/2)

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Composants Logiciels. Le modèle de composant de CORBA. Plan

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Corrigé des exercices sur les références

Java c est quoi? Java. Java. Java : Principe de fonctionnement 31/01/ Vue générale 2 - Mon premier programme 3 - Types de Programme Java

NON URGENTE TEMPORAIRE DEFINITIVE. OBJET : FONCTIONNEMENT OmniVista 4760 SUR UN RÉSEAU VPN / NAT

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Manuel d implémentation des Web Services Sous Axis1 et Axis2/Tomcat/linux. Par Pr Bouabid EL OUAHIDI

GEI 465 : Systèmes répartis

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

Synchro et Threads Java TM

Un ordonnanceur stupide

CORBA. (Common Request Broker Architecture)

La base de données XML exist. A. Belaïd

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

Langage Java. Classe de première SI

Programmation Réseau. ! UFR Informatique ! Jean-Baptiste.Yunes@univ-paris-diderot.fr

La technologie Java Card TM

Introduction aux intergiciels

Transcription:

Plan Java Remote Method Invocation Lionel Seinturier Université des Sciences et Technologies de Lille 1. Caractéristiques 3. Services 5. Protocole Lionel.Seinturier@lifl.fr 8/9/06 RMI 1 Lionel Seinturier RMI 2 Lionel Seinturier Java RMI 1. Caractéristiques Java RMI 1. Caractéristiques Solution Sun pour l'invocation à distance de méthodes Java inclus par défaut dans le JDK depuis 1.1 nouveau modèle de souches dans JDK 1.2 génération dynamique des souches dans JDK 1.5 implantations alternatives (open-source) - NinjaRMI (Berkeley) - Jeremie (ObjectWeb) package java.rmi + outils - générateur de souches - serveur de noms - démon d'activation Un mécanisme de RPC dédié aux objets Java stubs côté client skeletons côté serveur encodages/désencodages données + communications rsx types simples (int, float,...) objet local objet RMI distant transmission par copie transmission par copie (sérialisation) transmission par référence RMI 3 Lionel Seinturier RMI 4 Lionel Seinturier

Principes Chaque classe d'objets serveur doit être associée à une interface seules les méthodes de l'interface pourront être invoquées à distance 1. Ecriture d'une interface 2. Ecriture d'une classe implantant l'interface 3. Ecriture du programme serveur 4. Ecriture du programme client 1. déclaration des services accessibles à distance 2. définition du code des services 3. instanciation et enregistrement de l'objet serveur 4. interactions avec le serveur Ecriture d'une interface interface Java normale doit étendre java.rmi.remote toutes les méthodes doivent lever java.rmi.remoteexception import java.rmi.remote; import java.rmi.remoteexception; interface CompteInterf extends Remote { public String gettitulaire() throws RemoteException; public float solde() throws RemoteException; public void deposer( float montant ) throws RemoteException; public void retirer( float montant ) throws RemoteException; public List historique() throws RemoteException; RMI 5 Lionel Seinturier RMI 6 Lionel Seinturier Ecriture d'une classe implantant l'interface classe Java normale implantant l'interface doit étendre java.rmi.server.unicastremoteobject constructeurs doivent lever java.rmi.remoteexception si pas de constructeur, en déclarer un vide qui lève java.rmi.remoteexception import java.rmi.server.unicastremoteobject; import java.rmi.remoteexception; public class CompteImpl extends UnicastRemoteObject implements CompteInterf { private String nom; private float solde; public CompteImpl(String nom) throws RemoteException { super(); this.nom = nom; public String gettitulaire() { return nom;... RMI 7 Lionel Seinturier Ecriture d'une classe implantant l'interface 1. Compilation de l'interface et de la classe avec javac 2. Génération des souches clientes et serveurs à partir du bytecode de la classe avec rmic javac CompteInterf.java CompteImpl.java rmic CompteImpl Quelques options utiles de rmic -d path répertoire pour les fichiers générés -keep conserve le code source des souches générées -v1.1 souches version JDK 1.1 -v1.2 souches version JDK 1.2 -vcompat par défaut, souches pour JDK 1.1 et 1.2 RMI 8 Lionel Seinturier

Ecriture d'une classe implantant l'interface Fichiers générés pour chaque classe d'objet serveur RMI rmic CompteImpl CompteImpl_Stub.java : souche cliente CompteImpl_Skel.java : souche serveur Ecriture du programme serveur 1. Instanciation de la classe serveur 2. Enregistrement de l'instance dans le serveur de noms RMI public class Serveur { public static void main(string[] args) throws Exception { CompteInterf compte = new CompteImpl("Bob"); Naming.bind("Bob",compte); - compte prêt à recevoir des invocations de méthodes - programme "tourne" en permanence tant que compte reste enregistré dans le runtime RMI (attention : du service de nommage) - désenregistrement : UnicastRemoteObject.unexportObject(compte,false) false : attente fin les requêtes en cours / true : immédiat RMI 9 Lionel Seinturier RMI 10 Lionel Seinturier Ecriture du programme client 1. Recherche de l'instance dans le serveur de noms 2. Invocation des méthodes public class Client { public static void main(string[] args) throws Exception { CompteInterf compte = (CompteInterf) Naming.lookup("Bob"); compte.deposer(10); System.out.println( compte.solde() ); Exécution des programmes 1. Lancer le serveurs de noms (rmiregistry) - une seule fois - doit avoir accès au bytecode de la souche cliente ( CLASSPATH) 2. Lancer le programme serveur 3. Lancer le programme client RMI 11 Lionel Seinturier RMI 12 Lionel Seinturier

Compléments Passage de paramètres avec RMI types de base (int, float,...) par copie objets implantant java.io.serializable passés par copie (sérialisés) objets implantant java.rmi.remote passés par référence la référence RMI de l'objet est transmise dans les autres cas une exception java.rmi.marshalexception est levée Compléments Ecriture d'une classe d'objet serveurs héritage UnicastRemoteObject pas toujours possible (si classe à une hiérarchie d'héritage) méthode static UnicastRemoteObject.exportObject(Remote) enregistrement côté serveur Client Serveur new Client Serveur new RMI 13 Lionel Seinturier RMI 14 Lionel Seinturier Compléments Objets serveur prévus pour fonctionner avec types de liaisons 1. objet distant joignable en point à point 2. objets distants répliqués 3. objets distants joignables par diffusion En pratique seul 1. mis en oeuvre (classe UnicastRemoteObject) Références d'objets distants RMI avec UnicastRemoteObject - adresse IP - n port TCP - identifiant local d'objet (entier) Compléments Invocations concurrentes de méthodes RMI Un objet serveur RMI est susceptible d'être accédé par plusieurs clients simultanément toujours concevoir des méthodes RMI thread-safe i.e. exécutable concurrement de façon cohérente la création de thread est faite automatiquement par le runtime RMI RMI 15 Lionel Seinturier RMI 16 Lionel Seinturier

Compléments Services RMI Serveurs de noms Problématique : publier la référence du serveur pour que les clients y accède machine "connue de tous" sur le réseau (idem DNS) service de nommage service d'activation d'objets ramasse-miettes réparti Facilité, mais pas obligation il "suffit" que le client connaisse le point d'accès la souche cliente est sérialisable sauvegarde dans un fichier lecture par le client Récupération de la souche cliente côté serveur java.rmi.server.remoteobject.tostub(remote) RMI 17 Lionel Seinturier RMI 18 Lionel Seinturier Service de nommage Permet d'enregistrer des liaisons entre un objet serveur et un nom symbolique par défaut port 1099 (autre port : rmiregistry 12345) noms "plats" (pas de noms composés, pas de hiérarchies) URL RMI rmi:// et :1099 machine.com rmi://machine.com:1099/nomsymbolique facultatifs par défaut localhost Serveur de noms demarrable de façon autonome dans un shell avec l'outil rmiregistry dans un programme par appel de la méthode static java.rmi.registry.locateregistry.createregistry(int port) Service de nommage Classe java.rmi.naming pour l'accès local Toutes les méthodes sont static 1. void bind(string,remote) enregistrement d'un objet 2. void rebind(string,remote) ré enregistrement d'un objet 3. void unbind(string) désenregistrement d'un objet 4. String[] list(string) liste des noms d'objets enregistrés 5. Remote lookup(string) recherche d'un objet Les paramètres String correspondent à une URL d'objet RMI 1 2 3 accessibles localement uniquement 1 lève une exception si le nom est déjà enregistré 4 URL du rmiregistry RMI 19 Lionel Seinturier RMI 20 Lionel Seinturier

Service de nommage pour l'accès distant Classe java.rmi.registry.locateregistry static Registry getregistry( String host, int port ) java.rmi.registry.registry : même méthodes que Naming Service d'activation d'objets Objets serveurs activables à la demande (depuis JDK 1.2) en fonction demande clients démon rmid package java.rmi.activation Avantages - évite d'avoir des objets serveurs actifs en permanence (ie "tournant" dans une JVM) trop coûteux si beaucoup d'objets serveurs - permet d'avoir des références d'objets persistantes en cas de crash d'objet serveur le démon peut le relancer avec la même référence les clients continuent à utiliser la même référence RMI 21 Lionel Seinturier RMI 22 Lionel Seinturier Service d'activation d'objets public class Serveur { public static void main(string[] args) throws Exception { ActivationGroupDesc gdesc = new ActivationGroupDesc(null,null); ActivationGroupID gid = ActivationGroup.getSystem().registerGroup(gDesc); ActivationGroup.createGroup(gID,gDesc,0); MarshalledObject mo = new MarshalledObject("Bob"); ActivationDesc desc = new ActivationDesc("CompteImpl","",mo); CompteInterf compte = (CompteInterf) Activatable.register(desc); Naming.bind("Bob",compte); Extension du principe : pool d'objets Avoir un ensemble d'objets prêts à traiter les requêtes Même problématique que le pool de threads gestion de la taille du pool (fixe, variable) à programmer Programme client inchangé Lancer rmiregistry et démon d'activation (rmid) RMI 23 Lionel Seinturier RMI 24 Lionel Seinturier

Ramasse-miettes réparti Récupérer les ressources (mémoire,...) occupées par un objet que personne ne référence i.e. que l'on ne pourra plus jamais accéder Difficulté : environnement distribué donc référencement à distance Dans une JVM : mécanisme mark-and-sweep 1. parcours du graphe de référencement des objets 2. destruction des objets non visités Avec RMI : double mécanisme géré par le Remote Reference Manager - comptage de référence : de clients référençant l'objet -bail(lease) : mémoire "louée" à l'objet pour un temps fini Ramasse-miettes réparti Comptage chaque transmission de référence +1 chaque fin de référencement -1 Bail par défaut 10 min (réglable par la propriété java.rmi.dgc.leasevalue) but : se prémunir - partitions de réseaux - pertes de message de déréférencement Si le compteur tombe à 0 ou si le bail expire, l'objet devient candidat pour le ramassage local (mark-and-sweep) RMI 25 Lionel Seinturier RMI 26 Lionel Seinturier Ramasse-miettes réparti Attention : un objet serveur "normal" instancié par un programme serveur qui "tourne" en permanence est toujours référencé par ce programme il n'est pas ramassé (même au delà des 10 min) Ramasse-miettes réparti Interface de notification du ramassage réparti interface Unreferenced { void unreferenced(); le ramassage concerne des objets créés dont on "perd" la référence Client BarRemote b = foo();... b = null; Serveur BarRemote foo() { return new BarRemote(); RMI 27 Lionel Seinturier RMI 28 Lionel Seinturier

RMI/IIOP Chargement dynamique de classes (RMIClassLoader) RMI et les firewalls personnalisation des communications RMI/IIOP 2 possibilités pour acheminer les requêtes IIOP - JRMP : protocole Sun (UnicastRemoteObject) utilisé par défaut - IIOP : protocole OMG pour CORBA RMI avec IIOP permet intéropérabilité RMI - CORBA RMI 29 Lionel Seinturier RMI 30 Lionel Seinturier RMI/IIOP Modèle de programmation les classes doivent étendre javax.rmi.portableremoteobject les souches doivent être générées avec rmic -iiop 2 fichiers générés pour chaque classe d'objet serveur _nomclasse_stub.java : souche cliente _nomclasse_tie.java : souche serveur service de nommage JNDI (Java Naming and Directory Interface) - outil tnameserv les conversions de type sur les objets distants doivent utiliser la méthode static PortableRemoteObject.narrow() RMI/IIOP JNDI (Java Naming and Directory Interface) API unifie l accès à serveurs de noms RMI 31 Lionel Seinturier RMI 32 Lionel Seinturier

RMI/IIOP Exemple de code RMI/IIOP Cas où le serveur de noms n'est pas local import javax.naming.context; import javax.naming.initialcontext; public class CompteImpl extends PortableRemoteObject implements CompteInterf {... Hashtable env = new Hashtable(); env.put( "java.naming.factory.initial", "com.sun.jndi.cosnaming.cnctxfactory" ); env.put( "java.naming.provider.url", "iiop://localhost:1704" ); Context ic = new InitialContext(env); public class Serveur { public static void main(string[] args) throws Exception { CompteInterf compte = new CompteImpl("Bob"); Context ic = new InitialContext(); ic.rebind( "Bob", compte ); RMI 33 Lionel Seinturier RMI 34 Lionel Seinturier RMI/IIOP Restrictions liées à RMI/IIOP les constantes définies dans les interfaces Remote doivent être de type primitif ou de type String et être évaluables à la compilation pas de surcharge pour les méthodes des interfaces Remote i.e. pas 2 méthodes avec le même nom et des profils pas de mécanisme de ramasse-miettes réparti les fonctionnalités fournies par les interfaces suivantes ne sont pas utilisables UnicastRemoteObject, RMISocketFactory, Unreferenced, java.rmi.dgc.* Chargement dynamique de classes Java charge les.class à la demande à partir du disque (CLASSPATH) RMI introduit en + un mécanisme de chargement des classes à distance par HTTP ou FTP Avantage : classes déployées sur 1 seul site (+ rapide + simple à gérer) Inconvénient : single point of failure Utilisation propriété java.server.rmi.codebase : URL du serveur de téléchargement classe RMISecurityManager RMI 35 Lionel Seinturier RMI 36 Lionel Seinturier

RMI et les firewalls But : utiliser RMI en passant au travers de firewalls RMI et les firewalls Fonctionnement Pb : RMI ouvre des cx TCP directes sur des ports quelconques Solution : encapsuler les requêtes RMI dans des requêtes HTTP POST tunneling HTTP Le client essaie d'établir une cx directe Cas où le client est derrière un firewall échec Le client essaie de passer par un proxy web local et de le faire contacter le serveur à l'@ http://hostname:port - on suppose que le firewall bloque le traffic RMI mais laisse passer HTTP - le client doit positionner la propriété http.proxyhost RMI 37 Lionel Seinturier RMI 38 Lionel Seinturier RMI et les firewalls Fonctionnement Si de nouveau échec Cas où le client est derrière un firewall RMI et les firewalls Conclusion ça marche mais perte de performances mais aléas de sécurité éventuels à n'utiliser que lorsqu'on ne peut vraiment pas faire autrement 1 niveau supplémentaire d'indirection hyp : le serveur dispose d'un prog. CGI qui redirige les req. vers l'obj. serv. RMI le client essaie de contacter le serveur à l'@ http://hostname:80/cgi-bin/java-rmi?forward=<port> RMI 39 Lionel Seinturier RMI 40 Lionel Seinturier

Personnalisation des communications RMI utilise des sockets TCP côté client et serveur attribuées automatiquement par défaut Possibilité de personnaliser ces sockets pour - forcer l'utilisation de sockets précises - tracer les communications - crypter et/ou signer les données - introduire des traitements "à l'insu" des objets clients/serveurs RMI Personnalisation des communications interface RMIClientSocketFactory { java.net.socket createsocket( String host, int port ); interface RMIServerSocketFactory { java.net.serversocket createserversocket( int port ); déf. 2 classes qui implantent ces interfaces déf. des sous-classes de Socket et ServerSocket pour personnaliser le fonctionnement des sockets ex : javax.net.ssl.sslsocket, javax.net.ssl.sslserversocket redéfinir le constructeur protected UnicastRemoteObject( int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf ) - ou utiliser static UnicastRemoteObject.export(Remote,int,..,..) RMI 41 Lionel Seinturier RMI 42 Lionel Seinturier Protocole JRMP 5. Protocole Protocole de transport des invocations de méthodes distantes pour Java RMI Messages sortants Call : véhicule une invoc. de méth. (+ calldata) Ping : teste le bon fonctionnement d un serveur DcgAck : utilisé par l algo. de ramasse-miettes pour signaler que les obj. dist. retournés par le serveur ont été reçus par le client Messages entrants Return : véhicule le retour de l invoc. (+ returnvalue) HttpReturn : idem mais encapsulé dans une requête HTTP (+ returnvalue) PingAck : acquittement d un message Ping 5. Protocole Structure des paquets échangés par le protocole RMI 4 octets 2 octets 1 octet n octets En-tête Version Protocole Message(s) En-tête : magic number (JRMI) Version : numéro de version du protocole Protocole : 3 possibilités SingleOpProtocol : 1 seule invoc. par paquet (cas de RMI sur HTTP) StreamProtocol : +sieurs invoc. vers un même obj. les unes à la suite MultiplexProtocol : +sieurs invoc. vers une même machine multiplexées sur la même connexion RMI 43 Lionel Seinturier RMI 44 Lionel Seinturier

Multipléxage de connexion 5. Protocole But : transmettre +sieurs invocations RMI sur une même connexion TCP RMI TCP RMI Protocole de multiplexage OPEN, CLOSE, CLOSEACK : pour gérer une connexion RMI multiplexée REQUEST, TRANSMIT : pour assurer le transport de l information Mécanisme de contrôle de flux 5. Protocole But : éviter qu un buffer plein pour 1 connexion bloque toutes les autres éviter qu 1 connexion qui ne se termine pas bloque toutes les autres (par exemple en cas d appels récursifs) 2 compteurs (en nombre d octets) pour chaque cx RMI multiplexée input request count (irc) output request count (orc) irc++ irc-- REQUEST TRANSMIT orc++ orc-- irc et orc ne doivent jamais être négatifs irc ne doit pas dépasser une valeur (en nb d octets) qui le bloquerait RMI 45 Lionel Seinturier RMI 46 Lionel Seinturier Bibliographie Java RMI. W. Grosso. O'Reilly. jguru RMI Tutorial http://developer.java.sun.com/developer/onlinetraining/rmi/rmi.html Guide RMI. Sun. http://java.sun.com/products/jdk1.4/docs/guide/rmi/ RMI-IIOP. IBM. http://www.ibm.com/java/jdk/rmi-iiop/ RMI 47 Lionel Seinturier