Modèle client-serveur - RMI
O. AKTOUF
Grenoble INP - Esisar
Cours conçu à partir des enseignements de
- D. Hagimont (INRIA)
- M. Riveill (UNSA)
1
Modèle client-serveur
définition
Application client/serveur
application qui fait appel à des services distants au travers
d’un échange de messages (les requêtes) plutôt que par
un partage de données (mémoire ou fichiers)
serveur
- programme offrant un service sur un réseau (par extension,
machine offrant un service)
client
- programme qui émet des requêtes (ou demandes de service). Il
est toujours l’initiateur du dialogue
2
Modèle client-serveur
définition
La communication entre le client et le serveur utilise
2 mécanismes de base :
- La communication par messages
- L’appel de procédure à distance
3
Modèle client-serveur
communication par messages
Deux messages (au moins) échangés
Le premier message correspondant à la requête est celui
de l'appel de procédure, porteur des paramètres d'appel
Le second message correspondant à la réponse est celui
du retour de procédure porteur des paramètres résultats
Procédure proc (p_in, p_out)
Appel(p_in) begin
appel proc (p_in, p_out)
end
Retour(p_out)
client serveur
4
Modèle client-serveur
exemples
Serveur de fichiers (nfsd)
Serveur d'impressions (lpd)
Serveur de calcul
Serveur de bases de données
Serveur de noms (annuaire des services)
Serveur web (httpd)
5
RPC [Birrel & Nelson 84]
Principe de réalisation
Service RPC Protocole de Protocole de Service RPC
(talon) communication communication (talon)
Appelant
Appelé
A B
appel
C
Appel
réseau
E D return
return
client serveur 6
RPC (A)
Principe de fonctionnement
Côté de l’appelant
Le client réalise un appel procédural vers la procédure
talon client
transmission de l’ensemble des arguments
au point A
le talon collecte les arguments et les assemble dans un message
(empaquetage - parameter marshalling)
un identificateur est généré pour le RPC
un délai de garde est armé
détermination de l’adresse du serveur
le talon transmet les données au protocole de transport pour
émission sur le réseau
7
RPC (B et C)
Principe de fonctionnement
Coté de l’appelé
le protocole de transport délivre le message au service de
RPC (talon serveur/skeleton)
au point B
le talon désassemble les arguments (dépaquetage - unmarshalling)
l’identificateur de RPC est enregistré
l’appel est ensuite transmis à la procédure distante requise
pour être exécuté (point C). Le retour de la procédure
redonne la main au service de RPC et lui transmet les
paramètres résultats (point D)
8
RPC (D)
Principe de fonctionnement
Coté de l’appelé
au point D
les arguments de retour sont empaquetés dans un message
un autre délai de garde est armé
le talon transmet les données au protocole de transport pour
émission sur le réseau
9
RPC (E)
Principe de fonctionnement
Coté de l’appelant
l’appel est transmis au service de RPC (point E)
les arguments de retour sont dépaquetés
le délai de garde armé au point A est désarmé
un message d’acquittement avec l’identificateur du RPC est envoyé
au talon serveur (le délai de garde armé au point D peut être
désarmé)
les résultats sont transmis à l’appelant lors du retour de procédure
10
RPC
Rôle des talons
Talon client - stub Talon serveur - skeleton
C’est la procédure d’interface du C’est la procédure sur le site
site client serveur
appelé par le programme client appelé par le dispatcher
qui reçoit l’appel en mode local qui reçoit l’appel sous forme de
le transforme en appel distant en message
envoyant un message fait réaliser l’exécution sur le site
reçoit les résultats après serveur par la procédure serveur
l'exécution (choix de la procédure)
retourne les paramètres résultats retransmet les résultats par
comme dans un retour de message
procédure
11
RPC
Problèmes
Problèmes de sécurité
authentification du client
Traitement des défaillances authentification du serveur
Congestion du réseau ou du confidentialité des échanges
serveur
Panne du client pendant le
traitement de la requête Désignation et liaison
Panne du serveur avant ou - Statique, dynamique
pendant le traitement de la Aspects pratiques
requête Adaptation à des conditions
Erreur de communication multiples (protocoles,
langages, matériels)
Gestion de l'hétérogénéité
12
Client-serveur « à objet »
Motivations objets "langage"
- propriétés de l’objet (encapsulation, - représentation propre au
modularité, réutilisation,
polymorphisme, composition) langage : instance d'une
- objet : unité de désignation et de classe
distribution
- exemple : Java RMI
Eléments d'une "invocation"
- référence d'objet ("pointeur"
objets "système"
universel) - représentation
- identification d'une méthode "arbitraire" définie par
- paramètres d'appel et de retour (y l'environnement
compris signal d'exception)
- passage par valeur : types
d'exécution
élémentaires et types construits - exemple : CORBA
- passage par référence
13
Appel de méthode à distance
Remote Method Invocation (RMI)
objet client objet serveur
état
référence
Methode_1
Talon Talon .
appel client serveur
.
Methode_n
Système de communication
Référence d'objet + méthode + arguments désignation
envoi de requêtes
exécution de requête
Résultat ou exception retour de résultat
14
RPC
Java RMI
Un RPC objet intégré à Java
API de communication entre objets distants
Version standard de Java
Interaction d'objets situés dans des espaces d'adressage
différents sur des machines distinctes
Communication entre programmes Java sur tout SE disposant
d’une JVM
Simple à mettre en œuvre : un objet distribué se manipule
comme tout autre objet Java
15
Java RMI
Architecture
Objet Client Objet Serveur
Proxy Skeleton
JVM Remote Reference Layer JVM
Transport
16
Java RMI
Architecture
rmiregistry
Naming
Client Serveur
Skeleton
JVM Client
JVM Serveur
17
Java RMI
Mode opératoire coté serveur
1 - L'objet serveur s'enregistre auprès du Naming de sa JVM
(méthode rebind)
2 - L ’objet skeleton est créé, celui-ci crée le port de
communication et maintient une référence vers l'objet
serveur
3 - Le Naming enregistre l'objet serveur, et le port de
communication utilisé auprès du serveur de noms
L'objet serveur est prêt à répondre à des requêtes
18
Java RMI
Architecture
rmiregistry
Naming
Naming
Client Serveur
Stub
Skeleton
JVM Client
JVM Serveur
19
Java RMI
Mode opératoire coté client
4 - L'objet client fait appel au Naming pour localiser l'objet
serveur (méthode lookup)
5 - Le Naming récupère les "références" vers l'objet serveur,
...
6 - crée l’objet Stub et ...
7 - rend sa référence au client
8 - Le client effectue l'appel au serveur par appel à l’objet
Stub
20
Java RMI
Manuel d'utilisation
Définition de l'interface de l'objet distant
- interface : "extends java.rmi.Remote"
- methodes : "throws java.rmi.RemoteException"
- paramètres sérializables : "implements Serializable"
Ecrire une implémentation de l'objet serveur
- Par héritage , classe : "extends
java.rmi.server.UnicastRemoteObject"
- Par délégation, classe n’hérite plus de UnicastRemoteObject
- Création et exportation d’un stub
21
Java RMI
Mode opératoire
Codage
- description de l’interface du service
- écriture du code du serveur qui implante l’interface
- écriture du client qui appelle le serveur
Compilation
- compilation des sources (javac)
- génération des stub et skeleton (rmic) pour les versions antérieures à
Java SE 5.0
- des plugins existent pour Eclipse, NetBeans, …
Activation
- lancement du serveur de noms (rmiregistry)
- lancement du serveur
- lancement du client
22
Java RMI
Mode opératoire
Stub : implémente l’interface du serveur et le remplace côté
client. Masquage des aspects complexes :
- Localisation de la référence sur le serveur
- Appel des méthodes à distance
- Paquetage et dépaquetage des arguments
- Unicité de l’objet serveur et la cohérence de son état
- Ramasse-miettes des références
- Généré à partir de la classe compilée du serveur
nécessité de la charger avant
23
RPC
Java RMI : écriture de l ’interface
Mêmes principes de base que pour l’interface d’un objet local
Principales différences
- l’interface distante doit être publique
- l’interface distante doit étendre l’interface
java.rmi.Remote
- chaque méthode doit déclarer au moins l’exception
java.rmi.RemoteException
- tout objet distant passé en paramètre doit être déclaré
comme une interface (passage de la référence de l’objet)
- tout objet local passé en paramètre doit être sérialisable
24
Java RMI
Exemple : Interface
Description de l’interface
fichier Hello.java
public interface Hello extends java.rmi.Remote {
String sayHello() throws java.rmi.RemoteException;
}
25
RPC
Java RMI : écriture du serveur
Serveur = la classe qui implémente l’interface
- spécifier les interfaces distantes qui doivent être implémentées
- objets locaux passés par copie (il doivent implémenter l’interface
java.io.Serialisable)
- objets distants passés par référence (référence à un stub)
- c’est un objet Java standard
- définir le constructeur de l’objet
- fournir la mise en œuvre des méthodes pouvant être appelées à distance
- ainsi que celle des méthodes n’apparaissant dans aucune interface
implémentée
- créer au moins une instance du serveur
- enregistrer au moins une instance dans le serveur de noms
(rmiregistry)
26
Java RMI
Exemple : Serveur
Réalisation du serveur
fichier HelloServeur.java
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public class HelloServeur extends UnicastRemoteObject implements Hello {
private String msg;
// Constructeur
public HelloServeur(String msg) throws java.rmi.RemoteException {
this.msg = msg;
}
// Implémentation de la méthode distante.
public String sayHello() throws java.rmi.RemoteException {
return "Hello world: " + msg;
}
…
27
Java RMI
Exemple : Serveur
Réalisation du serveur (suite)
fichier HelloServeur.java
public static void main(String args[]) {
try {
// Crée une instance de l ’objet serveur.
HelloServeur obj = new HelloServeur("HelloServeur");
// Enregistre l'objet créer auprès du serveur de noms.
Naming.rebind("//hote/mon_serveur", obj);
System.out.println("HelloServeur" + " bound in registry");
} catch (Exception exc) {… }
}
}
Remarque : le serveur de noms doit être activé avant la création du serveur
28
Java RMI
Activation du serveur de nom par le serveur
Autre Réalisation possible du serveur
fichier HelloServeur.java
public static void main(String args[]) {
int port; String URL;
try {// transformation d ’une chaîne de caractères en entier
Integer I = new Integer(args[0]); port = I.intValue();
} catch (Exception ex) {
System.out.println(" Please enter: Server <port>");
return;
}
try { // Création du serveur de nom - rmiregistry
Registry registry = LocateRegistry.createRegistry(port);
// Création d ’une instance de l ’objet serveur
HelloServeur obj = new HelloServeur("Coucou, je suis le serveur de port : "+port);
// Calcul de l ’ ’URL du serveur
URL = "rmi://"+InetAddress.getLocalHost().getHostAddress()+":"+port+"/mon_serveur";
Naming.rebind(URL, obj);
} catch (Exception exc) { ...
29
Java RMI
Exemple : Client
Réalisation du client
fichier HelloClient.java
import java.rmi.*;
public class HelloClient {
public static void main(String args[]) {
try {
// Récupération d'un stub sur l'objet serveur.
Hello obj = (Hello) Naming.lookup("//hote/mon_serveur");
// Appel d'une méthode sur l'objet distant.
String msg = obj.sayHello();
// Impression du message.
System.out.println(msg);
} catch (Exception exc) { … }
}
}
30
Java RMI
Compilation
Compilation de l’interface, du serveur et du client
- javac Hello.java HelloServeur.java HelloClient.java
Génération des talons (ne concerne pas le Java SE 5.0 et versions
postérieures)
- rmic HelloServeur
- skeleton dans HelloServeur_Skel.class
- stub dans HelloServeur_Stub.class
31
Java RMI
Déploiement
1) Activation du serveur de noms
- start rmiregistry (Windows) ou rmiregistry & (Unix)
2) Activation du serveur
- java HelloServeur
- java -Djava.rmi.server.codebase=http://hote/…
- path indiquant à quel endroit la machine virtuelle cliente va
pouvoir chercher le code du stub
- Nécessaire si le client et le serveur ne sont pas sur la même
station
3) Activation du client
- java HelloClient
32
Java RMI
Principe de l’appel de procédure
Java VM Java VM
Client R_objet1
m ()
R_objet1.m ()
Stub Skeleton
R_objet1 R_objet1
33
Java RMI
Passage en paramètre d’un objet local
Java VM Java VM
O2 Objet objet1
m ( O2 )
Client
R_objet1.m ( O2 ) clone_O2
Stub Skeleton
R_objet1 R_objet1
34
Java RMI Objet O2
Passage en paramètre d’un objet distant
Java VM Java VM
Stub
R_O2 Objet objet1
Client m ( R objet )
R_objet1.m ( R O2 )
Stub
Skeleton
R_objet1
R_objet1
35
Java RMI Objet O2
Passage en paramètre d’un objet distant
Java VM Java VM
Stub
Objet objet1
R_O2 m ( R objet )
Client Stub
R_objet1.m ( R O2 )
R_O2
Stub Skeleton
R_objet1 R_objet1
36
Chargement dynamique et
sécurité
Si le code du stub n’est pas présent sur le site local, le protocole RMI
prévoit le chargement dynamique du stub en utilisant un serveur web et
le protocole HTTP
- java -Djava.rmi.server.codebase=http://hote/…
Si chargement dynamique…
- le chargeur dynamique utilisé par RMI (RMIClassLoader) regarde si
la classe demandée correspond au niveau de sécurité requis
- définition du niveau de sécurité requis (fichier de polices de sécurité,
concernant les actions sensibles : accès au système de fichiers local,
connexions réseau, etc.)
- utilisation d’un SecurityManager
- créer et installer le « gestionnaire de sécurité »
- System.setSecurityManager(new RMISecurityManager());
37
Java RMI : bilan
Très bon exemple de RPC
- facilité d’utilisation
- intégration au langage Java et à l’internet
- utilisation de l’apport de Java
- Hétérogénéité des plateformes -> machine virtuelle
- Passage par valeur -> sérialisation
- Persistance -> sérialisation
- Absence de talon -> chargement dynamique
- Désignation -> URL
Des ouvertures
- Serveurs multiplexés (MulticastRemoteObject) ?
- Appels asynchrones ?
- Utilisation d’autres protocoles réseaux et liens avec d’autres langages
de programmation ?
38
RPC asynchrone
Le client poursuit son exécution après l’émission du message d’appel
- la procédure distante s’exécute en parallèle avec la poursuite du client
et retourne les paramètres résultats en fin de son exécution
- le client récupère les résultats quand il en a besoin (primitive spéciale)
- avantage : parallélisme plus important
- critique le client ne retrouve pas la sémantique de l’appel de
procédure
- contrôle de la récupération des résultats : pb de synchronisation (risque
d’erreur)
39
Appel asynchrone avec futur
Futur
- objet particulier pour la récupération des résultats
- futur explicite :
- construction avant l’appel de l’objet dans lequel les résultats seront
déposés
- futur implicite :
- c’est le mécanisme d’appel qui construit les objets résultats
- mode d’utilisation :
- la lecture rend un résultat nul si le résultat n’est pas disponible
- la lecture bloque le client si le résultat n’est pas disponible
40