Introduction : Applications
réparties par objets
Mireille Blay-Fornarino
 [email protected]
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
1
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 Intergiciel


Principes directeurs, organisation, usage
Fonctionnement interne (“ au coeur de …”)
EPU SI4 - 2008
2
Entreprise virtuelle : illustration
100
80
u
( (u))+ F
rcr = divKgrad
t
Est
Ouest
Nord
60
40
20
0
Est
Ouest
Nord
1er
2e trim. 3e trim. 4e trim.
trim.
20,4
30,6
45,9
27,4
38,6
46,9
90
34,6
45
20,4
31,6
43,9
Assemblage de ressources de
Stockage, Calculs, réseaux
=> B2B
EPU SI4 - 2008
Mireille Blay-Fornarino
3
Pourquoi utiliser des applications
réparties ?
EPU SI4 - 2008
4
Les 8 erreurs conceptuelles
1.
2.
3.
4.
5.
6.
7.
8.
Le réseau est fiable.
La latence est nulle.
La bande passante du réseau est infinie.
Le réseau est sécurisé.
La topologie de l’application est « éternelle »
Il y a un seul administrateur du réseau
Le coût du transport est nul.
Le réseau est homogène.
EPU SI4 - 2008
Annick Fron
5
Propriétés à prendre en compte
 Hétérogénéité





Hardware
Langages
Ressources
Contexte d’usage
Désignation/localisation





Migration
Mobilité
Ubiquité
Evolution
Distribution
Equilibrage
de charge
Parallélisation
Décentralisation
Couplage

Prise de décision
Contrôle
de l’accès concurrent
Serveurs parallèles
Données réparties synchronisation
de l'accès aux ressources, Gestion
des transactions
Mireille Blay-Fornarino
EPU SI4 - 2008
6
Propriétés à prendre en compte

Sécurité




Dimensionnement




authentification (certificats)
sécurisation des communications (cryptage)
contrôle d’accès (autorisation)
croissance du nombre de clients
 « duplication des serveurs », « gestion de caches »
gigantesque quantité de données
Grain des informations : plans de vol journalier ou pistes radar à
la seconde ?
Tolérance aux fautes



site en panne ou inaccessible
« redondance des serveurs »
« fonctionnement en mode dégradé »
Mireille Blay-Fornarino
EPU SI4 - 2008
7
Bus logiciel ?
Principes de base de
l’architecture des intergiciels
Via RMI et CORBA …
EPU SI4 - 2008
8
1. Au début était la socket
Service 1 : Hello world
Une méthode hello avec un paramètre
de type chaîne et retourne une chaîne :
”hello, ” + paramètre
D’après [email protected] et Sacha Krakowiak
Et (cf. références en bas des pages)
EPU SI4 - 2008
9
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
EPU SI4 - 2008
10
Architecture version « socket »
Client
Serveur
Réseau
EPU SI4 - 2008
11
Modélisation des Interactions
EPU SI4 - 2008
12
Côté serveur
 Initialisation
du réseau
 Instanciation
 Gestion
d’une socket serveur
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ée
 Création de la chaîne à retourner
 Ecriture de la réponse sur le flux de sortie

EPU SI4 - 2008
13
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
14
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" ; // fonctionnel
out.writeBytes (res) ;
}
}
EPU SI4 - 2008
15
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
EPU SI4 - 2008
16
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
17
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
18
Bénéfices et limitations

Bénéfices



Invocation d’un service distant (hello world)
Permet de réaliser des applications client / serveur
Parmi les limitations




Une seule connexion cliente à la fois
Un 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
19
… et il y eut les
Applications à base d’objets répartis
Comparaison RMI et CORBA
Applications Réparties
AM Dery & M. Blay-Fornarino
Merci à Rémi Vankeisbelck, Michel Riveill, Annick Fron, etc
EPU SI4 - 2008
20
Objectifs des objets répartis :
RAPPELS
1) « 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éthode
resultat = 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
21
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
22
2. Bus mono-langage : RMI
Remote Method Invocation
Oui oui… vous savez déjà.
Mais un petit rappel… !
Remote/serialisable
EPU SI4 - 2008
23
Principe
 Deux
programmes écrits en deux
classes Java
 Une
pour le serveur Server.java
 Une pour le client Client.java
 Mais cette fois-ci :
Des objets « Hello »
 Un contrat

EPU SI4 - 2008
24
Architecture version « RMI »
Stub=Proxy/Talon
Squelette = Proxy/Talon
RMI
System
Contrat/
Interface
Serveur
Client
Nommage
Servant
Service
Service
Servant
Servant
Stub
Squelette
Squelette
Squelette
Réseau
http://java.sun.com/j2se/1.5.0/docs/guide/rmi/relnotes.html
25
EPU SI4 - 2008
Architecture RMI
Java Remote Method Protocol (JRMP)
Client
Serveur
Stub
Skeleton
Remote reference layer
Remote reference layer
TCP/IP, Unicast
Pinna -2007
EPU SI4 - 2008
26
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
27
Côté Serveur :
Implémentations : Objets Remote
public class HelloServiceRemote extends UnicastRemoteObject
implements 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
28
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
29
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 serveur
On lance le rmiregistry
On lance le serveur
30
EPU SI4 - 2008
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
31
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
32
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"));
}
EPU SI4 - 2008
MBF -2007
33
Bénéfices et limitations
 Bénéfices
 Invocation
de plusieurs services distants
 Quasiment pas de code technique
 Création à distance des objets accessibles
 Limitations
 Un
seul langage
 Pas de persistance des références
 Gestion des Pool d’objets
 Pas d’Assemblage dynamique
EPU SI4 - 2008
34
3. "Bus" multi-langages : CORBA
Common Object Request Broker Architecture
Juste un premier exemple…
Introduction à CORBA par comparaison
EPU SI4 - 2008
35
Spécificité Corba => ORB





I.5. OMA
ORB
la localisation d’objet
la désignation des objets
l’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 exceptions
 l ’activation automatique et transparente des objets
 la liaison avec « tous » les langages de programmation
 un système auto-descriptif
 l ’interopérabilité entre les bus
EPU SI4 - 2008
36
Architecture version « CORBA»
Stub=Proxy/Talon
Squelette = Proxy/Talon
CORBA
System
Contrat/
Interface IDL
Serveur
Client
Nommage
Servant
Service
Service
Servant
Servant
Stub
Squelette
Squelette
Squelette
POA
orb
Réseau
http://java.sun.com/j2se/1.5.0/docs/guide/rmi/relnotes.html
37
EPU SI4 - 2008
CORBA par comparaison
GIOP/IIOP
Client
Serveur
Stub
Skeleton
Object request broker
Object request broker
Interface IDL
TCP/IP, Unicast
EPU SI4 - 2008
38
Points communs et interopérabilité

Utilisent les sockets
 Des 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
39
Modèle de référence OMA
Objets
applicatifs
Interfaces
de domaine
Utilitaires communs
Workflow Administration
Télécom
Spécifiques
Santé
Finance
DataWare
IHM
Bus d’objets répartis (O.R.B.)
Nommage
Vendeur
Interrogations
Sécurité
Relations Collections Temps
Cycle
de vie Transactions Propriétés Persistance
Licences Externalisation
Events ChangementsConcurrence
Services objet communs (CORBA Services)
EPU SI4 - 2008
40
Rappel processus RMI
Interface
HelloWorld
Interface
HelloWorld
Code du client
Classe
d’implémentation
HelloWorldImpl
Code du serveur
Utilisation du registry
EPU SI4 - 2008
41
Étapes de mise en œuvre Corba
Spécification interface IDL
Compilation interface IDL
Implantation des objets Corba
Implantation du client
Implantation du serveur
Enregistrement du serveur
Côté client
Utilisation du service Nommage
EPU SI4 - 2008
Côté serveur
42
Contrat : IDL CORBA
interface HelloService
{
string hello (in string msg);
HelloService getClone(in string InitialMessage);
};
EPU SI4 - 2008
43
Corba : Interface décrite avec IDL
Des projections multi-langages
Client
d’objets
Stub
IDL
Contrat
IDL
Bus CORBA
Fournisseur
d ’objets
Squelette
IDL
Objets Corba
EPU SI4 - 2008
44
Compilation interface IDL vers Java
Hello.idl
Généré
À implémenter
jidl
Client
_HelloServiceStub.java
Client.java
Serveur
HelloServiceOperations.java
HelloServicePOA.java
HelloService.java
HelloService_Impl.java
HelloServiceHelper.java
Serveur.java
HelloServiceHolder.java
Utile seulement si
utilisation des
modes in/inout
dans l’idl
45
EPU SI4 - 2008
Côté Serveur : Implémentation
public 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
46
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
47
Côté client
public class Client {
static int run(org.omg.CORBA.ORB orb, String[] args)
throws
org.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
48
Compilation interface IDL vers C++
Hello.idl
Compilateur idl
Client
Fichiers
Souche
Fichiers
Squelette
Hello_Impl
Compilateur C++
Compilateur C++
Client
(.exe)
Serveur
(.exe)
EPU SI4 - 2008
Server
49
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
50
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
51
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
52
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
53
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
54
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
55
Bus logiciel : ….
Communications …
MOM (Message Oriented Middleware)
ou
RPC (Remote Procedure Call)
EPU SI4 - 2008
56
Echanges de messages
 JMS
 Principe
:
 Production
de messages
 Consommation des messages
 Tous clients du « bus »!
EPU SI4 - 2008
57
Appel de procédure à distance
 RMI,CORBA,.NET
 Principe
remoting, SOAP, …
:
 Invocation
d’un service (contexte d’appel)
 Attente bloquante* des résultats
EPU SI4 - 2008
58
Bus logiciel en résumé
Un bus logiciel repose essentiellement sur deux concepts
La 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
59
Classes d’intergiciels

Objets répartis


Composants répartis


Java Beans, Enterprise Java Beans, CCM
Message-Oriented Middleware (MOM)


Java RMI, CORBA, DCOM, .NET
Message Queues, Publish-Subscribe
Intégration d’applications

Web Services

Coordination
 Accès aux données, persistance
 Support d’applications mobiles
EPU SI4 - 2008
60
Architecture générale d’un bus
logiciel
EPU SI4 - 2008
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
EPU SI4 - 2008
62
C 2003 - Sacha Krakowiak
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 / ORB
 Il réalise le pliage (« marshalling ») des
arguments des méthodes distantes
 Dans l ’autre sens, il réalise le dépliage
(« demarshalling ») des valeurs de retour

EPU SI4 - 2008
63
L ’amorce serveur (Skeleton)
 Réalise
le dépliage des arguments reçus
par le flux de pliage
 Fait un appel à la méthode de l ’objet
distant
 Réalise le pliage de la valeur de retour
EPU SI4 - 2008
64
La couche des références distantes
l ’obtention d ’une référence
d ’objet distant à partir de la référence
locale au Stub : un service d’annuaire
 Permet
 Rmiregistry
en RMI
 Service de nommage Naming en Corba
 JNDI Interface d’annuaire
EPU SI4 - 2008
65
La couche de transport
les 2 espaces d ’adressage
(JVM pour Java)
 Suit les connexions en cours
 Ecoute et répond aux invocations
 Construit une table des OD disponibles
 Réalise l ’aiguillage des invocations
 Sécurité ?
 Connecte
EPU SI4 - 2008
66
Diagramme d ’interaction
Stub
Skeleton
Implementation
invoke
Marshal param
Send req.
Unmarshal param
Invoke impl.
Return result
Unmarshal reply
Return value or exc
Return return or exc.
Marshal return or exc.
Send reply
EPU SI4 - 2008
67
Bibliographie

École d’été sur les Intergiciels et sur la
Construction d’Applications Réparties :
Patrons et Canevas pour l’Intergiciel
Sacha Krakowiak, ICAR 2003

Dis papa, c’est quoi un bus logiciel réparti ?
[email protected]
LIFL – IRCICA
Equipe GOAL
Décembre 2003
EPU SI4 - 2008
68
Quelques livres...

Core Java Volume 2





Java Distributed Computing





Par Cay S. Horstmann & Gary Cornell
Editions CampusPress
Une référence pour les développeurs Java
Bonne section sur RMI, servi de base pour ce cours
Par Jim Farley
Editions O'Reilly
Tout sur les applications reparties avec Java
Plus technique...
Architectures réparties en Java



Par Annick Fron (2007)
Edition Dunod
RMI, CORBA, JMS, Sockets, SOAP, services web
EPU SI4 - 2008
69
Descargar

Bus logiciel