Introduction : Applications réparties par objets

Preview:

Citation preview

EPU SI4 - 2008 1

Introduction : Applications réparties par objets

Mireille Blay-Fornarinoblay@essi.fr

http://www.polytech.unice.fr/~blay/ENSEIGNEMENT/AppRep/http://www.polytech.unice.fr/~pinna/Sar/AppRep/

Voir les cours qui ont servi de référence dans la bibliographie

EPU SI4 - 2008 2

Objectifs

Sensibilisation au besoin d’intégration des applications logicielles réparties en contexte industriel

Conception d’Architectures logicielles

Acquisition de connaissances sur les modèles existants pour les applications réparties

RMI, CORBA, JNDI, JMS, Puis dans le domaine de l’internet :

SOAP & Services web, Ajax,

Bases de l’approche IntergicielPrincipes directeurs, organisation, usageFonctionnement interne (“ au coeur de …”)

EPU SI4 - 2008 3

Entreprise virtuelle : illustration

( )ρ∂∂cρut

divKgradu F= +( )0

20

40

60

80

100

EstOuestNord

Est 20,4 27,4 90 20,4Ouest 30,6 38,6 34,6 31,6Nord 45,9 46,9 45 43,9

1er trim. 2e trim. 3e trim. 4e trim.

Mireille Blay-Fornarino

Assemblage de ressources de Stockage, Calculs, réseaux

=> B2B

EPU SI4 - 2008 4

Pourquoi utiliser des applications réparties ?

- Répartition des données géographiquement et topologiquement

- Redondance d’une application : diminuer le taux de panne, augmenter la fiabilité

- Gestion de la montée en charge

- Intégration d’applications existantes

EPU SI4 - 2008 5

Les 8 erreurs conceptuelles

1. Le réseau est fiable.2. La latence est nulle.3. La bande passante du réseau est infinie.4. Le réseau est sécurisé.5. La topologie de l’application est « éternelle »6. Il y a un seul administrateur du réseau7. Le coût du transport est nul.8. Le réseau est homogène.

Annick Fron

EPU SI4 - 2008 6

Propriétés à prendre en compte

DistributionEquilibrage de chargeParallélisationDécentralisationCouplage

Prise de décision Contrôle de l’accès concurrentServeurs parallèlesDonnées réparties synchronisation

de l'accès aux ressources, Gestion des transactions

HétérogénéitéHardwareLangagesRessourcesContexte d’usage

Désignation/localisationMigrationMobilitéUbiquitéEvolution

Mireille Blay-Fornarino

EPU SI4 - 2008 7

Propriétés à prendre en compteSécurité

authentification (certificats)sécurisation des communications (cryptage)contrôle d’accès (autorisation)

Dimensionnementcroissance du nombre de clients

« duplication des serveurs », « gestion de caches »gigantesque quantité de donnéesGrain des informations : plans de vol journalier ou pistes radar àla seconde ?

Tolérance aux fautessite en panne ou inaccessible« redondance des serveurs »« fonctionnement en mode dégradé »

Mireille Blay-Fornarino

EPU SI4 - 2008 8

Bus logiciel ?

Principes de base de l’architecture des intergicielsVia RMI et CORBA …

EPU SI4 - 2008 9

1. Au début était la socket

Service 1 : Hello worldUne méthode hello avec un paramètre de type chaîne et retourne une chaîne : ”hello, ” + paramètre

Raphael.Marvie@lifl.frD’après et Sacha KrakowiakEt (cf. références en bas des pages)

EPU SI4 - 2008 10

Principe

Deux programmes écrits en deux classes Java

Une pour le serveur Server.javaUne pour le client Client.java

Dans chaque classe est implémentéLe code fonctionnel : manipulation des chaînesLe code technique : construction / analyse des messages réseau

EPU SI4 - 2008 11

Architecture version « socket »

Client

Réseau

Serveur

EPU SI4 - 2008 12

Modélisation des Interactions

EPU SI4 - 2008 13

Côté serveur

Initialisation du réseauInstanciation d’une socket serveur

Gestion des requêtesAttente de connexion (accept)Initialisation des flux d’entrée et de sortieEvaluation 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

EPU SI4 - 2008 14

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

}

EPU SI4 - 2008 15

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

}}

EPU SI4 - 2008 16

Côté client

Initialisation du réseauInstanciation d’une socket de communication (connexion implicite)

Gestion de l’échange réseauInitialisation des flux d’entrée et de sortieDemande de service

Ecriture de la requête sur le flux de sortieLecture de la réponse sur le flux entréeAffichage de la chaîne retournée

Fermeture de la connexion

EPU SI4 - 2008 17

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

}

EPU SI4 - 2008 18

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

}

EPU SI4 - 2008 19

Bénéfices et limitations

BénéficesInvocation d’un service distant (hello world)Permet de réaliser des applications client / serveur

Parmi les limitationsUne seule connexion cliente à la foisUn seul service ciblé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

EPU SI4 - 2008 20

… et il y eut lesApplications à base d’objets répartis

Comparaison RMI et CORBAApplications RépartiesAM Dery & M. Blay-Fornarino

Merci à Rémi Vankeisbelck, Michel Riveill, Annick Fron, etc

EPU SI4 - 2008 21

Objectifs des objets répartis : RAPPELS1) « utiliser » un objet distant (OD), sans savoir où il se

trouve:ObjetDistant = ServiceDeNoms.recherche("monObjet");

2) invoquer des méthodes comme en local :objetDistant.nomMethode(Parametres);

3) « passer » un OD en paramètre d’appel à une méthoderesultat = objetLocal.nomMethode(objetDistant);resultat = objetDistant.nomMethode(autreObjetDistant);

4) récupérer le « résultat » d’un appel distant sous forme d’un nouvel objet qui aurait été créé sur la machine distante :ObjetDistant1 = ObjetDistant2.methode() ;

EPU SI4 - 2008 22

Des technologies

RMI (Remote Method Invocation)Système d’objets distribués performant destiné au développement

d’applications distribuées entièrement en Java

CORBA (Common Object Request Broker Architecture)Plate-forme client/serveur orientée objets qui permet de faire communiquer des applications écrites dans des langages différents (C++, Lisp, Smalltalk, Python…) et sur des plateformes (Interopérabilité Langage et Plateformes)

EPU SI4 - 2008 23

2. Bus mono-langage : RMIRemote Method Invocation

Oui oui… vous savez déjà.Mais un petit rappel… !

Remote/serialisable

EPU SI4 - 2008 24

Principe

Deux programmes écrits en deux classes Java

Une pour le serveur Server.javaUne pour le client Client.javaMais cette fois-ci :

Des objets « Hello »Un contrat

EPU SI4 - 2008 25

Architecture version « RMI »

Squelette

ServiceServant

Stub

Réseau

Client

Contrat/Interface

ServiceServant

Squelette

NommageServant

SqueletteRMISystem

http://java.sun.com/j2se/1.5.0/docs/guide/rmi/relnotes.html

Stub=Proxy/TalonSquelette = Proxy/Talon Serveur

EPU SI4 - 2008 26

Architecture RMI

Java Remote Method Protocol (JRMP)

Client

Stub

Remote reference layer

Serveur

Skeleton

Remote reference layer

TCP/IP, Unicast

Pinna -2007

EPU SI4 - 2008 27

Contrat : Interface Java

import java.rmi.Remote;

public interface HelloService extends Remote {

public String hello (String msg) throws Exception ;

public HelloService getClone(String InitialMessage) throws Exception ;

}

MBF -2007

EPU SI4 - 2008 28

Côté Serveur : Implémentations : Objets Remote

public class HelloServiceRemote extends UnicastRemoteObjectimplements HelloService {

int counter = 0;String initialMessage = "";

…private HelloServiceRemote(int count, String message) throws RemoteException

initialMessage = message;counter = count;

}

public String hello(String msg) throws Exception {counter++;return initialMessage + "Hello " + msg + " : tu es le " + counter;

}public HelloService getClone(String initialMessage) throws Exception {

return new HelloServiceRemote(this.counter,initialMessage);}

MBF -2007

EPU SI4 - 2008 29

Côté Serveur : Implémentations : Objets Sérialisable

import java.io.Serializable;public class HelloServiceSerializable

implements HelloService, Serializable {int counter = 0;private String initialMessage = "";private HelloServiceSerializable(int count, String message) throws RemoteException {

…}protected HelloServiceSerializable() throws RemoteException {

…}

public String hello(String msg) throws Exception {…

}

public HelloService getClone(String initialMessage) throws Exception {…

}}

MBF -2007

EPU SI4 - 2008 30

Code du serveur

public class HelloServer {

public static void main(String[] args) throws RemoteException, MalformedURLException {

HelloService serializedObject = new HelloServiceSerializable();HelloService remoteObject = new HelloServiceRemote();Naming.rebind("aSerializedHello", serializedObject);Naming.rebind("aremoteHello", remoteObject);

System.out.println("Hellos bound in registry");}

} Démarrage du serveurOn lance le rmiregistryOn lance le serveur

EPU SI4 - 2008 31

Côté client

public class HelloClient {public static void main(String[] args) {

HelloService objLocal = null; HelloService objRemote = null;

try {objLocal = (HelloService)

Naming.lookup("aSerializedHello");

System.out.println(objLocal.hello("Premier ")); System.out.println(objLocal.hello("deuxieme "));objLocal = (HelloService)

Naming.lookup("aSerializedHello"); System.out.println(objLocal.hello("troisieme "));

MBF -2007

EPU SI4 - 2008 32

Côté client

public class HelloClient {public static void main(String[] args) {

HelloService objLocal = null; HelloService objRemote = null;

try {objRemote = (HelloService)

Naming.lookup("aremoteHello");System.out.println(objRemote.hello("Premier "));System.out.println(objRemote.hello("deuxieme "));objRemote = (HelloService)

Naming.lookup("aremoteHello"); System.out.println(objRemote.hello("troisieme "));

EPU SI4 - 2008 33

Côté client

Suite du précédent

HelloService copieObjRemote = objRemote.getClone("Remote copy : ");

System.out.println(copieObjRemote.hello("Premiere copie"));

System.out.println(objRemote.hello("l'original"));

}

MBF -2007

EPU SI4 - 2008 34

Bénéfices et limitations

BénéficesInvocation de plusieurs services distants Quasiment pas de code technique Création à distance des objets accessibles

LimitationsUn seul langagePas de persistance des référencesGestion des Pool d’objetsPas d’Assemblage dynamique

EPU SI4 - 2008 35

3. "Bus" multi-langages : CORBACommon Object Request Broker Architecture

Juste un premier exemple…Introduction à CORBA par comparaison

EPU SI4 - 2008 36

I.5. OMAORBSpécificité Corba => ORB

la localisation d’objetla désignation des objetsl’empaquetage des paramètres (marshalling)le dépaquetage des paramètres (unmarshalling)l’invocation des méthodes

De plus, il fournit des caractéristiques telles que :la gestion des exceptionsl ’activation automatique et transparente des objetsla liaison avec « tous » les langages de programmationun système auto-descriptifl ’interopérabilité entre les bus

EPU SI4 - 2008 37

Architecture version « CORBA»

Squelette

ServiceServant

Stub

orb

NommageServant

Client

Contrat/Interface IDL

ServiceServant

Squelette SqueletteCORBASystem

http://java.sun.com/j2se/1.5.0/docs/guide/rmi/relnotes.html

Stub=Proxy/TalonSquelette = Proxy/Talon Serveur

POA

Réseau

EPU SI4 - 2008 38

CORBA par comparaison

GIOP/IIOP

Client

Stub

Object request broker

Serveur

Skeleton

Object request broker

TCP/IP, UnicastInterface IDL

EPU SI4 - 2008 39

Points communs et interopérabilité

Utilisent les socketsDes Protocoles

Un propriétaire : JRMP (Remote Method Protocol)Un protocole normalisé par l’OMG: GIOP/IIOP

Il existe des implémentations RMI basées sur le protocole RMI-IIOP

EPU SI4 - 2008 40

Modèle de référence OMAC

OR

BA

Bus d’objets répartis (O.R.B.)

Licences

Transactions PersistancePropriétés ChangementsEvents

Nommage Vendeur Sécurité Relations Collections Temps Externalisation

InterrogationsCyclede vie Concurrence

Services objet communs (CORBA Services)

Workflow

DataWare IHM

Administration

Utilitaires communs

Finance

Télécom

Santé

Interfacesde domaine

Objetsapplicatifs

Spécifiques

EPU SI4 - 2008 41

Rappel processus RMI

InterfaceHelloWorld

Interface HelloWorld

Classe d’implémentationHelloWorldImpl

Utilisation du registry

Code du client

Code du serveur

EPU SI4 - 2008 42

Étapes de mise en œuvre Corba

Spécification interface IDL

Compilation interface IDL

Implantation des objets Corba

Implantation du serveur

Enregistrement du serveur

Implantation du client

Côté clientCôté serveur

Utilisation du service Nommage

EPU SI4 - 2008 43

Contrat : IDL CORBA

interface HelloService{

string hello (in string msg);HelloService getClone(in string InitialMessage);

};

EPU SI4 - 2008 44

Corba : Interface décrite avec IDLDes projections multi-langages

ContratIDL

Bus CORBA SqueletteIDL

StubIDL

Fournisseurd ’objets

Clientd’objets

Objets Corba

EPU SI4 - 2008 45

Compilation interface IDL vers Java

HelloService.java

_HelloServiceStub.java HelloServicePOA.java

HelloService_Impl.javaClient.java

Serveur.java

Hello.idl

HelloServiceHelper.java

HelloServiceHolder.java

HelloServiceOperations.java

jidl

GénéréÀ implémenter

ServeurClient

Utile seulement si utilisation des modes in/inoutdans l’idl

EPU SI4 - 2008 46

Côté Serveur : Implémentationpublic class HelloServiceImpl extends HelloServicePOA{ private org.omg.CORBA.ORB orb_;

int counter = 0;String initialMessage = "";

public HelloServiceImpl(org.omg.CORBA.ORB orb) {orb_=orb;

}public HelloServiceImpl(org.omg.CORBA.ORB orb, int count, String message) {

this(orb); initialMessage = message; counter = count;}

public String hello(String msg) {counter++; return initialMessage + "Hello " + msg + " : tu es le " +

counter;}

public HelloService getClone(String InitialMessage){ return (new

HelloServiceImpl(orb_,this.counter,initialMessage))._this(orb_);

}}

EPU SI4 - 2008 47

Code serveur

public class Server{

static int run(org.omg.CORBA.ORB orb, String[] args) throws org.omg.CORBA.UserException{ org.omg.PortableServer.POA rootPOA =

org.omg.PortableServer.POAHelper.narrow(orb.resolve_initial_references("RootPOA"));

org.omg.PortableServer.POAManager manager = rootPOA.the_POAManager();

HelloServiceImpl helloRemoteImp = new HelloServiceImpl(orb);HelloService helloRemote = helloRemoteImp._this(orb);

try {String ref = orb.object_to_string(helloRemote);String refFile = "helloRemote.ref";FileOutputStream file = new FileOutputStream(refFile);PrintWriter out = new PrintWriter(file);out.println(ref);out.flush();file.close();

EPU SI4 - 2008 48

Côté client

public class Client { static int run(org.omg.CORBA.ORB orb, String[] args) throwsorg.omg.CORBA.UserException

{ String ref = null;try {String refFile = "helloRemote.ref";FileInputStream file = new FileInputStream(refFile);BufferedReader in = new BufferedReader(new InputStreamReader(file));ref = in.readLine();file.close();org.omg.CORBA.Object obj = orb.string_to_object(ref);…HelloService hello = HelloServiceHelper.narrow(obj);

System.out.println(hello.hello("premier"));System.out.println(hello.hello("deuxieme"));HelloService helloBis = hello.getClone("copie ");System.out.println(helloBis.hello("copie 1"));return 0;

}

EPU SI4 - 2008 49

Compilation interface IDL vers C++

Hello.idl

Compilateur idl

Client Hello_Impl

Compilateur C++ Compilateur C++

FichiersSouche

FichiersSquelette

Client(.exe)

Serveur(.exe)

Server

EPU SI4 - 2008 50

Côté Serveur : Implémentation(1)

char* Hello_impl::hello(const char* msg)throw(::CORBA::SystemException)

{CORBA::String_var message = ::CORBA::string_dup("Hello");message += msg;count++;message += count;return message._retn ();

}

EPU SI4 - 2008 51

Côté Serveur : Implémentation(2)

::Hello_ptr Hello_impl::getClone(const char* InitialMessage)throw(::CORBA::SystemException){

Hello_impl* helloImpl = new Hello_impl(orb_, poa_);helloImpl->count = this->count;…Hello_var hello = helloImpl -> _this();return hello._retn();

…}

EPU SI4 - 2008 52

Le programme Server#include <OB/CORBA.h>

#include <Hello_impl.h>

#include <fstream>

using namespace std;

int run(CORBA::ORB_ptr);

int main(int argc, char* argv[])

{ int status = EXIT_SUCCESS;

CORBA::ORB_var orb;

try{orb = CORBA::ORB_init(argc, argv);status = run(orb, argc, argv);

}

EPU SI4 - 2008 53

Le programme Server…PortableServer::POA_var rootPOA = PortableServer::POA::_narrow( CORBA::Object_var(orb ->

resolve_initial_references("RootPOA")));…Hello_impl* helloImpl = new Hello_impl(orb, rootPOA); Hello_var hello = helloImpl -> _this();

CORBA::String_var s = orb -> object_to_string(hello);const char* refFile = "Hello.ref";FILE* f = fopen(refFile, "w");fputs(s.in(), f);fclose(f);

…….

EPU SI4 - 2008 54

Le programme Client#include <OB/CORBA.h>#include <Hello.h>#include <fstream>using namespace std;int run(CORBA::ORB_ptr);int main(int argc, char* argv[]){ int status = EXIT_SUCCESS;

CORBA::ORB_var orb;try{ orb = CORBA::ORB_init(argc, argv);

status = run(orb);}

EPU SI4 - 2008 55

Le programme Client (suite)run(CORBA::ORB_ptr orb, int /* argc */, char* argv[]){CORBA::Object_var obj = orb ->

string_to_object("relfile:/Hello.ref");Hello_var hello = Hello::_narrow(obj);CORBA::String_var reply = CORBA::string_dup("");reply = hello -> say_hello("Premier");std::cout << reply << std::endl;Hello_var helloCopy=hello -> getClone("copie");reply = helloCopy -> say_hello("copie");std::cout << reply << std::endl;

}

EPU SI4 - 2008 56

Bus logiciel : …. Communications …

MOM (Message Oriented Middleware) ou RPC (Remote Procedure Call)

EPU SI4 - 2008 57

Echanges de messages

JMS

Principe :Production de messagesConsommation des messagesTous clients du « bus »!

EPU SI4 - 2008 58

Appel de procédure à distance

RMI,CORBA,.NET remoting, SOAP, …

Principe :Invocation d’un service (contexte d’appel)Attente bloquante* des résultats

EPU SI4 - 2008 59

Bus logiciel en résumé

Un bus logiciel repose essentiellement sur deux conceptsLa désignation d’un service (les références)La liaison avec un service distant (établir une connexion)

Un intergiciel (middleware) est un « programme » qui permet de faire communiquer des machines entre-elles, indépendamment de la nature du processeur, du SE, voire du langage.

EPU SI4 - 2008 60

Classes d’intergiciels

Objets répartisJava RMI, CORBA, DCOM, .NET

Composants répartisJava Beans, Enterprise Java Beans, CCM

Message-Oriented Middleware (MOM)Message Queues, Publish-Subscribe

Intégration d’applicationsWeb Services

CoordinationAccès aux données, persistanceSupport d’applications mobiles

EPU SI4 - 2008 61

Architecture générale d’un bus logiciel

EPU SI4 - 2008 62

Définitions d’interfaces

Partie “opérationnelle”Interface Definition Language (IDL)Pas de standard indépendant

IDL CORBAJava et C# définissent leur propre IDLWSDL…

Partie “contractuelle”Plusieurs niveaux de contrats

Sur la forme : spécification de types -> conformitésyntaxiqueSur le comportement (1 méthode) : assertions -> conformitésémantiqueSur les interactions entre méthodes : synchronisationSur les aspects non fonctionnels (performances, etc.) : contrats de QoS

C 2003 - Sacha Krakowiak

EPU SI4 - 2008 63

L ’amorce client (stub)

Représentant local de l ’OD qui implémente ses méthodes « exportées »Transmet l ’invocation distante à la couche inférieure Remote Reference Layer / ORBIl réalise le pliage (« marshalling ») des arguments des méthodes distantesDans l ’autre sens, il réalise le dépliage (« demarshalling ») des valeurs de retour

EPU SI4 - 2008 64

L ’amorce serveur (Skeleton)

Réalise le dépliage des arguments reçus par le flux de pliageFait un appel à la méthode de l ’objet distantRéalise le pliage de la valeur de retour

EPU SI4 - 2008 65

La couche des références distantes

Permet l ’obtention d ’une référence d ’objet distant à partir de la référence locale au Stub : un service d’annuaire

Rmiregistry en RMIService de nommage Naming en CorbaJNDI Interface d’annuaire

EPU SI4 - 2008 66

La couche de transport

Connecte les 2 espaces d ’adressage (JVM pour Java)Suit les connexions en coursEcoute et répond aux invocationsConstruit une table des OD disponiblesRéalise l ’aiguillage des invocationsSécurité ?

EPU SI4 - 2008 67

Diagramme d ’interaction

Stub Skeleton Implementation

invoke

Marshal paramSend req.

Unmarshal paramInvoke impl.

Return resultReturn return or exc.Marshal return or exc.Send replyUnmarshal reply

Return value or exc

EPU SI4 - 2008 68

Bibliographie

École d’été sur les Intergiciels et sur la Construction d’Applications Réparties : Patrons et Canevas pour l’IntergicielSacha Krakowiak, ICAR 2003

Dis papa, c’est quoi un bus logiciel réparti ?Raphael.Marvie@lifl.frLIFL – IRCICAEquipe GOALDécembre 2003

EPU SI4 - 2008 69

Quelques livres...

Core Java Volume 2Par Cay S. Horstmann & Gary CornellEditions CampusPressUne référence pour les développeurs JavaBonne section sur RMI, servi de base pour ce cours

Java Distributed ComputingPar Jim FarleyEditions O'ReillyTout sur les applications reparties avec JavaPlus technique...

Architectures réparties en JavaPar Annick Fron (2007)Edition DunodRMI, CORBA, JMS, Sockets, SOAP, services web

Recommended