EPU SI4 - 2008 1 Mireille Blay-Fornarino [email protected] blay/ENSEIGNEMENT/AppRep/ pinna/Sar/AppRep
-
Upload
asce-caillet -
Category
Documents
-
view
110 -
download
3
Transcript of EPU SI4 - 2008 1 Mireille Blay-Fornarino [email protected] blay/ENSEIGNEMENT/AppRep/ pinna/Sar/AppRep
EPU SI4 - 2008 1
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
Introduction : Applications réparties par objets
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 Intergiciel Principes directeurs, organisation, usage Fonctionnement interne (“ au coeur de …”)
EPU SI4 - 2008 3
Entreprise virtuelle : illustration
cu
tdivKgradu F ( )0
20
40
60
80
100
EstOuestNord
Est 20,4 27,4 90 20,4
Ouest 30,6 38,6 34,6 31,6
Nord 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 ?
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éseau
7. 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
Hétérogénéité Hardware Langages Ressources Contexte d’usage
Désignation/localisation Migration Mobilité Ubiquité Evolution
Mireille Blay-Fornarino
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
EPU SI4 - 2008 7
Propriétés à prendre en compte
Sécurité authentification (certificats) sécurisation des communications (cryptage) contrôle d’accès (autorisation)
Dimensionnement 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 8
Bus logiciel ?
Principes de base de l’architecture des intergiciels
Via 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
D’après [email protected] 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.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 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é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
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é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 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é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 20
… et il y eut lesApplications à base d’objets répartis
Comparaison RMI et CORBA Applications 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.java Une pour le client Client.java Mais cette fois-ci :
Des objets « Hello »Un contrat
EPU SI4 - 2008 25
Squelette
ServiceServant
Architecture version « RMI »
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
Client
Stub
Remote reference layer
Serveur
Skeleton
Remote reference layer
TCP/IP, Unicast
Java Remote Method Protocol (JRMP)
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 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 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 serveur
On 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é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 35
3. "Bus" multi-langages : CORBACommon Object Request Broker Architecture
Juste un premier exemple…Introduction à CORBA par comparaison
EPU SI4 - 2008 36
Spécificité Corba => 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
I.5. OMAORB
EPU SI4 - 2008 37
Squelette
ServiceServant
Architecture version « CORBA»
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
Client
Stub
Object request broker
Serveur
Skeleton
Object request broker
TCP/IP, Unicast
GIOP/IIOP
Interface IDL
EPU SI4 - 2008 39
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 40
CO
RB
AModèle de référence OMA
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é client
Côté serveurUtilisation 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
Contrat IDL
Bus CORBA SqueletteIDL
StubIDL
Fournisseurd ’objets
Clientd’objets
Corba : Interface décrite avec IDLDes projections multi-langages
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À implémenter
Généré
ServeurClient
Utile seulement si utilisation des modes in/inout dans l’idl
EPU SI4 - 2008 46
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 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) 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 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 messages Consommation des messages Tous 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 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 60
Classes d’intergiciels
Objets répartis Java RMI, CORBA, DCOM, .NET
Composants répartis Java Beans, Enterprise Java Beans, CCM
Message-Oriented Middleware (MOM) Message Queues, Publish-Subscribe
Intégration d’applications Web Services
Coordination Accès aux données, persistance Support 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 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
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 / 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 64
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 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 RMI Service de nommage Naming en Corba JNDI Interface d’annuaire
EPU SI4 - 2008 66
La couche de transport
Connecte 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é ?
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 reply
Unmarshal replyReturn 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 [email protected] – IRCICAEquipe GOALDécembre 2003
EPU SI4 - 2008 69
Quelques livres...
Core Java Volume 2 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
Java Distributed Computing 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