IV. Les objets répartis 1
Plan 1. Client/Server OO 2. Java RMI 2
1 Modèle de prog. Client/Serveur OO 1.1 Nommage 1.2 Sécurité d accès 1.3 Durée de vie 1.4 Objets concurrents 1.5 Synchronisation 3
1 Modèle de prog. Client/Serveur OO Applications souvent en mode client / serveur les clients font appel à des services offerts par des serveurs distants API sockets sont de trop bas niveau et nécessitent allocation manuelle des sockets / threads sérialisation manuelle des appels de services distants emballage / déballage des données des messages sérialisation manuelle des objets complexes pas d annuaire ni d autres services «middleware» 4
1 Modèle de prog. Client/Serveur OO Les applications sont de plus en plus conçues selon une approche orientée objet «bonnes» propriétés de l objet (encapsulation, modularité, réutilisation, polymorphisme, composition) Objet = unité de désignation et de distribution Permettre la communication directe et transparente entre objets répartis par ex. objetdistant.methode(parametres) transparence uniquement pour le 5 programmeur!
1 Modèle de prog. Client/Serveur OO Introduction de la notion d objet dans un environnement réparti - Mieux structurer les applications - Simplifier la conception, le développement, la maintenance -Uniformiser l accès au système au travers d un Langage concurrent et réparti Objet = données + méthodes + référence données : variables méthodes : traitements référence : moyen d accès à l objet Données d1 d2 M1 M2 M3 Méthodes 6
1 Modèle de prog. Client/Serveur OO Quelques notions Encapsulation : l objet protège les données en ne les rendant visibles qu au travers de méthodes Instanciation : les objets sont créés à partir de moules (les classes) Héritage : les classes peuvent être définies en dérivant des classes existantes Classification (P. Wegner) Langage basé objet : ayant un mécanisme d encapsulation (Ada) Langage basé classe : ayant en plus un mécanisme d instancitation (Simula) Langage orienté objet : ayant en plus un mécanisme d héritage (Smalltalk, C++, Java) 7
1 Modèle de prog. Client/Serveur OO Les besoins dans un environnement concurrent et réparti OO Exécution à distance des méthodes Nommage universel des objets Création d instances à distance Exécutions concurrentes Synchronisation des exécutions Migration des instances 8
1.1 Nommage Nommage : Objets à désigner Le site d exécution, le serveur, la procédure Désignation globale indépendante de la localisation reconfiguration possible des services (pannes, régulation de charge,...) Désignation Statique : la localisation du serveur est connue à la compilation Dynamique : la localisation n est pas connue à la compilation séparation des connaissances du nom de service et de son adresse grande indépendance au niveau de l implantation 9
1.1 Nommage Identifier les objets dans un environnement réparti Deux objets diff. sur le même site ou sur des sites diff. ne doivent pas avoir la même identité (on parle de référence d objet) La référence sert à «retrouver» l objet pour pouvoir invoquer ses méthodes Généralisation de la notion de pointeur à un environnement réparti Deux techniques principales un ID sans rapport avec la localisation généré par une fonction mathématique un ID en deux parties : son site de création + un numéro local unique Recherche d un objet à partir de sa référence annuaires de localisation centralisés ou répartis, ou diffusion interrogation du site contenu dans la référence + liens de poursuite 10
1.1 Nommage La localisation du serveur le client doit localiser et se "lier" (bind) avec le serveur La localisation se fait en trois étapes : enregistrer le serveur le client interroge le serveur de désignation le client accède au service sur le serveur serveur de désignation Plusieurs possibilités liaison statique (pas d appel à un serveur de nom) liaison au premier appel (appel du serveur de nom lors du premier appel liaison à chaque appel (appel du serveur de nom à chaque appel) 11
1.1 Nommage Les différentes étapes de la liaison Client Serveur 4 Talon client 7 8 1 Talon serveur 5 6 3 2 Serveur de Désignation 12
1.2 Sécurité Gérér le partage des objets dans un environnement réparti Pour des raisons de sécurité, l accès à certains objets peut être restreint - En fonction de l identité de l objet appelant Ex : seuls les accès en provenance de l intranet sont autorisés - À partir d une liste de contrôle d accès Ex : mot de passe, mécanisme de clés de session La restriction peut - Interdire complètement l accès à l objet - Fournir une vue dégradée Ex : autoriser les méthodes qui fournissent un service de consultation mais interdire celles qui modifient l état de l objet => Nombreuses informations à ajouter aux objets 13
1.3 Durée de vie Objets temporaires : leur durée de vie correspond à celle de leur créateur Objets persistants L objet persiste tant qu il n est pas détruit La persistance peut être limitée par la durée de vie du système ou s étendre au delà des redémarrages Problèmes à résoudre : - sauvegarde d informations multiples (type, classe, données) - gérer les lieux de stockage (mémoire, disque, réseau) - assurer que l objet reste accessible quelque soit son lieu de stockage Choix de conception : - tous les objets sont persistants? - un objet est crée persistant? - un objet temporaire peut devenir persistant? vice-versa? - un objet référencé par un objet persistant est persistant? 14
1.4 Degrés de concurrence Possibilité d exécuter simultanément plusieurs activités Rq: le terme parallélisme est lié aux machines multi-processeurs 4 degrés de concurrence (adapté de P. Wegner, J.P. Briot et al.) : séquentiel : une seule méthode est exécuté à la fois par l objet quasi-concurrent : plusieurs activations de méthodes coexistent, mais au plus une seule n est pas suspendue concurrent : plusieurs activités peuvent s exécuter, mais le programmeur peut restreindre le degré de concurrence (synchronisation) complètement-concurrent : concurrence sans aucune restriction (objet sans états) 15
1.4 Association objet/activité Deux façons d associer un objet et une activité (thread) Objet passif Objet actif L activité : manipulé de façon explicite orthogonal à l objet se «plaque» sur les méthodes appelant Une (+sieurs) activité dédiée à l objet exécutent les méthodes appelant 16
1.5 Synchronisation Restreindre la concurrence d accès à une ressource partagée afin d en maintenir la cohérence Ex : exclusion mutuelle, lecteurs/écrivain, transaction Synchro. Comportementale en fonction de l état des données de l objet ex : Pile avec empile et dépile vide : empile 1/2 : empile et dépile plein : dépile Synchro. Intra-objet en fonction de l état d exécution de l objet ex : Fichier avec lire et écrire soit + lire simultanément soit 1 seul écrire 17
1.5 Synchronisation objets sémaphores : méthodes P et V objets moniteurs : méthodes synchronized, wait et notify (ex Java) expressions de : avec les opérateurs, * // on spécifie les séquences valides chemin d exécutions de méthodes gardes : chaque méthode est associée à une condition booléenne remplacements de : chaque objet a +sieurs «comportements» comportement chacun correspond à l exécution d une méthode on spécifie avec la primitive become le cpment suivant approches à états : chaque objet est associé à un ensemble d états chaque état est associé à un sous-ensemble de méthodes pouvant être exécutées 18
1.5 Synchonisation inter-objets Dépendances entre objets -> mécanismes de synchronisation Exemple : un transfert entre deux objets comptes bancaires Assurer qu un ensemble de 2 ou +sieurs invocations de méthodes compte1.depot(50); compte2.retrait(50); s effectuent complètement avec les propriétés ACID ou pas du tout Problématique de la théorie de la sérialisatibilité et des moniteurs transactionnels -> intégration du moniteur dans le système réparti objet avec un - protocole de validation (2PC ou 3PC) - mécanisme de verrouillage des ressources - mécanisme de détection des conflits - mécanisme de traitement des conflits 19
Appel de méthode à distance (1/2) Interface état référence Méthode_i Talon client Talon serveur Référence d'objet + méthode + arguments Résultat ou exception 20 Objet désignation envoi de requêtes exécution de requêtes retour de résultat
Appel de méthode à distance (2/2) éléments d'une «invocation» référence d'objet («pointeur» universel) identification d'une méthode paramètres d'appel et de retour passage par valeur : types élémentaires et types construits passage par référence possibles exceptions en retour objets «langage» représentation propre au langage : instance d'une classe exemple : Java RMI objets «système» représentation «arbitraire» définie par l'environnement d'exécution exemple 21 : CORBA
Le principe des mandataires objets (ou proxy, talon, souche) objet serveur objet client état appel Talon client Talon serveur Methode_1. Methode_n. Système de communication 22
Le principe des mandataires objets (ou proxy, talon, souche) objet client appel (1) (2) (10) Talon client (9) (3) Talon serveur objet serveur état Methode_1. Methode_n. Système de communication 1 : Invocation d une méthode 6 : Retour de l invocation locale (4) (8) (7) (5) (6) 2 : Emballage des paramètres 7 : Emballage des résultats 3 : Transport de l invocation 8 : Transport des résultats 4 : Déballage des paramètres 9 : Déballage des résultats 5 : Invocation de l objet 10 : Retour de l invocation distante 23
Le rôle du talon client Représentant local de l objet distant => référence sur l objet distant Emballage des appels de méthodes locaux en messages à destination du talon serveur Déballage des résultats ou des exceptions contenus dans un message retourné par le talon serveur Contrôle de la bonne utilisation des signatures du talon à la compilation / l exécution => contrôle des messages du protocole 24
Le rôle du talon serveur Passerelle entre le réseau et l objet serveur rend l objet serveur accessible à distance Déballage des messages émis par les talons clients Appel local des méthodes de l objet serveur Emballage des résultats ou exceptions dans un message à destination du talon client 25
Le bus d objets répartis Client int solde() credit(int) debit(int) Talon client IDL int solde() credit(int) debit(int) Talon serveur Objet int solde() credit(int) debit(int) Bus d objets répartis Réseau Appliqué dans DCOM, Java RMI et CORBA Prise en charge de la fonction de 26 communication
La prise en charge de la fonction de communication Talon serveur if(op == «credit») { int m = receive(); objet.credit(m); return; }... Objet credit(int montant) {... code métier... balance_ += montant; } Le développeur ne code pas la communication gestion des sockets, du protocole applicatif, des threads déballage des arguments et emballage des résultats Indépendance vis-à-vis de la couche de transport TCP/IP, ATM,..., mémoire partagée,... 27 Amélioration de la qualité logiciel par génération
Le rôle du langage IDL Interface Definition Language = langage de définition des interfaces des objets répartis Permet de décrire la signature des méthodes publiques et accessibles à distance nom méthode type du résultat et des paramètres liste des exceptions Caractérisation des messages du protocole applicatif entre le client et le serveur Compilation pour production automatique des talons clients et serveurs 28
Le rôle du bus d objets répartis Implantation d un protocole de transport des appels de méthode à distance Bufférisation des messages Allocation des canaux de communications sockets mais aussi «pipes», mémoire partagée,... des adresses physiques, e.g. des ports gestion d un pool de sockets,... Gestion de pools de threads serveurs Autres services... 29
Middleware orienté objet Bus pour communication synchrone entre objets distants Mais peut aussi fournir d autres fonctions Annuaires de recherche stockage des références d objets distants Communication asynchrone diffusion d événements Activation à la volée des objets objets présents en mémoire seulement si invoqués => virtuellement des milliards d objets ;-) Sécurité Transactions réparties... 30
Les diverses solutions industrielles ProduitS de Microsoft Système d exploitation Windows partout! Java RMI pour Java Remote Method Invocation Produit de SUN Microsystems Langage Java partout! CORBA pour Common Object Request Broker Architecture Norme du consortium Object Management Group Interopérabilité! 31
Java RMI Principes Tout Java IDL = interfaces Java (extends java.rmi.remote) Transport = JRMP ou IIOP Avantages Intégré aux environnements JDK Simple à mettre en œuvre Inconvénients Un seul concepteur Mono langage 32
CORBA Principes Modèle d objets hétérogènes et interopérables IDL = OMG IDL Transport = GIOP - IIOP (Internet Inter Orb Protocol) Avantages Norme consensuelle OMG / ISO fournisseurs / utilisateurs / domaines Ouvert et évolutif Multiples fournisseurs d implantations Multi langages / OS / transports Middleware avec de nombreux services Inconvénients «Réputé» pour être complexe 33 à mettre en œuvre ;-)
Illustration avec Java RMI 34
Java Remote Method Invocation Solution simple et 100% Java pas de nouveau langage IDL Permet l'invocation de méthodes entre des objets Java qui s'exécutent dans des machines virtuelles distinctes et réparties Sérialisation automatique des paramètres et résultats des méthodes même pour des objets Java complexes chargement dynamique des classes si nécessaires Ramasse-miettes distribué Annuaire de références d objets RMI 35
L architecture Java RMI Transparence dans la communication entre client et serveur Bibliothèque RMI = couche de référence distante et couche de transport Souches et squelettes Java sont 36 générées par le compilateur rmic
Une mise en œuvre très simple Définir l'interface de l'objet distribué (OD) Implanter l OD Générer le talon client et serveur appelés stub et skeleton RMI via le compilateur rmic Côté serveur instancier l'od enregistrer l OD dans l annuaire RMI Côté client obtenir l OD via l annuaire RMI l OD se manipule comme tout autre objet Java 37
Rendre un objet Java accessible à distance Pour qu un objet Java soit accessible à distance via Java RMI, sa classe doit implanter au moins une interface Java RMI publique Une interface Java RMI est une interface Java «classique» héritant au moins de l interface java.rmi.remote Chaque méthode de l interface doit lever au moins l exception java.rmi.remoteexception Tout objet distant passé en paramètre doit être déclaré par son interface RMI 38
Un simple exemple d interface Java RMI public interface Hello extends java.rmi.remote { public void afficher(string chaine) throws java.rmi.remoteexception; } public Message getderniermessage() throws java.rmi.remoteexception; 39
L implantation de l interface Java RMI (1/2) public class HelloImpl extends java.rmi.server.unicastremoteobject implements Hello { protected Message lederniermessage; public HelloImpl() throws java.rmi.remoteexception { } // Appel du constructeur java.rmi.server.unicastremoteobject // soulevant l'exception java.rmi.remoteexception. super(); lederniermessage = new Message(""); 40
L implantation de l interface Java RMI (2/2) public void afficher(string chaine) throws java.rmi.remoteexception { System.out.println("chaine=" + chaine); lederniermessage = new Message(chaine); } } public Message getderniermessage() throws java.rmi.remoteexception { return lederniermessage; } 41
Rendre un objet Java sérialisable par RMI Pour qu un objet Java soit sérialisable, sa classe doit implanter au moins l interface java.io.serializable Sérialisation de tous les attributs sauf ceux marqués transient Prise en compte récursive des graphes d objets sérialisables ainsi que les cycles La plupart des classes Java de base sont sérialisables par ex. java.util.* Les objets associés à des ressources systèmes ne sont pas sérialisables 42 Thread, Process, File, AWT, etc.
Un simple exemple d objet sérialisable par Java RMI public class Message implements java.io.serializable { protected java.util.date date; protected String texte; // Le constructeur. public Message(String texte) { this.date = new java.util.date(); this.texte = texte; } // Pour afficher le message. public String tostring() { return "Message[... ]"; } } 43
L annuaire Java RMI Java RMI fournit un annuaire gérant des associations entre noms symboliques et références d objet RMI des serveurs contenant 1 objet RMI annuaire Côté serveur exporter la référence des objets RMI java.rmi.naming.rebind("nomsymbolique", référenceobjetrmi); Côté client importer des références d OD RMI référenceobjetrmi = java.rmi.naming.lookup( "//machineannuaire/nomsymbolique"); 44
Un simple serveur RMI public class Serveur { public static void main(string args[]) throws Exception { // Créer l'objet accessible par Java RMI. HelloImpl obj = new HelloImpl(); } // Enregistrer cet objet dans l annuaire RMI. java.rmi.naming.rebind("hello", obj); // Ici le programme ne se termine pas! // Car attente des invocations distantes sur l OD. } 45
Un simple client RMI public class Client { public static void main (String[] args) throws Exception { // Obtenir la souche sur l OD via l'annuaire RMI. Hello hellodistant = (Hello) java.rmi.naming.lookup("//localhost/hello"); // Invoquer des méthodes comme si l'objet était local. hellodistant.afficher("hello world!"); Message message = hellodistant.getderniermessage(); System.out.println("Le dernier message = " + message); } } 46
Compilation et exécution Compiler les sources > javac Hello.java Message.java HelloImpl.java Serveur.java Client.java Générer les stub et les skeletons RMI > rmic HelloImpl Produit HelloImpl_Stub.class et HelloImpl_Skel.class Lancer l annuaire RMI > rmiregistry & Lancer le serveur de l'od > java Serveur & Lancer le client de l'od > java Client 47
Une vision d ensemble de l application (5) hellodistant Client HelloImpl _Stub (7) (4a) HelloImpl _Skel Serveur (2) (3) HelloImpl (5) démarrage Client (6) recherche annuaire lookup (7) invocations (6) HelloImpl _Stub (4b) rmiregistry 48 (1) (4) (1) démarrage annuaire RMI (2) démarrage Serveur (3) création OD (4) exportation annuaire (bind - rebind)
Distributed Garbage Collector (DGC) Le DGC interagit avec les GC locaux et utilise un mécanisme de reference-counting Lorsqu'un OD est passé en paramètre à un autre OD ref_count+ + Lorsqu'un stub n'est plus référencé weak reference Lorsque le GC du client libère le stub, sa méthode finalize est appelée et informe le DGC ref_count-- Lorsque le nombre de références d'un OD = 0 weak reference Le GC du serveur peut alors libérer l'od Le client doit régulièrement renouveler son bail au près du DGC Si référence à un OD libéré RemoteException 49
Comparaison de Java RMI avec CORBA - RMI est propriétaire SUN / CORBA est une norme internationale - RMI moins ambitieux que CORBA - RMI n'offre pas interopérabilité avec des objets d'autres langages - RMI est beaucoup plus lent que les implantations de CORBA + RMI est une implantation standard et gratuite (incluse dans JDK) + RMI est object-oriented / CORBA est object-based + RMI est plus simple à mettre en œuvre que CORBA + Pas besoins d'idl : seulement l'interface de l'od et son URL + Les OD se manipulent comme les OL (grâce au DGC) + RMI supporte le passage d'objets locaux par copie + RMI permet une gestion de la sécurité (RMISecurityManager, ACL,...) 50
Bibliographie sur Java RMI Tutoriel Java RMI http://java.sun.com/products/jdk/1.2/docs/guide/rmi/ JAVA REMOTE METHOD INVOCATION - DISTRIBUTED COMPUTING FOR JAVA http://java.sun.com/marketing/collateral/javarmi.html Java Distributed Computing, J Farley, Ed. O Reilly... 51