Java-RMI Remote Method Invocation

Transcription

Java-RMI Remote Method Invocation
Architectures réparties
Java - RMI
Java
Java -- RMI
RMI
Remote
Remote Method
Method
Invocation
Invocation
Yann Viémont
Université de Versailles St-Quentin
Architectures réparties
Java - RMI
Plan
1. Introduction
2. Rappels sur les RPC
3. Le modèle objet de Java-RMI
4. Architecture générale
Architectures réparties
Java - RMI
1.
Introduction
= Disponible à partir de la version 1.1 du JDK de Sun (1995)
= Concurrent de CORBA et DCOM (.NET) pour offrir un
système d’objets distribués
= Conçu pour un environnement homogène de machines
virtuelles Java
ß Multiplateforme / Monolangage
= Sécurité et disponibilité (RMI Security Manager)
= Compatible avec le modèle objet de Java
ß Polymorphisme, instanceof, GC distribué, …
= Intégration des standards Internet
Architectures réparties
Java - RMI
Fonctionnalité
= Obtention de références sur les objets serveurs
= Invocation de méthode à distance
= Invocation sans compilation
= Importation / exportation / transmission dynamique d’objets
ß Par référence ou par copie
= Intégration au modèle objet de Java
= Préservation de l’intégrité des références
= Importation / exportation / transmission dynamique de
comportement (code)
= Cycle de vie des objets distants
ß Activation / Passivation / Persistance
Architectures réparties
Java - RMI
Objectifs
Le mécanisme doit permettre les opérations de base
suivantes :
= Obtenir une référence sur un objet distant
= Invoquer à distance une méthode sur cet objet
= Utiliser un objet d’un site distant comme un objet
local (importation d’une copie de l’objet)
= Importer dynamiquement une classe (type +
méthodes) avec les objets correspondants
= Exporter dynamiquement une classe (type +
méthodes) avec les objets correspondants
Architectures réparties
Java - RMI
Obtenir une référence
RMI comprend un serveur de nom (registry) basé sur les URL :
= Les méthodes de la classe Naming accèdent au registry
Du coté serveur, l’application invoque la méthode :
= Naming. bind (URL, objet)
Du coté client, l’application invoque la méthode :
= référence = Naming.lookup (URL)
L’objet reste sur le serveur
= Une instance de la souche (stub) est importée sur le
client
= La référence client désigne cette souche qui référence
l’objet distant
Architectures réparties
Java - RMI
Utiliser un objet distant
On peut utiliser localement un objet distant :
= De façon transparente
= Aussi simplement qu’un objet local
= résultat = objetLocal.méthode (objetDistant)
Architectures réparties
Java - RMI
Invoquer une méthode distante
Une méthode distante s’invoque de façon transparente :
= résultat = objetDistant.méthode (param1, …,
paramN)
Les paramètres d’entrée peuvent être :
= Des objets locaux transmis par copie et sérialisation
= Des objets distants (du serveur ou d’un site tiers)
dont la référence (objet + stub) est retransmise
Au retour :
= Les objets locaux modifiés sont recopiés
= Des références à de nouveaux objets distants
peuvent être obtenues
Architectures réparties
Java - RMI
Beaucoup plus qu’un simple RPC pour Java
Architectures réparties
Java - RMI
2. Rappels sur les RPC
Machine A
Client
Processus
uitilisateur
Machine B
Serveur
Requête
Invocation du service
(Processus veilleur)
Réseau
Exécution
du
service
(Processus serveur)
Réponse
renvoit des valeurs de retour
Architectures réparties
Java - RMI
Caractéristiques d’un RPC
Un APD, appel de procédure à distance (RPC, Remote
Procedure Call en anglais) permet :
= La transparence
ß Type de machine
ß Type de réseau
ß Localisation
ß Type de codage et standards
= Plusieurs sémantiques des appels
ß Synchrone / asynchrone
ß Au-moins-une-fois / au-plus-une-fois
Architectures réparties
Java - RMI
Processus serveur
Question : qui exécute la procédure distante ?
Réponse : un processus serveur autonome
= Un second processus est utilisé sur le serveur
Architectures réparties
Java - RMI
Problèmes
Les espaces d’adressage des processus client et serveur
sont disjoints
= Nouvelle pile, nouvelles variables
ß Une procédure appelée à distance forme un bloc
opaque pour les règles de visibilité
= Toutes les communications se font par passage de
paramètre
= On ne peut pas passer un pointeur
Les machines et / ou les systèmes sont différents
= Transformation des formats
= Interdiction des calculs explicites d’adresse
Architectures réparties
Java - RMI
Solutions
Solution 1 : les paramètres sont limités aux types de base
= Passage de paramètres par valeurs
= Sans pointeur, uniquement des tableaux
= Les structures et / ou listes doivent être
décomposées par le programmeur
Plusieurs standards ont été proposés
= Le plus utilisé est DXF (Data eXchange Format)
Solution 2 : sérialisation (languages objets)
= Les objets complexes sont transformés en un flot de
caractères selon un format d’échange
Architectures réparties
Java - RMI
Mécanisme d’appel compilé
= La procédure distante et le programme appelant
sont compilés séparément
= Le compilateur utilise une définition d’interface
abstraite
= L’appelant utilise le mécanisme d’appel habituel
= Une pseudo procédure se substitue localement à la
procédure distante
ß La souche client (stub)
= L’appelé utilise le mécanisme d’appel habituel
= Une pseudo procédure appelante se substitue à la
vraie sur la machine distante
ß La souche serveur (squeleton)
Architectures réparties
Java - RMI
Architecture
Client
Serveur
Procédure
appelante
Procédure
appelée
Appel de procédure
Souche client
Appel de procédure
Librairie APD
Appel système
Système et
communication
Appel de procédure
Souche serveur
Appel de procédure
Librairie et
runtime APD
Appel système
Système et
communication
Architectures réparties
Java - RMI
Définition d’interface
Une procédure distante n’est connue que par son
interface
= type_retour nom_procedure (mode_p1
type_p1, mode_p2 type_p2, …, mode_pn
type_pn) ;
= type_1 = … ;
= …
= type_m = … ;
L’interface est générée par le compilateur serveur
Elle est utilisée par le compilateur client
Architectures réparties
Java - RMI
3. Le modèle objet de Java-RMI
Le modèle objet distribué de RMI distingue deux types d’objets :
= Les objets distants (remote object)
= Les objets locaux
Un objet distant est connu des autres sites par une ou plusieurs
interfaces distantes (remote interfaces)
Chaque interface distante définit un ensemble de méthodes
invocables depuis les autres sites
Pour invoquer une méthode d’un objet distant :
= On connait son interface - son comportement
= On ne connait pas sa classe exacte - son implémentation
Architectures réparties
Java - RMI
Interfaces et classes en Java
Une interface définit un comportement abstrait
= Elle ne comporte pas de constructeur d’objets
= Elle définit la signature de méthodes abstraites
= Elle peut aussi définir des constantes
Une classe définit une implémentation particulière
= Elle comporte un constructeur d’objets
= Elle définit un type pour la structure des objets
= Elle spécifie des méthodes (signature + corps)
Une classe peut implémenter une ou plusieurs interfaces
= Elle doit alors fournir une implémentation des
méthodes correspondantes
Architectures réparties
Java - RMI
Exemple
InterfaceX
InterfaceY
méthodeX1 (…)
méthodeX2 (…)
…
IntX
IntY
ClasseA
méthodeX1 (…)
méthodeX2 (…)
…
méthodeY1 (…)
méthodeY2 (…)
…
méthodeA1 (…)
méthodeA2 (…)
…
InterfaceZ
méthodeY1 (…)
méthodeY2 (…)
…
méthodeZ1 (…)
méthodeZ2 (…)
…
IntX
IntZ
ClasseB
méthodeX1 (…)
méthodeX2 (…)
…
méthodeZ1 (…)
méthodeZ2 (…)
…
méthodeB1 (…)
méthodeB2 (…)
…
Architectures réparties
Java - RMI
Interfaces et héritage en Java
Un objet Java est créé comme une instance d’une classe
particulière
Java supporte trois mécanismes d’héritage
= simple : une classe peut étendre une autre classe
- sa superclasse = simple : une interface peut étendre une autre interface
- sa superinterface = multiple : une classe peut implémenter une ou plusieurs
interfaces
En résultat, un objet Java est aussi :
= Une instance de sa ou ses superclasses
= Une instance des toutes les interfaces implémentées par
sa classe et sa (ou ses) superclasse (s)
Architectures réparties
Java - RMI
Exemple
InterfaceX
méthodeX1 (…)
…
IntX
InterfaceW
InterfaceY
méthodeW1 (…)
…
méthodeY1 (…)
…
InterfaceZ
IntY
méthodeZ1 (…)
…
ClasseA
méthodeX1 (…)
…
méthodeY1 (…)
…
méthodeA1 (…)
…
implements
extends
IntZ
ClasseC
méthodeY2 (…)
…
méthodeW1 (…)
…
méthodeZ1 (…)
…
méthodeC1 (…)
méthodeC2 (…)
…
Architectures réparties
Java - RMI
Exemple (suite)
Les instructions suivantes sont toutes correctes :
ß ClasseC c1 = new ClasseC () ;
ß ClasseA a1 = new ClasseC () ;
ß ClasseA a2 = c1 ;
ß ClasseC c2 = (ClasseC) a2 ;
ß InterfaceX ix1 = new ClasseA () ;
ß InterfaceX ix2 = new ClasseC () ;
ß InterfaceZ iz1 = c1 ;
ß InterfaceZ iz2 = (ClasseC) a1 ;
L’ instruction suivante est incorrecte :
ß InterfaceZ iz3 = new ClasseA () ;
Architectures réparties
Java - RMI
Interfaces et classes de RMI
Interfaces
Classes
Exceptions
RemoteObject
IOException
RemoteServer
RemoteException
Remote
Serializable
UnicastRemoteObject
Architectures réparties
Java - RMI
L’interface Remote
Remote sert à identifier et référencer les objets distants
Remote ne définit aucune méthode
public interface Remote {}
Remote est la racine de toutes les interfaces distantes
définies par les utilisateurs pour manipuler les objets distants
public interface CompteBancaire
extends Remote
{
public void depot (float
montant)
throws
RemoteException ;
public void retrait (float
montant)
throws RemoteException ;
… }
Remote
CompteBancaire
Architectures réparties
Java - RMI
Objets distants de Java-RMI
Définition : un objet distant est une instance d’une classe
implémentant une ou plusieurs interfaces distantes.
Un objet non-distant est dit objet local.
NB : “distant” et “local” désignent la nature de l’objet et
non pas sa localisation sur un certain site.
Exemple pour l’accès aux objets depuis un site particulier
(Site local dans le tableau ci-dessous) selon la nature et la
localisation d’un objet :
Nature
des objets
Localisation des objets
Site local
Site distant
Objet
local
accès local
accès copie
locale
Objet
distant
accès local
accès distant
Architectures réparties
Java - RMI
La classe UnicastRemoteObject
La classe abstraite RemoteObject redéfinit plusieurs
méthodes de Object et en ajoute pour les objets distants
= hashCode, equals, toString
= getRef, toStub, writeObject, readObject
La classe abstraite RemoteServer définit des méthodes
communes à tous les serveurs
= unexportObject, getClientHost, …
La classe UnicastRemoteObject implémente les objets
distants non répliqués (mono-serveur)
= exportObject, …
Architectures réparties
Java - RMI
Conformité avec le modèle Java
Une référence à un objet distant peut être :
= Passée en paramètre de toute invocation de
méthode locale ou distante
= Retournée par toute invocation de méthode locale
ou distante
= Fondue en une référence sur des interfaces
distantes de son implémentation
= Utilisée en argument de instanceof pour tester les
interfaces supportées
Architectures réparties
Java - RMI
Spécificité du modèle RMI
Les clients des objets distants
= Ne voient que les interfaces distantes
= Ne voient jamais directement les classes qui les
implémentent
Les paramètres des méthodes distantes sont passés
= Par référence pour les objets distants
= par copie pour les autres objets
Architectures réparties
Java - RMI
Classes souches de Java-RMI
A chaque classe C d’objets distants sur le serveur est associée :
= Une classe souche CS (stub class)
= L’ensemble des interfaces I distantes de C
ß Implémentées directement par C
ß Ou implémentées par une superclasse de C
Pour un objet distant référencé depuis un site client :
= La classe souche est importée par le réseau
= Un objet de cette classe est créé localement
Le
Le système
système normal
normal de
de type
type de
de Java
Java fonctionne
fonctionne avec
avec les
les références
références
sur
sur les
les objets
objets souches
souches
Architectures réparties
Java - RMI
Exemple : hiérarchie de classe
Interfaces
Classes
Serializable
RemoteObject
Remote
RemoteInterfaceX
RemoteServer
RemoteInterfaceY
RemoteInterfaceZ
RemoteInterfaceW
UnicastRemoteObject
ClasseA
InterfaceM
ClasseB
InterfaceN
ClasseC
Architectures réparties
Java - RMI
Exemple : souches
Interfaces
Remote
Souches
RemoteInterfaceX
RemoteInterfaceY
RemoteInterfaceZ
RemoteInterfaceW
SoucheA
SoucheB
Architectures réparties
Java - RMI
Exemple : objets souches
Serveur
Client
RIX RIW
RIX RIW
ClasseA
SoucheA
SoucheA
RIX
RIZ
RIW
Importation
des
souches
IM
ClasseB
RIX
RIZ RIW
SoucheB
SoucheB
RIX
RIZ RIW
IM
IN
ClasseC
Création d’objets substituts
Obj_CAi
Obj_CBj
Obj_CCk
Obj_SAi
Obj_SBj
Obj_SCk
références distantes
Architectures réparties
Java - RMI
4. Architecture générale
RMI se décompose en trois couches :
Client
Serveur
Souches client
(Stubs)
Souches Serveur
(Skeletons)
Couche des références distantes
(Remote Reference Layer)
Couche Transport
Application
Mécanisme
RMI
Architectures réparties
Java - RMI
La couche des souches
La couche des souches :
= Constitue l’interface application / système RMI.
= Comporte les souches client (stubs) agissant
comme un objet par procuration (proxy)
= Comporte les souches serveur implémentant toutes
les interfaces de l!’objet distant.
= Soumet les données à la couche des références
distantes sous forme de flots de données entrants et
sortants - après sérialisation.
Architectures réparties
Java - RMI
Sérialisation
Définition : technique permettant la transmission des
données objets entre deux espaces d’adressage
différents
Les références à d’autres objets conduisent à une copie
en profondeur
Entrée :
= Organisé en graphe (connexe ou non)
Sortie :
= Un flot séquentiel de données
= Utilisant exclusivement un adressage relatif
Désérialisation
Sérialisation
= Un ensemble d’objets en mémoire (virtuelle)
Architectures réparties
Java - RMI
Les souches client (stubs)
La souche client :
= Initialise l!’appel vers un objet distant (via la couche
des références distantes )
= Sérialise les arguments sous forme d’un unique flot
de sortie
= Informe la couche des références distantes que
l!’appel peut être invoqué
= Désérialise le flot d’entrée contenant la valeur de
retour ou une exception
= Informe la couche des références distantes que
l!’appel est achevé
Architectures réparties
Java - RMI
Les souches serveur (squeletons)
La souche serveur :
= Reçoit l’appel par une méthode unique (aiguilleur)
= Désérialise le flot d’entrée des arguments
= Prépare l!’appel vers l’implémentation réelle de
l!’objet distant
= Distribue l’appel vers la bonne méthode cible
= Sérialise les valeurs de retour ou les exceptions
dans le flot de sortie
Architectures réparties
Java - RMI
La couche des références
distantes
Plusieurs protocoles d!’invocation possibles :
= Invocation point à point (Unicast)
= Invocation vers des groupes de réplication (Multicast)
Stratégie de reconnexion (si un objet devient inaccessible)
Deux composantes coopérantes :
= la composante coté client (client-side)
= la composante coté server (server-side)
Transmission de données entre couches transport par une
connexion orientée flux
Architectures réparties
Java - RMI
La couche transport
La couche transport de Java-RMI effectue :
= Mise en place, gestion, surveillance de la connexion
= Ecoute des appels arrivant
= Maintien d’une table d’objets distants pour l’espace
d’adressage
= Localisation du dispatcher pour la cible d’un appel
distant et transmission de la connexion
Architectures réparties
Java - RMI
Concepts de la couche transport
4 abstractions :
= Un endpoint indique l!’@ machine virtuelle Java.
= Un channel “conduit” entre 2@.
= Une connexion permet le transfert des données.
= Le transport effectue la gestion des channels.
Architectures réparties
Java - RMI
Nettoyage des objets distants
Ramasse-miette
Ramasse-miette (Garbage Collector) distribué
Invoqué quand :
= Les objets distants ne sont plus appelés (compteur
ref_counting == 0)
= Il n’y a plus ni référence locale ni référence distante
sur les objets locaux ou distants
Remarque :
=
Le GC ne garantit pas l’intégrité des références, il
peut rester une référence sans objet correspondant (
fi RemoteException)
Architectures réparties
Java - RMI
Chargement dynamique des
classes
Pendant l’exécution :
Chargement dynamique des classes nécessaires à
l’invocation des méthodes de l’objet distant.
= Classes stub et squelette (~proxies)
= Classes indirectement utilisées par RMI
Chargement dynamique des classes pour les copies des
objets locaux hors-site
= Classes et interfaces des objets hors-site
Architectures réparties
Java - RMI
Différents chargeurs de classe
= LocalClassLoader (selon le Classpath)
ß Chargement des classes connues localement
= AppletClassLoader
ß Chargement de l!’applet
ß Chargement des classes dépendantes sur le réseau
= RMIClassLoader
ß Vérifie que l’on ne peut pas charger avec le Classpath.
ß Localise la classe grâce à l’URL dans le flot (objet
distant).
ß Localise la classe grâce à l!’URL spécifié par
java.rmi.server.Codebase local (souche/squelette).
Architectures réparties
Java - RMI
Sécurité
Chargement local de classe :
= Pas de problème de sécurité
Chargement à partir du réseau :
= Nécessité d’un Security Manager.
ß Applet Security Manager (à lancer en 1er dans
une application).
ß RMI Security Manager (par défaut).
Architectures réparties
Java - RMI
Sécurité
Applet Security :
= Le chargement doit être fait sur applet (travail des
développeurs).
RMI Security :
= Lorsque non local (ex : bootstrapping).
= Toutes les classes téléchargées par le
RMIClassLoader.
= Pb : on ne peut pas prévenir le chargement de
classes abusant de ressource.
Architectures réparties
Java - RMI
Scénarios
Serveurs en mode ouvert ou fermé.
Application Java utilisant RMI :
ß Mode Client / Serveur
ß Mode Serveur / Client (callback)
ß Mode égal à égal (peer to peer)
Architectures réparties
Mode ouvert ou fermé
Serveur fermé :
= Pas de chargement de classe
= Interfaces locales au serveur
= Pas de Security Manager
Serveur ouvert :
= Chargement de classes avec l!’URL du
java.rmi.server.Codebase
= Contrôle par le RMI Security Manager
Java - RMI
Architectures réparties
Java - RMI
Applets
Classes fournies par serveur HTTP ou FTP
(URL page HTML)
Pas de chargement de classes si elles existent déjà sur le
serveur.
Architectures réparties
Java - RMI
Application Java distribuée
NB :
≠ Applet
Un seul serveur HTTP pour toutes les applications
distribuées sur le réseau
Chargement local d!’une application :
= Chargement des interfaces distantes
= Chargement des classes souche et squelette.
Chargement réseau (bootstrapping) :
= Toutes les classes peuvent être chargées à partir de
la même source réseau
Architectures réparties
Java - RMI
RMI à travers les Firewalls
Problème :
= Ouvrir un socket en présence de parefeux (Firewalls)
sur Intranet
Solution :
= Encapsulation d!’un appel RMI par le protocole HTTP
ß Appel RMI envoyé dans le corps d!’une requête
HTTP POST.
ß Retour dans une requête HTTP response.
Architectures réparties
Java - RMI
L’usine à sockets
Le factory de sockets :
= java.rmi.server.RMISocketFactory
= Fournisseur de ressource pour les sockets
= Création de socket permettant le tunneling
ß Socket client : connexion HTTP vers les hôtes
ß Socket serveur : si HTTP POST alors réponse
HTTP
Architectures réparties
Java - RMI
Configuration
Configuration du client : RAS
Configuration du serveur :
= La totalité du nom de l!’hôte serveur doit être incluse
dans les références distantes
= Si le serveur ne supporte pas les clients RMI en
dehors du parefeux :
ß Utilisation d’un serveur HTTP à l’écoute sur le
port 80.
ß Utilisation d!’un script CGI : /cgi-bin/java-rmi
Architectures réparties
Java - RMI
Multithreading
NAME
ADDRESS
Client
NAME
ADDRESS
NAME
ADDRESS
RMI
Client
Client
RMI
RMI
Server
JDBC
Expense
records
Architectures réparties
Java - RMI
Comparaison RMI / RPC
Orientation Objet
= Passage d!’objets complexes en paramètre.
= Création d!’objets à distance.
Séparation interface / implémentation
Client
Architectures réparties
Server
Java - RMI
Architecture d’objets distribués
Répartition des objets sur une architecture C/S ou 3 tiers
de façon libre.
Utilisation d’un Security Manager standard ou spécialisé.
Portable sur toute machine (VM).
Ramasse-miette distribué.
Multithreaded.
Architectures réparties
Java - RMI
Intégration intranet / extranet
Appel à distance / téléchargement de code
Encapsulation code non-Java avec JNI
Encapsulation BD avec JDBC
Récupère les avantages d!’un BUS Java :
= Puissance
= Sécurité
= Portabilité
Architectures réparties
Java - RMI
Implémentation des souches
L’implémentation des souches s’appuie sur les possibilités
objets de Java
Architectures réparties
Java - RMI
Classes et Interfaces des
souches
Classe ‘RemoteStub’
= Superclasse pour tous les stubs
Interface ‘RemoteCall’
= Gestion du transport des informations (flux)
Interface ‘RemoteRef’
= Attache locale à un objet distant
Interface ‘Skeleton’
= Répartiteur d’appels
Architectures réparties
Java - RMI
JINI
Architecture destinée à la gestion de périphériques en
réseau
= Utilise RMI
= Télécharge des données et du code pour piloter le
périphérique
= Constitue une première application de Service Web
Architectures réparties
Java - RMI
Fonctionnnement de JINI
Lors de l’ajout d’un périphérique:
Celui-ci se déclare auprès du serveur
‘Lookup Service’ puis lui envoie son pilote
Le client voulant utiliser le pilote envoie
une demande au serveur
Le serveur lui envoie le pilote du
périphérique