i. bus logiciel ?

81
1 I. Bus logiciel ? Mireille Blay-Fornarino blay @ essi.fr D’après [email protected] et Sacha Krakowiak Et (cf. références en bas des pages)

Upload: tacy

Post on 19-Mar-2016

20 views

Category:

Documents


0 download

DESCRIPTION

I. Bus logiciel ?. Mireille Blay-Fornarino [email protected]. D’après [email protected] et Sacha Krakowiak Et (cf. références en bas des pages). Objectifs de ce cours. Introduire les principes de base de l’architecture des intergiciels … - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: I. Bus logiciel ?

1

I. Bus logiciel ?

Mireille Blay-Fornarino [email protected]

D’après [email protected] et Sacha KrakowiakEt (cf. références en bas des pages)

Page 2: I. Bus logiciel ?

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.

Page 3: I. Bus logiciel ?

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

[email protected]

Page 4: I. Bus logiciel ?

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

Page 5: I. Bus logiciel ?

6

1. Au début était la socket

Page 6: I. Bus logiciel ?

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

Page 7: I. Bus logiciel ?

c 2003 - Raphaël Marvie

8

Architecture version « socket »

Client

Réseau

Serveur

Page 8: I. Bus logiciel ?

c 2003 - Raphaël Marvie

9

Modélisation des Interactions

Page 9: I. Bus logiciel ?

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

Page 10: I. Bus logiciel ?

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 () ;

}

Page 11: I. Bus logiciel ?

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) ;

}}

Page 12: I. Bus logiciel ?

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

Page 13: I. Bus logiciel ?

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]) ;

}

Page 14: I. Bus logiciel ?

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();}

}

Page 15: I. Bus logiciel ?

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

Page 16: I. Bus logiciel ?

17

2. Gestionnaire de connexions

Page 17: I. Bus logiciel ?

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

Page 18: I. Bus logiciel ?

c 2003 - Raphaël Marvie

19

Architecture version 2

Client

Réseau

Manager

Page 19: I. Bus logiciel ?

c 2003 - Raphaël Marvie

20

Interactions version 2

Page 20: I. Bus logiciel ?

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

Page 21: I. Bus logiciel ?

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

Page 22: I. Bus logiciel ?

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 () ;

}

Page 23: I. Bus logiciel ?

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 () ;}

}

Page 24: I. Bus logiciel ?

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) ;

}}

Page 25: I. Bus logiciel ?

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)

Page 26: I. Bus logiciel ?

27

3. Décodage des requêtes

Page 27: I. Bus logiciel ?

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

Page 28: I. Bus logiciel ?

c 2003 - Raphaël Marvie

29

Architecture version 3

Client

Réseau

Manager

Page 29: I. Bus logiciel ?

c 2003 - Raphaël Marvie

30

Interactions version 3

Page 30: I. Bus logiciel ?

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

Page 31: I. Bus logiciel ?

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)) {

Page 32: I. Bus logiciel ?

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) ;

} }

Page 33: I. Bus logiciel ?

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

Page 34: I. Bus logiciel ?

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) ;

Page 35: I. Bus logiciel ?

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();}

Page 36: I. Bus logiciel ?

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

Page 37: I. Bus logiciel ?

38

4. Passage à un service objet

Page 38: I. Bus logiciel ?

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

Page 39: I. Bus logiciel ?

c 2003 - Raphaël Marvie

40

Architecture version 4

Client

Réseau

Manager

Servant

Page 40: I. Bus logiciel ?

c 2003 - Raphaël Marvie

41

Interactions version 4

Page 41: I. Bus logiciel ?

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

Page 42: I. Bus logiciel ?

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}

Page 43: I. Bus logiciel ?

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 () ;

}}

Page 44: I. Bus logiciel ?

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)) {

Page 45: I. Bus logiciel ?

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) ;}

Page 46: I. Bus logiciel ?

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

Page 47: I. Bus logiciel ?

48

5. Passage à l’objet du côté client

Page 48: I. Bus logiciel ?

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

Page 49: I. Bus logiciel ?

c 2003 - Raphaël Marvie

50

Architecture version 5

Proxy

Réseau

Manager

ServantClient

Contrat

Page 50: I. Bus logiciel ?

c 2003 - Raphaël Marvie

51

Interactions version 5

Page 51: I. Bus logiciel ?

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

Page 52: I. Bus logiciel ?

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 ;}

Page 53: I. Bus logiciel ?

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 () ;}

}

Page 54: I. Bus logiciel ?

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

Page 55: I. Bus logiciel ?

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)) ;

}}

Page 56: I. Bus logiciel ?

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 ;

}

Page 57: I. Bus logiciel ?

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 () ;}

}

Page 58: I. Bus logiciel ?

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

Page 59: I. Bus logiciel ?

c 2003 - Raphaël Marvie

60

Usage de Proxy

C 2003 - Sacha Krakowiak

Page 60: I. Bus logiciel ?

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

Page 61: I. Bus logiciel ?

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) ?

Page 62: I. Bus logiciel ?

63

6. Encodage et décodage des données

Page 63: I. Bus logiciel ?

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

Page 64: I. Bus logiciel ?

c 2003 - Raphaël Marvie

65

Architecture version 6

Proxy

Réseau

Manager

ServantClient

Contrat

Page 65: I. Bus logiciel ?

c 2003 - Raphaël Marvie

66

Interactions version 6

Page 66: I. Bus logiciel ?

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

Page 67: I. Bus logiciel ?

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 ;

}

Page 68: I. Bus logiciel ?

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) ;}

}

Page 69: I. Bus logiciel ?

c 2003 - Raphaël Marvie

70

Code Servant

public class Servant implements Service {// unchangedpublic int sqr (int val) throws Exception {

return val * val ;}

}

Page 70: I. Bus logiciel ?

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

Page 71: I. Bus logiciel ?

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) ;

}}

Page 72: I. Bus logiciel ?

c 2003 - Raphaël Marvie

73

Code Client

public class Client {// unchangedpublic 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) ;

}

}

Page 73: I. Bus logiciel ?

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 ?

Page 74: I. Bus logiciel ?

75

7. Notion de référence distante

Page 75: I. Bus logiciel ?

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

Page 76: I. Bus logiciel ?

c 2003 - Raphaël Marvie

77

Architecture version 7

Proxy

Réseau

Manager

ServantClient

Contrat

Page 77: I. Bus logiciel ?

c 2003 - Raphaël Marvie

78

Interactions version 7

Page 78: I. Bus logiciel ?

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 »

Page 79: I. Bus logiciel ?

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

Page 80: I. Bus logiciel ?

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) ;}

}

Page 81: I. Bus logiciel ?

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