Title: Java RMI et Applications Distribues
1Java RMI et Applications Distribuées
- Remote Method Invocation
- Pascal Molli, Maître de Conférence, Université
Henri Poincaré, Nancy 1
2Applications Distribuées
- Distribution des données
- Données distribuées traitement centralisé
- Distribution du contrôle
- Données centralisées, contrôle distribué
- Distribution des utilisateurs
- Données et contrôle centralisé, utilisateurs
distribués - Un combinaison de tout ça...
3Problèmes généraux
- Tolérance aux pannes (reliability,
fault-tolerance) - Un serveur participant à l application crash..
- Un serveur raconte n importe quoi
- Un serveur n est plus atteignable (mais n est
pas crashé) et le redevient - Atomicité dans les application réparties...
4Problèmes généraux
- Passage à léchelle (scalability)
- ça marche pour 1 utilisateur et pour 10000 ?
- ça marche pour un objet et pour 1000000 ?
- Ça marche pour 1 site et pour 1000 ??
- Ex Construire un serveur E-Commerce résistant Ã
10 000 utilisateurs simultanés ? - Application serveur pooling, cache, réplication,
duplication, monitoring
5Problèmes généraux
- Nommage (naming)
- Un objet Un Id Un état Un comportement
- Appli non répartie Nommage géré par le langage
(référence) ou l OS (addressage) - Appli répartie nommage explicite ? Dynamique ?
- Ex Url, DNS, JNDI, X500, LDAP ...
6Problèmes généraux
- Intégration de l existant (legacy)
- Connexion sur toutes les ressources de
l entreprise - Facturation, Gestion de Stock, Workflow
- Intéropérabilité
- Transactions réparties
7Problèmes généraux
- Déploiement
- Tout est prêt Comment j installe tous mes
composant logiciels sur mes différents serveurs
et clients ? - Je change un nom de serveur, ou j en ajoute un
je recompile tout ? Je redéploie tout ? Ou je
peux configurer le déploiement ?
8Problèmes généraux
- Sécurité
- Confidentialité
- Intégrité
- Droits d accès, Pare-feux
- Authentification
- Identification partenaire
- Non-répudiation
- Messages authentifiés
9Problème généraux
Source Withney
- Security/Logging
- How many people use your server?
- How will you know if someone is trying to hack
into your server? - How will you know what they did?
- If something goes wrong in the server how will
you know? How will you determine what went wrong? - How will you know if a particular client program
has trouble connecting to your server? - Servers need to log client access
10Problèmes généraux
- Disponibilité (availability)
- Un système occupé à faire autre chose (par
exemple gérer la tolérance aux fautes) n est pas
disponible ! - Ex serveur mono-thread
- 2 appels simultanés sur un même objet distants ?
- Sérialisé ?
- Parallèle ?
- Différentes politiques ?
11Problèmes Généraux
Source Krakoviac CAR99
- Coordination Communication Synchronisation
données partagées - Synchronisation
- Mécanisme élémentaires Messages, événements...
- Transaction réparties
- Workflow
- Communication
- Synchrone, asynchrone, flots discrets ou continus
- Information partagées
- Données centralisées, réparties, dupliquées
(cohérence des données)
12Problèmes généraux
- Développement, génie logiciel
- Outils pour gérer
- Conception
- Déploiement
- Débogage !!!!
13Modèle d exécution...
- Modèle Client-Serveur
- (RPC, RMI, Corba, Servlet)
- Modèle de communication par messages
- MOM, Message oriented middleware,
- Queue de messages
- Modèle de communication par événements
- publish/subscribe, push/pull, JMS
- Modèle à Composant
- Bean, EJB
- Modèle à agents mobiles
- Agglet, Voyager
- Modèle à mémoire  virtuelles partagées.
- Modèle à espace de tuples(JavaSpaces)
- Modèle à objets dupliqués
14Java RMI Généralités
- Objectifs écrire des applications distribuées.
- D autres systèmes Corba, Dcom, Entreprise Java
Beans (EJB). - RMI Conçue comme une extension du langage Un
objet sur une JVM peut avoir une référence sur un
autre dans une autre JVM.
15Java RMI généralités.
Celui là !
MyRemoteObject o o.myMethod
16Premiers Problèmes
- Tous les objets sont ils accessibles par les
autres machines ? - Toutes les méthodes peuvent elles être appelées ?
- Comment récupérer un référence sur un objet
distant ? - Et les erreurs liées au réseau ...
17Premiers Pas ...
- Déclarer les objets pouvant être appelés de
manière distante - Sous-classe de java.rmi.RemoteObject
- Déclarer les méthodes pouvant être appelées de
manière distante - déclaration d une interface pour les appels
distant. - Toutes les méthodes distantes peuvent générer des
exceptions - java.rmi.RemoteException
18Notre exemple Copier un fichier
- Copier un fichier d une machine à une autre
- Je lis un fichier sur ma machine je le met dans
un tampon en mémoire - J appelle un méthode d un objet receveur
distant en passant mon tampon en paramètre, - l objet receveur écrit ce paramètre dans un
fichier sur son système de gestion de fichier...
19Diagramme de classe...
- FilePacket La variable intermédiaire.
- FileSender l émetteur
- RemoteReceiver le receveur...
20Diagramme de séquence
Sur le Client
Sur le Serveur...
21(No Transcript)
22Problèmes...
23Accéder à un objet distant ...
- Le créateur de l objet doit d abord
externaliser (au moins) 1 objet en lui donnant un
nom - static void Naming.rebind(String,Remote)
- L utilisateur doit récupérer un référence en
utilisant ce nom - static Object Naming.lookup(String)
24Nommage...
- Quest quun nom ? Une URL
- rmi//java.sun.com2001/root/toto
- rmi le protocole (propriétaire JRMP Java
Remote Method Protocol) - Java.sun.com2001 le nom ou le remoteReceiver
tourne - root/toto une chaîne de caractères pour
déterminer l objet...
25RMI Registry
1 autre JVM
1 JVM
261 autre JVM
1 JVM
ATTENTION ! Passage par copie !
27Objet Remote et non Remote...
- Paramètre et valeur de retour des méthodes
- Sous-classe de RemoteObject -gt passage par
référence - Autrement -gt passage par copie !
28(No Transcript)
29Nommage RmiRegistry
- Attention ! Un processus à part est chargé de
maintenir la table associative ltnom, Remote Refgt
! - CÂ est le rmiregistry !
- 1- on lance le rmiregistry
- 2- on lance le RemoteReceiver
- 3- on lance le FileSender
30Rmiregistry program
Rebind !
(a,o1) (a/b,o2) (a/c,o3)
o1
o2
Toto o(Toto)Lookup(a/b)
o3
31Problème de typage !
- Attention ici 1FP est d une certaine manière
présent sur deux JVM ! Il faut être sur que les
deux JVM ont bien le même FilePacket.class ! - Vérifié par Java à l exécution avec des VID
(version ID) - Problème de déploiement (source d erreur
classique)
32Class loader ...
- Les .Class utilisés par le client peuvent être
téléchargés sur le serveur si elles n existent
pas localement par le RMIClassLoader - Utilisé pour les paramètres et les valeurs de
retour de méthodes distantes. - Facilite le déploiement, mais PB de sécurité !
33RMI et Security Manager !
- Si des classes doivent être téléchargées par le
réseau, elles doivent obéir aux politiques de
sécurité - Par ex Pas d actions sensibles (accès systèmes)
et téléchargement à partir de sources de
confiance (applet host par exemple). - Une politique pré-définie le RMISecurityManager..
.
34(No Transcript)
35Security Manager
- Si aucun Security Manager n est installé
- Tous les chargement de .class doivent se faire Ã
partir du CLASSPATH local. - Mauvais pour le déploiement d application
distribuées (problème fondamental)
36Policies
- Un fichier de policies doit être fourni
grant signedBy "signer_names", codeBase "URL"
permission permission_class_name "target_name",
"action", signedBy "signer_names" ....
permission permission_class_name "target_name",
"action", signedBy "signer_names"
java -Djava.security.policypolicy
37Policies
grant signedBy "Duke" permission
java.io.FilePermission "/tmp/", "read,write"
grant permission java.security.AllPermiss
ion grant signedBy "sysadmin", codeBase
"file/home/sysadmin/" permission
java.security.SecurityPermission
"Security.insertProvider." permission
java.security.SecurityPermission
"Security.removeProvider." permission
java.security.SecurityPermission
"Security.setProperty."
38Class Loader et Déploiement
- java -Djava.rmi.server.codebasehttp//host/rmicla
sses/ LoadClient
import java.rmi.RMISecurityManager import
java.rmi.server.RMIClassLoader public class
LoadClient public static void main()
System.setSecurityManager(new
RMISecurityManager()) try
Class cl RMIClassLoader.loadC
lass("myclient")
Runnable client (Runnable)cl.newInstance()
client.run()
catch (Exception e)
System.out.println("Exception "
e.getMessage())
e.printStackTrace()
39Stub et Skeleton
- Comment ça marche en fait ?
- Pour chaque objet remote, il est nécessaire de
disposer de deux objets l objet stub et
l objet skeleton. - Le stub représente l objet remote sur le client,
une sorte de fantome de l objet remote. - Le skeleton est là pour réceptionner les appels
de méthodes distants du client et les propager Ã
l implémentation de l objet remote sur le
serveur.
40Stub et Skeleton
Client
Serveur
Stub
Skeleton
Remote Reference Layer
Transport Layer
41Stub et skeleton
- Bonne nouvelle ils sont générés
- Mauvaise nouvelle il faut les générer
- Appel de rmic sur une classe sous-classes de
remoteObject (RemoteReceiver pour nous). - Génère RemoteReceiver_Skel.class
RemoteReceiver_Stub.class
42Un peu de code le serveur
public class RemoteReceiver extends
UnicastRemoteObject implements FileReceiver
private String directory public
RemoteReceiver() throws RemoteException
super() public void receiveFile( FilePacket
packet ) throws RemoteException try
packet.writeTo( new FileOutputStream(
packet.getName() ".snt" ) ) catch(
IOException e ) e.printStackTrace()
public static void main( String args )
String usage "Usage java rmi.RemoteReceiver
ltdirectorygt lthostnamegt" try
System.setSecurityManager( new RMISecurityManager(
) ) RemoteReceiver remote new
RemoteReceiver() Naming.rebind( "//" args1
"/receiver", remote ) System.out.println(
"Object is bound" ) catch( Exception e )
e.printStackTrace() System.out.println(
usage )
43LÂ interface ...
public interface FileReceiver extends Remote
public void receiveFile( FilePacket packet )
throws RemoteException
44Le client
public class FileSender implements ActionListener
private Frame frame FileReceiver receiver
public FileSender( String hostname ) throws
Exception receiver (FileReceiver)Naming.look
up( "//" hostname "/receiver" ) frame
new Frame( "File Sender" ) frame.setBounds(
100, 100, 80, 80 ) Button b new Button(
"Send File" ) b.addActionListener( this )
frame.add( "Center", b ) frame.setVisible(
true ) public void actionPerformed(
ActionEvent event ) try FileDialog dialog
new FileDialog( frame, "Upload a file",
FileDialog.LOAD ) dialog.setVisible( true
) String filename dialog.getDirectory()
dialog.getFile() FilePacket packet new
FilePacket( filename ) packet.readIn()
receiver.receiveFile( packet ) catch(
Exception e )e.printStackTrace() public
static void main( String args ) throws
Exception String usage "Usage java
rmi.FileSender ltremotehostgt" try
System.setSecurityManager( new RMISecurityManager(
) ) FileSender sender new FileSender(
args0 ) catch( Exception e )
e.printStackTrace() System.out.println(
usage )
45Déploiement de FileSender ...
- javac .Java
- rmic rmi.RemoteReceiver
- copier les fichiers .class vers le client (Ã
moins de bootstrapper ou de faire une applet) - démarrer rmiregistry sur le serveur
- démarrer le serveur java rmi.RemoteReceiver
- démarrer le client (sur une autre machine) java
rmi.FileSender
46Distributed Garbage Collector.
- Comment libérer les objets référencés dans le
serveur par des remote-références ? - PB
- Le client n utilise plus
- Le client se crash (pour une longue période
- Le client se crashe et réapparait (gloups !)
47Distributed Garbage Collector
- Le serveur maintient une liste de références
remote. - Cette référence remote est prêtée par le serveur
au client pour un temps pré-défini (10 minutes
par défaut). - Le client peut renouveller sa période de prêt en
appelant la méthode dirty() sur le serveur.
48RMI and concurrent calls...
- Attention ! A priori un objet remote peut-être
accédé par plusieurs client ! - Auquel cas la JVM du serveur démarre un thread
par client (distant) - Attention à vos  synchronized .
49Conclusion
- RMI est une extension distribué du langage Java.
Ça a l avantage d être simple et préserve les
qualités du langage (type safety, GC, threads) - PBs
- Ça marche de Java à Java (pas d interopérabilité
avec d autres applications) - C est peu performant et ne supporte pas le
passage à l échelle