Upload
gerard-schaeffer
View
103
Download
0
Embed Size (px)
Citation preview
1
I. Bus logiciel ?
Mireille Blay-Fornarino
D’après [email protected] et Sacha KrakowiakEt (cf. références en bas des pages)
c 2003 - Raphaël Marvie
2
Objectifs de ce cours
Introduire les principes de base de l’architecture des intergiciels …
… via une démarche systématique basée sur le besoin.
c 2003 - Raphaël Marvie
3
Méthodologie suivie pour ce cours
Découvrir la structuration d’un bus logiciel réparti, en concevant un petit bus simple « from scratch ».
Construire un bus logiciel en 10 étapes : Chaque étape est un raffinement de la précédente Etape i + 1 = meilleure structuration de l’étape i
A chaque étape, s’il y a lieu, Identification des principaux schémas
d’architecture
c 2003 - Raphaël Marvie
5
Les Services
Service 1 : Hello world Une méthode hello avec un paramètre de type
chaîne et retourne une chaîne : ”hello, ” + paramètre
Deux méthodes lower et upper qui retournent le paramètre de type chaîne en minuscule ou majuscules
Service 2 : Nombres premiers Calcule si un nombre est premier et retourne un
booléen Calcule le carré d’un nombre passé en paramètre Calcule la division de deux nombres passés en
paramètre
6
1. Au début était la socket
c 2003 - Raphaël Marvie
7
Principe
Deux programmes écrits en deux classes Java Une pour le serveur Server.java Une pour le client Client.java
Dans chaque classe est implémenté Le code fonctionnel : manipulation des
chaînes Le code technique : construction / analyse
des messages réseau
c 2003 - Raphaël Marvie
8
Architecture version « socket »
Client
Réseau
Serveur
c 2003 - Raphaël Marvie
9
Modélisation des Interactions
c 2003 - Raphaël Marvie
10
Côté serveur
Initialisation du réseau Instanciation d’une socket serveur
Gestion des requêtes Attente de connexion (accept) Initialisation des flux d’entrée et de sortie Evaluation des requêtes
Lecture de la requête sur le flux d’entréeCréation de la chaîne à retournerEcriture de la réponse sur le flux de sortie
c 2003 - Raphaël Marvie
11
Code serveur (i)
package step1 ;import java.io.* ;import java.net.* ;public class Server {
private ServerSocket asock ;public Server () throws Exception {
this.asock = new ServerSocket (12345) ;}
public static void main (String args[]) {Server s = new Server () ;s.run () ;
}
c 2003 - Raphaël Marvie
12
Code serveur (ii)
public void run () throws Exception {while (true) {
Socket sock = this.asock.accept () ;BufferedReader in = new BufferedReader
(new InputStreamReader(sock.getInputStream ()));
DataOutputStream out =new DataOutputStream (sock.getOutputStream
());String msg = in.readLine () ;String res = "Hello, " + msg + "\n" ; // fonctionnelout.writeBytes (res) ;
}}
c 2003 - Raphaël Marvie
13
Côté client
Initialisation du réseau Instanciation d’une socket de communication
(connexion implicite)
Gestion de l’échange réseau Initialisation des flux d’entrée et de sortie Demande de service
Ecriture de la requête sur le flux de sortie Lecture de la réponse sur le flux entrée Affichage de la chaîne retournée
Fermeture de la connexion
c 2003 - Raphaël Marvie
14
Code client (i)
package step1 ;import java.io.* ;import java.net.* ;public class Client {
private Socket sock ;public Client () throws Exception {
this.sock = new Socket ("localhost", 12345) ;}
public static void main (String args[]) throws Exception {Client c = new Client () ;c.run (args[0]) ;
}
c 2003 - Raphaël Marvie
15
Code client (ii)
public void run (String msg) throws Exception {BufferedReader in = new BufferedReader
(new InputStreamReader(this.sock.getInputStream ()));DataOutputStream out =
new DataOutputStream (this.sock.getOutputStream ());out.writeBytes (msg + "\n") ;String res = in.readLine () ;System.out.println ("Server replied: " + res) ;this.sock.close();}
}
c 2003 - Raphaël Marvie
16
Bénéfices et limitations
Bénéfices Invocation d’un service distant (hello world) Permet de réaliser des applications client / serveur
Limitations Une seule connexion cliente à la fois Beaucoup de code très technique / peu de code
métier (40 lignes de code technique pour une ligne de code métier)
Un beau plat de spaghettis, difficilement évolutif
17
2. Gestionnaire de connexions
c 2003 - Raphaël Marvie
18
Principe
Du côté serveur Etablissement de la connexion par le serveur
(accept) La gestion de la connexion est déléguée à un objet
Manager qui gère une connexion
Du côté client Rien ne change pour le moment Réutilisation du client de l’étape 1
c 2003 - Raphaël Marvie
19
Architecture version 2
Client
Réseau
Manager
c 2003 - Raphaël Marvie
20
Interactions version 2
c 2003 - Raphaël Marvie
21
Côté serveur (Serveur)
Initialisation De la socket d’administration / serveur Création d’un manager de connexions
Gestion des requêtes Attente de connexion Délégation au manager
c 2003 - Raphaël Marvie
22
Côté serveur (Manager)
Initialisation Rien de spécial
Gestion des requêtes Initialisation du flux d’entrée et de sortie Evaluation de la requête
Lecture de la requête sur le flux entréeCréation de la chaîne à retournerEcriture de la réponse sur le flux de sortie
c 2003 - Raphaël Marvie
23
Code Serveur (i)
package step2 ;import java.io.*;import java.net.*;public class Server {
private ServerSocket asock ;private Manager mgr ;public Server () throws Exception {
this.asock = new ServerSocket (12345) ;this.mgr = new Manager () ;
}
c 2003 - Raphaël Marvie
24
Code Serveur (ii)
public void run () throws Exception {while (true) {
Socket sock = this.asock.accept () ;this.mgr.process (sock) ;
}}
public static void main(String argv[]) throws Exception {Server s = new Server () ;s.run () ;}
}
c 2003 - Raphaël Marvie
25
Code Manager
package step2 ;import java.io.* ;import java.net.* ;
public class Manager {public Manager () throws Exception {}public void process (Socket sock) throws Exception {
BufferedReader in = ...DataOutputStream out = ...String msg = in.readLine () ;String res = "Hello, " + msg + "\n" ;out.writeBytes (res) ;
}}
c 2003 - Raphaël Marvie
26
Bénéfices et limitations
Bénéfices Ebauche de structuration Distinction entre établir une connexion et la
gérer Limitations
Le manager ne sait répondre qu’à une invocation
Le code n’est pas encore objet (i.e. le service)
27
3. Décodage des requêtes
c 2003 - Raphaël Marvie
28
Principe
Côté serveur Le manager propose plusieurs services Le manager gère plusieurs requêtes par
connexion Côté client
Utilise les services séquentiellement Réalise plusieurs invocations avec la même
connexion
c 2003 - Raphaël Marvie
29
Architecture version 3
Client
Réseau
Manager
c 2003 - Raphaël Marvie
30
Interactions version 3
c 2003 - Raphaël Marvie
31
Côté serveur
Gestion des requêtes par le Manager Initialisation des flux d’entrée et de sortie Evaluation de la requête
Lecture de la requête sur flux d’entréeDécodage de la requête (quel service ?)
requête = numéro de service + argumentsEvaluation du service demandéEcriture de la réponse sur flux de sortie
c 2003 - Raphaël Marvie
32
Code Manager (i)
public void process (Socket sock) throws Exception {BufferedReader in = ...DataOutputStream out = ...while (true) {
String msg = in.readLine () ;if (msg == null) // end of client connexion break ;String res ;switch (msg.charAt (0)) {
c 2003 - Raphaël Marvie
33
Code Manager (ii)
case ’0’:res = "hello, " + msg.substring (1) + "\n" ;break ;
case ’1’:Res = msg.substring (1) .toLowerCase () + "\n" ;break ;
case ’2’:res = msg.substring (1) .toUpperCase () + "\n" ;
break ;default:
res = "Unknow operation requested" ;}out.writeBytes (res) ;
} }
c 2003 - Raphaël Marvie
34
Côté client
Initialisation du réseau Instanciation de la socket de communication
Gestion des échanges réseaux Initialisation des flux d’entrée et de sortie Demande de service (x3)
Requête réseau = numéro de service + arguments
Ecriture requête, lecture réponse et affichage Fermeture de la connexion
c 2003 - Raphaël Marvie
35
Code Client (i)
public void run (String msg) throws Exception {
BufferedReader in = ...
DataOutputStream out = ...
String res ;
out.writeBytes ("0" + msg + "\n") ;
res = in.readLine () ;
System.out.println ("Server replied (hello): " + res) ;
c 2003 - Raphaël Marvie
36
Code Client (ii)
out.writeBytes ("1" + msg + "\n") ;res = in.readLine () ;System.out.println ("Server replied (lower): " +
res) ;out.writeBytes ("2" + msg + "\n") ;res = in.readLine () ;System.out.println ("Server replied (upper): " +
res) ;this.sock.close();}
c 2003 - Raphaël Marvie
37
Bénéfices et limitations
Bénéfices Un seul serveur propose plusieurs services Utilisation d’une seule connexion par client
Limitations Le code du service n’est toujours pas objet Le code client est toujours un plat de
spaghetti
38
4. Passage à un service objet
c 2003 - Raphaël Marvie
39
Principe
Côté serveur Le service est implémenté comme un objet :
le Servant Le manager est dédié au réseau
décode les requêtes invoque le Servant
Côté client Rien ne change
c 2003 - Raphaël Marvie
40
Architecture version 4
Client
Réseau
Manager
Servant
c 2003 - Raphaël Marvie
41
Interactions version 4
c 2003 - Raphaël Marvie
42
Côté serveur
Initialisation du Manager dans le serveur Passage du Servant comme paramètre
Gestion des requêtes par le Manager Initialisation des flux Evaluation des requêtes
lecture et décodage de la requête invocation du Servantécriture de la réponse
c 2003 - Raphaël Marvie
43
Code Server
public class Server {private ServerSocket asock ;private Manager mgr ;
public Server () throws Exception {this.asock = new ServerSocket (12345) ;this.mgr = new Manager (new Servant ())
;}// unchanged}
c 2003 - Raphaël Marvie
44
Code Servant
public class Servant {public String hello (String msg) {
return "hello, " + msg ;}public String lower (String msg) {
return msg.toLowerCase () ;}
public String upper (String msg) {return msg.toUpperCase () ;
}}
c 2003 - Raphaël Marvie
45
Code Manager (i)
public class Manager {private Servant ref ;public Manager (Servant s) throws Exception {
this.ref = s ;}public void process (Socket sock) throws Exception {
BufferedReader in = ...DataOutputStream out = ...while (true) {
String msg = in.readLine () ;if (msg == null) // no more to be read
break ;String res ;switch (msg.charAt (0)) {
c 2003 - Raphaël Marvie
46
Code Manager (i)
case ’0’:res = this.ref.hello (msg.substring (1)) + "\n" ;break ;
case ’1’:res = this.ref.lower (msg.substring (1)) + "\n" ;break ;
case ’2’:res = this.ref.upper (msg.substring (1)) + "\n" ;break ;
default:res = "Unknow operation requested" ;
}out.writeBytes (res) ;}
c 2003 - Raphaël Marvie
47
Bénéfices et limitations
Bénéfices Découplage complet entre code technique
et code métier (côté serveur) Les services sont implantés comme des
objets (Servant) Limitations
L’interface du service n’est pas connue comme telle du client
Le code client n’est toujours pas objet
48
5. Passage à l’objet du côté client
c 2003 - Raphaël Marvie
49
Principe
Côté serveur Définition d’un contrat à partager avec le
client Le servant implémente le contrat commun
Côté clientUtilisation d’un objet représentant le service :
Proxy Même interface que le service Encapsule le code technique de gestion du réseau
c 2003 - Raphaël Marvie
50
Architecture version 5
Proxy
Réseau
Manager
ServantClient
Contrat
c 2003 - Raphaël Marvie
51
Interactions version 5
c 2003 - Raphaël Marvie
52
Côté serveur
Modifications Définition d’un contrat de service Le servant implémente le contrat de service
Contrat de service Définit toutes les méthodes accessibles à
distance Chaque méthode peut lever une exception
liée au réseau
c 2003 - Raphaël Marvie
53
Contrat de service
package step5 ;
interface Service {
public String hello (String msg) throws Exception ;
public String lower (String msg) throws Exception ;
public String upper (String msg) throws Exception ;
}
c 2003 - Raphaël Marvie
54
Modification du Servant
public class Servant implements Service {public String hello (String msg) throws Exception {
return "hello, " + msg ;}public String lower (String msg) throws Exception {
return msg.toLowerCase () ;}public String upper (String msg) throws Exception {
return msg.toUpperCase () ;}
}
c 2003 - Raphaël Marvie
55
Côté client
Programme client Instancie un proxy Invocation des méthodes du proxy
Mise en oeuvre du Proxy Implémente l’interface de contrat Initialise la connexion au serveur Gère toute la partie échanges réseaux
c 2003 - Raphaël Marvie
56
Code du Client
public class Client { private Socket sock ;private Service ref ;
public Client () throws Exception {this.ref = (Service) new Proxy () ;
}public void run (String msg) throws Exception {
System.out.println (this.ref.hello (msg)) ;System.out.println (this.ref.lower (msg)) ;System.out.println (this.ref.upper (msg)) ;
}}
c 2003 - Raphaël Marvie
57
Code du Proxy (i)
public class Proxy implements Service {private Socket sock ;private BufferedReader in ;private DataOutputStream out ;public Proxy () throws Exception {
this.sock = new Socket ("localhost", 12345) ;this.in = ...this.out = ...
}public String hello (String msg) throws Exception {
this.out.writeBytes ("0" + msg + "\n") ;String res = this.in.readLine () ;return res ;
}
c 2003 - Raphaël Marvie
58
Code du Proxy (ii)
public String lower (String msg) throws Exception {this.out.writeBytes ("1" + msg + "\n") ;String res = this.in.readLine () ;return res ;}
public String upper (String msg) throws Exception {this.out.writeBytes ("2" + msg + "\n") ;String res = this.in.readLine () ;return res ;}
protected void finalize () throws Throwable {this.sock.close () ;}
}
c 2003 - Raphaël Marvie
59
Proxy : Bilan Contexte
Applications constituées d’un ensemble d’objets répartis ; un client accède à des services fournis par un objet pouvant être distant (le “servant”)
Problème Définir un mécanisme d’accès qui évite au client
Le codage “en dur” de l’emplacement du servant dans son code Une connaissance détaillée des protocoles de communication
Propriétés souhaitables Accès efficace et sûr Programmation simple pour le client ; idéalement, pas de différence entre
accès local et distant Contraintes
Environnement réparti (pas d’espace unique d’adressage) Solutions
Utiliser un représentant local du servant sur le site client (isole le client du servant et du système de communication)
Garder la même interface pour le représentant et le servant Définir une structure uniforme de représentant pour faciliter sa
génération automatique
C 2003 - Sacha Krakowiak
c 2003 - Raphaël Marvie
60
Usage de Proxy
C 2003 - Sacha Krakowiak
c 2003 - Raphaël Marvie
61
Définitions d’interfaces
Partie “opérationnelle” Interface Definition Language (IDL) Pas de standard indépendant
IDL CORBA Java et C# définissent leur propre IDL WSDL …
Partie “contractuelle” Plusieurs niveaux de contrats
Sur la forme : spécification de types -> conformité syntaxique
Sur le comportement (1 méthode) : assertions -> conformité sémantique
Sur les interactions entre méthodes : synchronisation Sur les aspects non fonctionnels (performances, etc.) :
contrats de QoS
C 2003 - Sacha Krakowiak
c 2003 - Raphaël Marvie
62
Bénéfices et limitations
Bénéfices Du point de vue du client la répartition est masquée Le service est vu et manipulé comme un objet local
Limitations Comment utiliser des paramètres autres que de
type String ? Comment désigner un service distant (sans le
coder en dur) ?
63
6. Encodage et décodage des données
c 2003 - Raphaël Marvie
64
Principe
Traduction des paramètres Empaquetage : application vers les messages
réseau type de base vers représentation chaîne
Dépaquetage : messages réseau vers application représentation chaîne vers type de base
Opérations de traduction symétriques Serveur : dépaquetage des paramètres,
empaquetages des valeurs de retour Client : empaquetage des paramètres,
dépaquetages des valeurs de retour
c 2003 - Raphaël Marvie
65
Architecture version 6
Proxy
Réseau
Manager
ServantClient
Contrat
c 2003 - Raphaël Marvie
66
Interactions version 6
c 2003 - Raphaël Marvie
67
Côté serveur
Modification du contrat de service Offre une opération supplémentaire Calcul du carré d’un entier (retourne un
entier) Modification de la mise en oeuvre
Manager : message réseau supplémentaire et décodage entier
Servant : implémentation de la nouvelle méthode
c 2003 - Raphaël Marvie
68
Contrat Service
interface Service {public String hello (String msg) throws Exception ;
public String lower (String msg) throws Exception ;
public String upper (String msg) throws Exception ;
public int sqr (int a) throws Exception ;
}
c 2003 - Raphaël Marvie
69
Code Manager
public void process (Socket sock) throws Exception {// unchangedswitch (msg.charAt (0)) {
// unchanged for 0-2case ’3’: int val = Integer.parseInt (msg.substring (1)) ; res = "" + this.ref.sqr (val) + "\n" ; break ;default: res = "Unknow operation requested" ;}out.writeBytes (res) ;}
}
c 2003 - Raphaël Marvie
70
Code Servant
public class Servant implements Service {
// unchanged
public int sqr (int val) throws Exception {
return val * val ;
}
}
c 2003 - Raphaël Marvie
71
Côté client
Modification de la mise en oeuvre Le proxy implémente la nouvelle opération Le programme client utilise la nouvelle
opération Mise en oeuvre du Proxy
Empaquetage de l’entier paramètre dans une chaîne
Dépaquetage de l’entier contenu dans la chaîne retour
c 2003 - Raphaël Marvie
72
Code Proxy
public class Proxy implements Service {// unchangedpublic int sqr (int val) throws Exception {
this.out.writeBytes ("3" + val + "\n") ;String res = this.in.readLine () ;return Integer.parseInt (res) ;
}}
c 2003 - Raphaël Marvie
73
Code Client
public class Client {// unchanged
public void run (String msg) throws Exception {System.out.println (this.ref.hello (msg)) ;
System.out.println (this.ref.lower (msg)) ;
System.out.println (this.ref.upper (msg)) ;
int res = this.ref.sqr (123) ;
System.out.println (res) ;
}
}
c 2003 - Raphaël Marvie
74
Bénéfices et limitations
Bénéfices Utilisation transparente des types de base autres
que String Vision objet d’une application répartie
Limitations Comment désigner un service distant sans le coder
en dur ? (this.sock = new Socket ("localhost", 12345))
Comment écrire un client pouvant utiliser plusieurs services ?
75
7. Notion de référence distante
c 2003 - Raphaël Marvie
76
Principe
Désignation d’un service distant Equivalent à une référence Java mais en
réparti Permet d’établir une connexion avec un
service Définition d’une référence (base)
Hôte distant : adresse IP Serveur distant : port IP
c 2003 - Raphaël Marvie
77
Architecture version 7
Proxy
Réseau
Manager
ServantClient
Contrat
c 2003 - Raphaël Marvie
78
Interactions version 7
c 2003 - Raphaël Marvie
79
Côté client
Fourniture de la référence du serveur Propriété java contenant la référence Référence donnée sous la forme machine:port
Ajout d’une méthode de gestion des références Analyse la référence Instancie et initialise le Proxy d’accès au service
# utilisation avec une référence
> java –D «service.reference=localhost:12345»
step7.Client «Tout le Monde »
c 2003 - Raphaël Marvie
80
Code Client
public class Client {
private Service ref ;
public Client () throws Exception {
this.ref = (Service) this.ref2proxy () ;
}
// other methods unchanged
c 2003 - Raphaël Marvie
81
Code Client
public Proxy ref2proxy () throws Exception {Properties props = System.getProperties () ;String ref = props.getProperty ("service.reference") ;if (ref == null)
throw new Exception ("no server reference given") ;String parts[] = ref.split (":") ;if (parts.length < 2)
throw new Exception ("malformed reference") ;String host = parts [0] ;int port = Integer.parseInt (parts [1]) ;return new Proxy (host, port) ;}
}
c 2003 - Raphaël Marvie
82
Bénéfices et limitations
Bénéfices Le code client n’est pas lié à une instance de
serveur Possibilité d’utiliser différents serveurs
Limitations Un seul objet service par serveur Un client ne peut utiliser qu’un objet à la fois Le client doit connaître le type de la référence à la
compilation