1 I. Bus logiciel ? Mireille Blay-Fornarino blay@essi.fr Daprès Raphael.Marvie@lifl.fr et Sacha...

Preview:

Citation preview

1

I. Bus logiciel ?

Mireille Blay-Fornarino

blay@essi.fr

D’après Raphael.Marvie@lifl.fr 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

Raphael.Marvie@lifl.fr

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

Recommended