Verteilte Systeme Interprozesskommunikation Teil 2 1 Interprozesskommunikation Applikationen, Dienste Dieser Teil der Vorlesung RemoteMethodInvocation und RemoteProcedureCall Anforderung/Antwort-Protokoll (request-reply protocol) Middlewareschichten Marshalling und externe Datendarstellung UniversalDatagramProtocol und TransmissionControlProtocol 2 Übersetzung R emote entfernt, rechnerfern, entlegen P rocedure besser wäre: extern Prozedur, Funktion, Verfahren C all Aufruf, Anruf, Ruf Entfernter Entfernter Prozeduraufruf Prozeduraufruf R emote M ethod Methode, Prozedur, Operation, Verfahren I nvocation Anrufung, Beschwörung, Anfrage, Aufruf Entfernter Entfernter Methodenaufruf Methodenaufruf 3 Verteiltes Objektsystem Lokal Lokal Entfernt Entfernt vv ee rr ss uu ss Rechner Prozess Objekt Interaktion 4 Das Objektmodell System: Sammlung miteinander interagierender Objekte, von denen jedes aus einer Menge von Daten und einer Menge von Methoden besteht Wichtige Begriffe (Auswahl, vereinfacht): – Objektreferenz: die „Adresse“/eindeutige Identität eines Objekt – Schnittstellen: Definition der Zugangspunkte eines Objekts; definiert durch die Signatur der Methoden – Ereignisse/Aktionen: initiiert durch ein Objekt, das eine Methode eines anderen Objekts aufruft; resultiert in der Zustandsänderung von Objekten oder/und weiteren Ereignissen/Aktionen – Exceptions/Ausnahmen: eine Möglichkeit, Fehler in einem Programm auf saubere Art und Weise zu behandeln – Garbage Collection: Freigabe nicht mehr benutzten Speichers 5 Das verteilte Objektmodell Verteiltes System: Interagierende Objekte sind auf mehr als einen Prozess verteilt Wichtige Begriffe (Auswahl, vereinfacht): – Entfernte Objektreferenz: die „Adresse“/eindeutige Identität eines Objekts im ganzen verteilten System – Entfernte Schnittstellen: die Schnittstelle eines entfernten Objekts (interface definition language, IDL) – Ereignisse/Aktionen: Ereignisse/Aktionen von Objekten können Prozessgrenzen überschreiten – Exceptions/Ausnahmen: verteilte Ausführung des Systems erweitert das Spektrum möglicher Fehler – Garbage Collection: Freigabe nicht mehr benutzten Speichers wird im verteilten System schwieriger 6 Entfernte und lokale Methodenaufrufe entfernter Aufruf lokaler Aufruf lokaler Aufruf lokaler Aufruf entfernter Aufruf Jeder Prozess hat Objekte, einige, die entfernte Aufrufe erhalten können - entfernte Objekte genannt -, einige, die nur lokale Aufrufe erhalten können Objekte müssen die entfernte Objektreferenz eines Objektes in einem anderen Prozess kennen, um dessen Methoden aufrufen zu können. Wo bekommen sie diese Referenz her ? Die entfernte Schnittstelle spezifiziert, welche Methoden entfernt aufgerufen werden können 7 Entfernte Objektreferenz Über Raum und Zeit garantiert eindeutig! Bestehen aus – Internetadresse: gibt den Rechner an – Port-Nummer und Zeit: Identifizieren eindeutig den Prozess – Objektnummer: Identifiziert das Objekt – Schnittstelle: beschreibt die entfernte Schnittstelle des Objekts Werden erzeugt von einem speziellen Modul - dem entfernten Referenzmodul - wenn eine lokale Referenz als Argument an einen anderen Prozess übergeben wird und in dem korrespondierenden Proxy gespeichert. 32 bits 32 bits Internetadresse Port-Nummer 32 bits Zeit 32 bits Objektnummer Schnittstelle des entfernten Objektes Achtung: Diese Art der Refernz erlaubt kein Verschieben des Objektes in einen anderen Prozess! 8 Schnittstellen entfernter Objekte Die entfernte Schnittstelle gibt an, wie auf entfernte Objekte zugegriffen wird (Signatur der Methodenmenge). Ihre Beschreibung enthält – Den Namen der Schnittstelle – Möglicherweise Datentypdefinitionen – Die Signatur aller entfernt verfügbaren Methoden, bestehend aus W Dem Methodennamen W Ihrer Ein- und Ausgabeparameter W Ihrem Rückgabewert Jede Middleware besitzt eine eigene Sprache, um solche Schnittstellen zu beschreiben. 9 Schnittstellen entfernter Objekte: Beispiel Corba IDL struct Person { string name; CORBA hat Strukturen, string place; entfernte Schnittstelle Java hat Klassen long year; }; interface PersonList { Signatur: Definition readonly attribute string listname; der Methoden void addPerson(in Person p) ; void getPerson(in string name, out Person p); long number(); Parameter sind in, out oder inout }; entfernte Schnittstelle entfernter Aufruf m1 m2 m3 Daten Implementierung der Methoden lokaler m4 Aufruf m5 m6 10 Entwurfsprobleme Lokale Aufrufe werden genau einmal ausgeführt. Dies kann für entfernte Aufrufe nicht immer der Fall sein. Was sind die Alternativen ? Führt zur Definition einer Fehlersemantik Was ist der Transparenzgrad der entfernten Aufrufe ? Was ist gegeben, was muß der Programmierer selber sicherstellen ? 11 Aufrufsemantik Ein lokaler Aufruf wird genau einmal durchgeführt. Ein entfernter Aufruf erreicht diese Qualität zunächst nicht. Warum nicht ? Client 1) Verlust der Auftragsnachricht Server 1) 2) Verlust der Ergebnisnachricht 3) Ausfall des Servers 3) 4) 2) 4) Ausfall des Clients 12 Fehlersemantik at atleast leastonce onceSemantik Semantik Client Server at atmost mostonce onceSemantik Semantik Client Server Reply Bearbeitung des Requests Ergebnis Ergebniskann kann verschieden verschiedensein! sein! Timeout Request Reply Bearbeitung des Requests Timeout Timeout Request Request Request Timeout Timeout Request Timeout Liste Liste der der Requests Requests Request Reply Bearbeitung Bearbeitung des des Requests; Requests; Request Request eintragen eintragen Liste Liste der der Requests Requests überüberprüfen; prüfen; Verwerfen Verwerfen des des 2. 2. Reply Requests Requests Acknowledge- Request löschen Request löschen ment 13 Fehlersemantik Fehlersemantik Fehlerfreier Ablauf Nachrichtenverluste Ausfall des Servers Maybe Ausführung: 1 Ergebnis: 1 Ausführung: 0/1 Ergebnis: 0 Ausführung: 0/1 Ergebnis: 0 At-least-once Ausführung: 1 Ergebnis: 1 Ausführung: >= 1 Ergebnis: >= 1 Ausführung: >=1 Ergebnis: >=1 At-most-once Ausführung: 1 Ergebnis: 1 Ausführung: 1 Ergebnis: 1 Ausführung: 0/1 Ergebnis: 0 Exactly-once Ausführung: 1 Ergebnis: 1 Ausführung: 1 Ergebnis: 1 Ausführung: 1 Ergebnis: 1 14 Transparenz Zugriffstransparenz ermöglicht den Zugriff auf lokale und entfernte Ressourcen unter Verwendung identischer Operationen. Ist realisiert: die Operationen sind identisch, die Syntax evtl. unterschiedlich. Positionstransparenz (Ortstransparenz) erlaubt den Zugriff auf die Ressourcen, ohne dass man ihre Position/ihren Ort kennen muss. Ist realisiert. Nebenläufigkeitstransparenz erlaubt, dass mehrere Prozesse gleichzeitig mit denselben gemeinsam genutzten Ressourcen arbeiten, ohne sich gegenseitig zu stören. Ist nicht realisiert. Replikationstransparenz erlaubt, dass mehrere Instanzen von Ressourcen verwendet werden, um die Zuverlässigkeit und die Leistung zu verbessern, ohne dass die Benutzer oder Applikationsprogrammierer wissen, dass Repliken verwendet werden. Ist manchmal realisiert. 15 Transparenz Fehlertransparenz erlaubt das Verbergen von Fehlern, so dass Benutzer und Applikationsprogrammierer ihre Aufgaben erledigen können, auch wenn Hardware- oder Softwarekomponenten ausgefallen sind. Ist teilweise realisert (siehe Fehlersemantik) Mobilitätstransparenz erlaubt das Verschieben von Ressourcen und Clients innerhalb eines Systems, ohne dass die Arbeit von Benutzern oder Programmen dadurch beeinträchtigt wird. Mittels Namensdienst realisiert. Leistungstransparenz erlaubt, dass das System neu konfiguriert wird, um die Leistung zu verbessern, wenn die Last variiert. Ist nicht realisiert. Skalierungstransparenz erlaubt, dass sich System und Applikationen vergrößern, ohne dass die Systemstruktur oder die Applikationsalgorithmen geändert werden müssen. Ist durch die Objektorientiertheit bereits gegeben. 16 Implementierung Kommunikationsmodul: zuständig für das Request-/ReplyProtokoll Entferntes Referenzmodul: Übersetzt zwischen entfernten und lokalen Objektreferenzen; besitzt meist eine entfernte Objekt-Tabelle, in der diese Zuordnung eingetragen wird. Beim ersten Aufruf wird die entfernte Objektreferenz von diesem Modul erzeugt. 17 Rolle von Proxy und Skeleton Proxy: Proxy:macht machtRMI RMItransparent transparentfür fürClient. Client. Klasse implementiert entfernte Schnittstelle. Klasse implementiert entfernte Schnittstelle. Marshals MarshalsRequest Requestund undunmarshals unmarshalsReply. Reply. Leitet LeitetRequest Requestweiter. weiter. Ausführungdes des Ausführung Request/ReplyProtokolls Protokolls Request/Reply Client Entferntes Referenzmodul Übersetzungzwischen zwischen Übersetzung lokalenund undentfernten entfernten lokalen Objektreferenzen Objektreferenzen Request Reply Kommunikationsmodul Proxy B Kommunikationsmodul Objekt A Server Dispatcher: Dispatcher:wählt wählt Methode Methodeim imSkeleton Skeleton aus. aus. Dispatcher B Objekt B Skeleton B Entferntes Referenzmodul Skeleton: Skeleton:implementiert implementiertMethoden Methodender der entfernten entferntenSchnittstelle. Schnittstelle.Unmarshals Unmarshals Request Requestund undMarshals MarshalsReply. Reply.Ruft Ruft Methode Methodeininentferntem entferntemObjekt Objektauf. auf. 18 Verteilungstransparenz: Referenz- und Kopiersemantik Entfernte Methodenaufrufe sollten ParameterübergabeSemantik der verwendeten Programmiersprache respektieren: – In Java Übergabe von Werten per Kopie, Übergabe von Objekten per Referenz – In C++ freie Wahl der Übergabeart Probleme: – Entfernte Referenzen auf Werte prinzipiell nicht möglich – Entfernte Referenzen auf Objekte nur möglich, wenn entsprechende Stubs und Skeletons existieren – Empfänger benötigt Implementierungsklasse für erhaltenes Objekt (Kopiersemantik) bzw. Stub (Referenzsemantik) 19 Beispiel für Objektübergabe Betrachte folgende Objektklasse: import B; public interface A { extends Remote { public void setB(B b) throws Throwable; public B getB() throws Throwable;}} public class AServant extends UnicastRemoteObject implements A { private B b; public void setB(B b) { this.b = b; } public B getB() { return this.b; }} ASkeleton AServant B 20 Beispiel für Objektübergabe: Kopiersemantik 1. Clientobjekt hält Referenz auf Instanz von A, ruft darauf Methode getB() auf. 2. Stub übermittelt Methodenaufruf an Skeleton 3. Skeleton delegiert Methodenaufruf an Servant 4. Servant übergibt Referenz auf Instanz von B an Skeleton "getB" Klienten- AStub objekt ASkeleton AServant B Adressraum Adressraum 11 Adressraum Adressraum 22 21 Beispiel für Objektübergabe: Kopiersemantik 8. Stub übergibt Verweis auf neue Instanz an Aufrufer 7. Stub lädt Klasse B, dekodiert Zustand und erzeugt damit neue Instanz von B Klienten- AStub objekt 6. Kodierter Zustand wird an Stub übertragen codierter Zustand von B B Adressraum Adressraum 11 5. Skeleton kodiert Zustand von Instanz gemäß Wire Protocol ASkeleton AServant B B.jar B.jar Adressraum Adressraum 22 22 Beispiel für Objektübergabe: Referenzsemantik 1. Clientobjekt hält Referenz auf Instanz von A, ruft darauf Methode getB() auf. 2. Stub übermittelt Methodenaufruf an Skeleton 3. Skeleton delegiert Methodenaufruf an Servant 4. Servant übergibt Referenz auf Instanz von B an Skeleton "getB" Klienten- AStub objekt ASkeleton AServant B Adressraum Adressraum 11 Adressraum Adressraum 22 23 Beispiel für Objektübergabe: Referenzsemantik 8. A-Stub übergibt Verweis auf B-Stub an Aufrufer 7. A-Stub erzeugt neuen B-Stub, der Netzwerkadresse von B-Skeleton enthält 6. A-Skeleton sendet Netzwerkadresse von B-Skeleton an A-Stub 5. A-Skeleton erzeugt neues Skeleton für B, falls nicht bereits vorhanden (hostname, port) Klienten- AStub objekt ASkeleton AServant BStub Adressraum Adressraum 11 BSkeleton B B.jar B.jar Adressraum Adressraum 22 24 Weitere Aspekte der Objektübergabe Festlegung der Übergabesemantik i.A. durch Typ des formalen Parameters: – Referenzen und keine Referenzen sind zunächst alles Werte! Die Übergabesemantik regelt die Art der Interpretation. – Referenzübergabe, wenn formaler Parameter bestimmtes Interface (in Java z.B. java.rmi.Remote) implementiert – Wertübergabe sonst Bei Wertübergabe Komplikationen möglich: – Wenn übergebenes Objekt direkt oder indirekt andere Objekte referenziert, müssen diese ebenfalls übergeben werden (mit welcher Übergabesemantik?) – Sharing von Objekten muss auf der Clientseite rekonstruiert werden – Wenn übergebenes Objekt echter Untertyp des formalen Parameters ist, ist u.U. Upcast erforderlich 25 Implementierung RMI-Software: Softwareschicht zwischen Objekten und Kommunikations- und entfernten Referenzmodulen. – Schnittstellen-Compiler erzeugt automatisch Klassen für Dispatcher, Skeleton und Proxy – Server-Programm enthält Klassen für Dispatcher, Skeleton und alle davon unterstützten entfernten Objekte (ServantKlassen) sowie einen Initialisierungsabschnitt – Client-Programm enthält Klassen für Proxies aller entfernten Objekte. – Factory-Methode: Ersetzen Konstruktoren in den entfernten Schnittstellen, d.h. sind normale Methoden, die entfernte Objekte erzeugen können. 26 Implementierung Binder: Namensdienst, der Clients Objektreferenzen vermitteln kann Server-Thread: Um zu verhindern, dass ein entfernter Aufruf einen anderen Aufruf verzögert, weisen Server der Ausführung jeden entfernten Aufrufs einen eignen Thread zu! Aktivierung: Erzeugung einer Instanz und initialisierung der Instanzvariablen. Persistenter Objektspeicher: Verwaltet persistente Objekte, also Objekte, die zwischen Aktivierungen weiterbestehen. Verteiltes garbage collection: Stellt sicher, dass in einem verteilten System garbage collection durchgeführt wird. Problem: Referenzen, die nur in Nachrichten vorhanden sind. 27 Beispiel: Java-RMI Definiert ein Rahmenwerk für die Kommunikation von JavaObjekten unabhängig von ihrem Ort Eine reine Java-Lösung Alle entfernten Objekte müssen eine entfernte Schnittstelle besitzen Es sind Werkzeuge vorhanden für die Generierung von Stubs und Skeletons. JDK stellt eine Implementierung des Naming-Service zur Verfügung: die RMIregistry. Ein RMI-Dämon erlaubt einen flexible (on-demand)Instanziierung von Objekten. 28 Java-RMI: Schnittstellen-Definitionen Schnittstellen werden definiert – Mit Hilfe des Java interface Konstrukts – Indem sie die Eigenschaften der remote Schnittstelle erben – Und indem sie RemoteExceptions auslösen können. Ansonsten können alle Java-Typen verwendet werden. Neue Klassen können definiert und als Parameter von Methoden verwendet werden. 29 Java-RMI: Das entfernte Objekt Um den von der Schnittstelle „versprochenen“ Dienst zu erbringen, muss es ein entferntes Objekt geben, das die Methoden der Schnittstelle implementiert. Gewöhnlich erweitert es die Klasse UnicastRemoteObject was aus dem Objekt einen nichtreplizierten Server macht, der über TCP kommuniziert. Object Remote RemoteObject RemoteStub RemoteServer UnicastRemoteObject 30 Java-RMI: Der RMI-Compiler Basierend auf der Implementierung des Objekts mit seinen Methoden kann man nun automatisch Stubs und Skeletons implementieren. JDK stellt ein Werkzeug namens rmic für diesen Zweck zur Verfügung. Folgender Aufruf > rmic DatumImpl Erzeugt zwei Dateien: – DatumImpl_Stub.class – DatumImpl_Skel.class 31 Java-RMI: Die RMI-Registry Die RMI-Registry, implementiert durch das Programm rmiregistry, ist der Namensdienst für Java RMI. Server registrieren entfernte Objekte unter einem Namen. Clients fragen die Datenbank ab, um die Referenz für einen entfernten Dienst zu erhalten. Namensdienste behandeln wir noch ausführlich. 32 Java-RMI: Die Klasse Naming void rebind (String name, Remote obj) This method is used by a server to register the identifier of a remote object by name. void bind (String name, Remote obj) This method can alternatively be used by a server to register a remote object by name, but if the name is already bound to a remote object reference an exception is thrown. void unbind (String name, Remote obj) This method removes a binding. Remote lookup(String name) This method is used by clients to look up a remote object by name. A remote object reference is returned. String [] list() This method returns an array of Strings containing the names bound in the registry. //ComputerName:Port/ObjectName This is the name used in the namingservice 33 Java-RMI: Erzeugen einer Anwendung 1. Definiere die entfente Schnittstelle 2. Implementiere die entfernte Schnittstelle durch ein entferntes Objekt 3. Generiere Stubs und Skeletons mit rmic 4. Schreibe einen Client 5. Starte den Namensdienst mit rmiregistry 6. Starte den Server 7. Starte den Client 34 Beispiel: Datumsabfrage Das Beispiel implementiert einen RMI-Server, der das aktuelle Datum seiner Maschine zurückgibt. Wir müssen selbst die folgenden Dateien schreiben: – Datum.java die Schnittstelle – DatumImpl.java das entfernte Objekt – DateServer.java der Server – DateClient.java der Client 35 Beispiel: Datumsabfrage Suffix Bedeutung kein (z.B. Datum) Eine entfernte Schnittstelle Impl (z.B. DatumImpl) Eine Serverklasse, die diese Schnittstelle implementiert Server (z.B. DatumServer) Ein Serverprogramm, das Serverobjekte erzeugt Client (z.B. DatumClient) Ein Clientprogramm, das entfernte Methoden aufruft _Stub (z.B. DatumImpl_Stub) Eine Stub-Klasse, automatisch mit rmic erzeugt _Skel (z.B. DatumImpl_Skel) Eine Skel-Klasse, automatisch mit rmic erzeugt (nur für < JDK 1.1) 36 Beispiel: Datum.java import java.rmi.*; import java.util.Date; interface Datum extends Remote { public Date getDate() throws java.rmi.RemoteException; } ••Verwendet Verwendetvon vonClient Clientund undServer Server ••Muss Musssich sichauf aufdem demClientrechner Clientrechner und und dem demServerrechner Serverrechnerbefinden! befinden! 37 Beispiel: DatumImpl.java import java.rmi.*; import java.rmi.server.*; import java.util.Date; class DatumImpl extends UnicastRemoteObject implements Datum { public DatumImpl() throws RemoteException { super(); } public Date getDate() throws java.rmi.RemoteException { return new Date(); } } ••Implementiert Implementiertdie dieentfernten entferntenObjekte Objekte ••Muss Musssich sichauch auchnur nurauf aufdem demServerrechner Serverrechnerbefinden! befinden! ••Mittels Mittelsrmic rmic DatumImpl DatumImpl werden werdenStub Stubund undSkeleton Skeletonerzeugt erzeugt 38 Beispiel: DatumServer.java import java.rmi.*; import java.rmi.server.*; import java.util.Date; public class DatumServer { public static void main(String[] args) { try { DatumImpl dateServer = new DatumImpl(); Naming.bind("DateServer", dateServer); } catch (Exception e) { System.out.println("DatumServer: Exception:"); System.out.println(e.getMessage()); } } } ••Implementiert Implementiertdie dieServerfunktionalität Serverfunktionalität(z.B. (z.B.Erzeugen Erzeugender derObjekte) Objekte) ••Muss Musssich sichauch auchnur nurauf aufdem demServerrechner Serverrechnerbefinden! befinden! 39 Beispiel: DateClient.java import java.rmi.*; import java.util.Date; Adresse der public class DatumClient { RMIRegistry public static void main(String[] args) { try { Datum dateServer = (Datum) Naming.lookup("//:1099/DateServer"); Date when = dateServer.getDate(); System.out.println(when); } catch (Exception e) { System.out.println("DatumClient: Exception."); System.out.println(e.getMessage()); } } } ••Implementiert Implementiertden denClient Client ••Muss Musssich sichauch auchnur nurauf aufdem demClientrechner Clientrechnerbefinden! befinden! 40 Java-RMI: Automatische Objektaktivierung In großen Systemen mit Tausenden von Objekten ist es unrealistisch, immer alle Objekte im Speicher aktiv zu haben. Mit Hilfe des Java-Aktivierungsmechanismus können Objekte persistent gemacht und erst bei Bedarf wieder instanziiert werden. Dieses Objektmanagement wird durch den Dämon rmid realisiert. Jini basiert weitgehend auf diesem Aktivierungsmechanismus. 41 Middleware Applikationen, Dienste Middleware Verteilungsplattform: Transparenz der •Heterogenität existierender Hardware und Betriebssysteme •Verteilung Betriebssystem Plattform Computer- und Netzwerkhardware 42 Definition von Middleware "Middleware is the intersection of the stuff that network engineers don't want to do with the stuff that applications developers don't want to do.“ "Middleware today encompasses everything to the right of the clients and to the left of the legacy systems. It resides above the OS and below the application logic.“ "Middleware: the slash in client / server.“ “… some think of the Web as the ultimate in middleware.“ 43 Arten von Middleware Generisch – – – – Object Request Broker Remote Procedure Call (RPC) Message Passing Virtual Shared Memory Objektzugriff übers Netz Aufruf einer entfernten Prozedur Send/Receive–Kommunikation Zugriff auf virtuell gemeinsamen Speicher Speziell – – – – – Dateitransfer Datenbankzugriff Transaktionsverarbeitung Groupware Workflow Fernzugriff auf gemeinsame Dateien Datenzugriff auf entfernte DB Koordination verteilter Transaktionen Zusammenarbeit verteilter Gruppen Organisation arbeitsteiliger Prozesse 44 Standardisierung von Middleware (Offizielle) Internationale Standardisierung – ISO – International Standardisation Organisation – ITU – International Telecommunication Union – DIN, ANSI, BSI, AFNOR, ... Semi-offizielle Internationale Standardisierung – OpenGroup (früher X/OPEN bzw. OSF) – IEEE – Institute of Electrical and Electronic Engineers – IETF – Internet Engineering Taskforce – W3C – World Wide Web Consortium Konsortien – OSF – Open Software Foundation (heute: OpenGroup) – OMG – Object Management Group "Industriestandards" 45 Object Management Group (OMG) Gründung: April 1989 Ziele: – Interoperabilität – Anwendungsintegration – Portabilität Mitglieder: in heterogenen Umgebungen auf der Basis des Objektmodells Distributed Component Object Model (DCOM) – über 800 Mitglieder – darunter: Apple, AT&T, DEC, HP, IBM, Microsoft, SUN,... Entwicklungsprozeß: Request for Proposal (RFP) 46 Object Management Architecture (OMA) Application Objects Common Facilities ORB Common Object Services Application Objects – spezifische Anwendungsgebiete – gehören nicht zur Infrastruktur Common Facilities – allgemein nützliche Dienste (Drucken, E-Mail, Datenbanken) – nicht notw. Teil aller Infrastrukturen Object Request Broker (Objektbus) – Infrastruktur für Kommunikation – garantiert Interoperabilität Common Object Services – allg. Funktionen zum Erstellen u. Unterhalten von Objekten 47 Application Objects Common Facilities Application Objects: z.B. Business-Objekte ORB Andere Schnittstellen Common Object Services PräsentationsObjekt Komponenten eines BusinessObjektes – kapseln Speicher, Metadaten, Parallelität u. Regeln einer aktiven Business-Einheit – legt fest, wie auf Änderungen in View/Modell reagiert wird MVC MVC BusinessProzeßObjekt Business-Prozeßobjekte (C, Server) – kapseln Business-Logik – Verwaltung vorwiegend langlebiger Prozesse (Workflow, Transaktion) BusinessObjekt Andere Business-Objekte Business-Objekte (M, Server) Präsentationsobjekte (V, Client) – grafische Darstellung des Objektes – unterschiedliche Präsentationen möglich Dokument Server 48 GIOP und IIOP Mit CORBA 2.0 wurde GIOP = General Inter-Orb Protocol als netzwerkunabhängiges Wire Protocol spezifiziert Die (meist verwendete) TCP/IP-Variante heißt IIOP = Internet Inter-Orb Protocol GIOP spezifiziert – Nachrichtentypen (Requests, Resultate, Ping, ...) – Datenaustauschformat ("Common Data Representation") – Interoperable Objektreferenzen (IORs) – Service-Kontexte (Request-Anhängsel, mit denen Dienste transparent Informationen übermitteln können) 49 CORBA Interoperabilität Systemgrenze Stub A (Client) Skeleton A‘ ORB von A B‘ B (Server) IIOP ORB von B ORB 50 CORBA Objekte Client Request Result Schnittstelle Op1 Op2 Op3 Op4 Objekt Objekt besteht aus Zustand und Operationen Schnittstelle beschreibt Menge von Operationen für die Clients Operation entspricht angebotenem Service und hat Signatur Signatur ist eine Spezifikation von Argument- und Ergebnisparametern, Exceptions, Kontext Vererbung kann benutzt werden, um neue Schnittstellen aus anderen Schnittstellen zusammenzusetzen kann überall im Netz existieren 51 Interface Definition Language IDL C IDL C++ IDL COBOL IDL Client/Server Ada ORB Java IDL Smalltalk IDL Basismechanismus zur Definition von Schnittstellen (Standard) Unabhängig von spezieller Sprache (deklarativ, d.h. ohne algorithmische Teile, d.h. ohne Implementierungsdetails) Sprachbindung für verschiedene Sprachen IDL-Grammatik ist Teilmenge von C++; zusätzlich Mittel für Verteilungskonzepte Beinhaltet Mehrfachvererbung Schnittstellenverzeichnis (Interface Repository), damit selbstbeschreibend IDL ist Kontrakt, der alle und alles zusammenbringt 52 Struktur einer CORBA-IDL-Datei module <identifier> { <type declarations>; <constant declarations>; <exception declaration>; interface <identifier> [:<inheritance>] { <type declarations>; <constant declarations>; <attribute declarations>; <exception declaration>; [op_type]<identifiere>(<parameters>) [raises exception][context]; ... [op_type]<identifiere>(<parameters>) [raises exception][context]; ... } interface <identifier> [:<inheritance>] ...} Definiert einen Namenskontext Definiert eine CORBA-Klasse Definiert eine Methode 53 Struktur eines CORBA-2.*-ORB‘s I Object Implementation Client Implementation Repository Interface Repository Dynamic Skeleton Static Object Invocation Adapter Skeletons ORB Interface Client IDL Stubs Dynamic Invocation Object Request Broker Core (IIOP) 54 Aufbau eines CORBA-Servers Applikationscode aktive Servants Hauptprogramm Servant Activator main (String args[]) { mainorb (String args[]) { ORB orb =ORB ORB.init(args); = ORB.init(args); orb.connect ( orb.connect ( new AServant() ); new AServant() ); orb.connect( orb.connect( new BServant() ); new BServant() ); orb.run(); } orb.run(); } Default statisch Servant (mit Skeleton) ii ORBSchnittstelle dynamisch (ohne Skeleton) ... 1 2 ... ... n ... Servant Default Active Object Activator Servant Map Fabrik für Portable Object Adapter Objektreferenzen Request Interceptors für verschiedene Event Marshalling Services (optional) Loop Engine ORB-Kern Netzwerk 55 Struktur eines CORBA-2.*-ORB‘s: Client IDL-Stub‘s (Client) – – – – Schnittstelle zu Objektdiensten (Proxy) Generierung durch IDL-Compiler Enthält Code für De-/Kodierung der Operationen u. Partameter Enthält Header-Dateien für Hochsprachen Dynamic Invocation Interface (DII) – Finden von aufrufbaren Methoden zur Laufzeit – Standard API‘s für Suche in Metadaten, Parametergenerierung, Remote-Aufruf Interface Repository API – Lesen u. Modifizieren von allen (registrierten) Komponentenschnittstellen – „dynamische Metadatenbank“ für ORB‘s ORB Interface – API-FUnktionen für lokale Dienste – z.B. Konvertierung Objektreferenz in Zeichenkette u. zurück 56 Struktur eines CORBA-2.*-ORB‘s: Server IDL-Stubs (Server) – statische Schnittstelle (Skeletons) der angebotenen Dienste – werden vom IDL Compiler erzeugt Dynamic Skeleton Interface (DSI) – – – – Object Adapter – – – – Laufzeit-Verknüpfungsmechanismus für Methodenaufrufe von Komponenten, die keine IDL-basierte Stubs haben z.B. für generische Bridges zwischen verschiedenen ORB‘s z.B. dynamische Objektimplementierung Laufzeitumgebung für Instanzen von Server-Objekten übergibt ihnen die Anfragen und weist ihnen Objekt-ID‘s (Objektreferenzen) zu registriert unterstützte Klassen u. Laufzeitinstanzen im Implementation Repository Standard Adapter: Portable Object Adapter (POA), ehemals Basic Object Adapter (BOA) Implementation Repository – Laufzeitverzeichnis über unterstützte Klassen, Objektinstanzen, Objekt-ID‘s – (gemeinsamer) Speicher für zusätzliche Informationen, z.B. Prüfprotokolle, Sicherheit, Trace-Informationen 57 Methodenaufruf über CORBA Client Anwendung 1) Aufruf IDL Stub 2) Parameter einpacken und Aufruf weiterleiten Objekt Implementierung 5) Auspacken und Aufruf IDL Skeletton 4) Weiterleiten an Schnittstelle Object Adapter 4b) Aktivieren Implementation Repository 4a) Ermitteln der Implementierung Object Request Broker Core 3)Transport über den ORB 58 Client- und serverseitige IDL-Implementierung Schnittstellendesigner interfaces.idl interfaces.idl Programmierer Anwendungsentwickler IDL-Java IDL-Java Compiler Compiler client.jar client.jar stubs.jar stubs.jar Client IDL-C++ IDL-C++ Compiler Compiler types.hh types.hh stubs.cc stubs.cc skels.cc skels.cc servants.cc servants.cc Server 59 Von der IDL zu Schnittstellen-Stubs I 1 Schreibe Deine IDL Definitionen 2 Precompiler Skeletons Füge dem Skeleton den Server Implementierungscode zu 3 7 4 Compiler Instanziiere 5 Interface Repository Objekt Adapter 6 Client IDL Stubs Client Server IDL Skeletons Objekt Implementierung Implementation Repository Server 60 Von der IDL zu Schnittstellen-Stubs II Definiere die Objektklassen mit Hilfe der IDL: 1 Welche Operationen eines Objektes sind verfügbar und wie werden sie aufgerufen ? Lasse die IDL-Datei durch einen Sprachen-Precompiler laufen: Generierung der IDL-Dateien und der Sprach-Skeletons. Füge dem Skeleton den Implementierungscode zu: Erzeugung der Server-Klassen. 2 3 Kompiliere den Code: 4 Importdateien für Schnittstellenverzeichnis, Client-Stubs und Server-Skeletons Binde die Klassendefinitionen mit den Schnittstellenverzeichnissen 5 6 Lasse die Laufzeitobjekte im Implementierungsverzeichnis registrieren Erzeuge für die Objekte auf dem Server Instanzen 7 Im folgenden wird ein einfaches Beispiel unter JDK 1.4.1 gezeigt. 61 Schritt 1: Bank1.idl Definiert den Namenskontext Definiert die CORBA-Klasse IKonto1 module Bank1 { interface IKonto1 { Definiert die Methoden double einzahlen (in double betrag); einzahlen und double abfragen (); abfragen }; }; 62 Schritt 2: IDL-Compiler Zuordnung Schnittstelleohne ohne Zuordnung Schnittstelle Referenz--Klasse Klasse Vererbungshierarchie(Tie) (Tie) Referenz Vererbungshierarchie Verwaltung Verwaltung Vondem demCompiler Compiler out/inout-Argumente Von out/inout-Argumente idlj erzeugt erzeugt idlj 63 Schritt 2: IDL-Compiler ab dem JDK 1.3 ist der IDL-Compiler idlj enthalten. Hier JDK 1.4.1 Grundsätzlich sind (auf der Seite des Servers) zwei Modelle vorgesehen: – Inheritance Model (Klassen-Vererbung) – Tie Delegation Model (Schnittstellen-Vererbung) Da Java keine mehrfache Klassenvererbung erlaubt, kann es bei vorhandenem Code nötig sein, dieses Modell zu wählen. Parameter -oldImplBase: Existiert aus Gründen der Kompatibilität zu älteren Versionen. Vererbungsstruktur wie folgt: IKonto1Impl _IKonto1ImplBase IKonto1 CORBA.Object Parameter -oldImplBase: Die Tie-Anbindung des Servants ermöglicht die Implementation über die Schnittstelle _IKonto1Operations, die in keine Vererbungshierarchie eingebunden ist. 64 Schritt 3: Implementierung IKonto1Impl.java import Bank1.*; public class IKonto1Impl extends _IKonto1ImplBase { double kontostand; public static boolean debug = true; public void IKontoImpl () { kontostand = 0.0; } public double einzahlen (double betrag) { double k = kontostand; k += betrag; return kontostand = k; } public double abfragen () { double k = kontostand; return kontostand = k; } } 65 Schritt 3: Implementierung SunServer.java import java.io.*; import java.util.*; import org.omg.CORBA.*; import org.omg.CosNaming.*; //Importiere Server-Skeleton import Bank1.*; public class ServerSun { public static void main (String args[]) { try { Properties props = new Properties(); props.put("org.omg.CORBA.ORBInitialPort", "1050"); props.put("org.omg.CORBA.ORBInitialHost", "localhost"); ORB orb = ORB.init (args, props); // NamingContext besorgen NamingContextExt ctx = NamingContextExtHelper.narrow( orb.resolve_initial_references("NameService")); // Weiter auf nächster Folie 66 Schritt 3: Implementierung SunServer.java // Neue Instanz der Implementierung IKonto1Impl konto = new IKonto1Impl (); // Namen für neue Instanz vergeben und // Referenz beim Namingservice anmelden NameComponent name[] = ctx.to_name("Konto"); ctx.rebind(name, konto); // Do nothing and run... java.lang.Object sync = new java.lang.Object (); synchronized (sync) { try { sync.wait(); } catch (InterruptedException e) { System.out.println (e); } } } catch (Exception ex) { System.err.println (ex); System.exit (1); } } } 67 Schritt 3: Client.java import java.io.*; import java.util.*; import org.omg.CORBA.*; import org.omg.CosNaming.*; //Importiere den Client-Stub import Bank1.*; public class Client { public static void demo (IKonto1 konto) { System.out.println ("Kontostand alt " + konto.abfragen()); System.out.println ("Kontostand " + konto.einzahlen(50.0)); } // Weiter auf nächtser Folie 68 Schritt 3: Client.java public static void main (String args[]) { try {Properties props = new Properties(); props.put("org.omg.CORBA.ORBInitialPort", "1050"); props.put("org.omg.CORBA.ORBInitialHost", "localhost"); ORB orb = ORB.init(args, props); // NamingContext besorgen NamingContextExt nc = NamingContextExtHelper.narrow( orb.resolve_initial_references("NameService")); // Objektreferenz mit Namen "Konto" besorgen org.omg.CORBA.Object obj = nc.resolve_str("Konto"); // Narrow-Cast und aufrufen IKonto1 konto = IKonto1Helper.narrow (obj); demo(konto); } catch (Exception ex) { System.err.println (ex); System.exit(1); } } } 69 Abschluss: Starten des Servers Der CORBA-Namingservice wird gestartet mit orbd Mit Hilfe des Parameters –ORBInitialPort kann der Port für den Service vorgegeben werden. 70 Abschluss: Starten des Clients 71 Prozeß eines dynamischen Aufrufs Name der Schnittstelle verschaffen: get_interface() Methodenbeschreibung verschaffen: lookup_name(); describe(); Argumentenliste erzeugen: create_list(); add_item() ... add_item() ... add_item(); Anfrage erzeugen: create_request(Object Reference, Method, Argument List); Entfernte Objektmethode aufrufen: – RPC verwenden: invoke(); – Send/Receive: send_deferred(); get_response(); – Datagramm: send_oneway(); 72 CORBA 3.0 Messaging (MOM) (asynchroner Methodenaufruf) Server Portability (Portable Object Adapter & Server Framework Adapter) Multiple Interface & Versioning Business Objects Framework (BOF) Java Bindings Pass-by-value Mobile Agents CORBA Components (CCM) Real Time CORBA CORBA Firewall Minimum CORBA („CORBA für eingebettete Systeme“) 73 Idee: Komponenten Komponente = höhere Abstraktionsform von Objekten – Bestehen aus einem oder mehreren Objekten, welche in einen Container gepackt werden Komponenten interagieren u. kooperieren über verschiedene BSplattformen, Sprachen, etc. hinweg – Bausteine für multitiered Anwendungen Anwendungen bestehen aus (dynamischen) Mengen interagierender Komponenten (monolithische Anwendungen aufbrechen) Dieses Modell hat enorme Konsequenzen bzgl. – – – – – Entwurf von Software („Lego-Bausteine“) Vertrieb von Software („add-on Komponenten“, „late customizing“) Pflege von Software (Wiederverwendung, Varianten) Funktionalität (aktive, ggf. mobile Objekte) Marketing (Komponenten-Markt) Erfordert Standards und Infrastrukturservices – für die Interaktion der Komponenten – für die Komponenten selbst (Versionskontrolle, Konfiguration) 74 Häufigkeit der Wiederverwendung Motivation Klassen Framework Komponente Vorfabrizierte Anwendung Einsparung 75 J2EE Komponentenplattform Die Java 2 Enterprise Edition (J2EE) ist eine Plattform für die komponentenorientierte Entwicklung von Anwendungen. Sie besteht aus: Einer Spezifikation / Guidelines / Testsuite Java Komponenten – Java Beans (clientseitig) – Java Server Pages und Servlets – Enterprise Java Beans (serverseitig) Verschiedene Container: Application, Web, EJB Java Naming and Directory Interface (JNDI) 76 EJB Introduction „An Enterprise JavaBeans (EJB ) component, or enterprise bean, is a body of code having fields and methods to implement modules of business logic. You can think of an enterprise bean as a building block that can be used alone or with other enterprise beans to execute business logic on the J2EE server.“ (J2EE Tutorial: http://java.sun.com/j2ee/1.4/docs/tutorial/doc/Overview7.html#wp86355) EJB 2.0 ist Bestandteil der J2EE 1.4 Spezifikation EJB 3.0 wird Bestandteil der J2EE 5.0 Spezifikation EJB Container bildet die Laufzeitumgebung (Runtime Environment) 77 EJB / J2EE Architektur 78 EJB Container “Manages the execution of enterprise beans for J2EE applications. Enterprise beans and their container run on the J2EE server. “ (J2EE Tutorial: http://java.sun.com/j2ee/1.4/docs/tutorial/doc/Overview3.html#wp79828) Bietet folgende Dienste für EJBs – Security Modelle – Unterstützung für Transaktionen – Naming Services (JNDI registry & lookup) – Initiiert und kontrolliert den Lebenszyklus der Beans – Datenpersistenz – Datenbankverbindungen – Ressourcen-Pooling 79 EJB Einsatz (Deployment) Enterprise JAR Archiv enthält: – Deployment Descriptor: XML file (persistence type, transaction attributes…) – Interfaces (Remote und Home Interfaces für den Komponentenzugriff) – EJB classes (Implementierungen der Interfaces) – Helper classes (… was man sonst braucht) EJB-JAR Module können zusammengefasst werden in einem Enterprise Application Archive (EAR). Siehe http://java.sun.com/xml/ns/j2ee/ für Details über deployment descriptors. 80 EJB-JAR.XML <ejb-jar> <display-name> MailApplicationEJB </display-name> <enterprise-beans> <session> <ejb-name> MailReader </ejb-name> <home> . . .MailReaderSessionHome </home> <remote> . . .MailReaderSession </remote> <ejb-class> . . .MailReaderSessionBean </ejb-class> <session-type> Stateful </session-type> <transaction-type> Container </transaction-type> </session> </enterprise-beans> </ejb-jar> 81 EJB Typen 1 Session Bean – wird für einen einzelnen Client ausgeführt – An die Lebenszeit einer Session gebunden Entity Bean – repräsentiert objektorientierte Sicht auf Daten (z.B. aus einer Datenbank) – Kann von mehreren Clients gleichzeitig angesprochen werden – Überdauert Client Session und Serverneustarts. Message-Driven Bean – reagiert auf JMS1 Nachrichten – zustandslos, kommuniziert asynchron Java Message Service - http://java.sun.com/products/jms/ 82 Session Beans Session Bean Eigenschaften: – Verbergen Komplexität der Business Logic – Nicht persistent – Repräsentieren eine (interaktive) Session für einen Client – Können nicht zwischen Clients geteilt werden – Beenden mit dem Client Session Bean Modi: – Stateless Session Beans: Variablenzustände leben nur während Methodenaufrufen – Stateful Session Beans: Variablenzustände bestehen während der Clientsitzung 83 Entity Beans Entity Bean Eigenschaften: – Erlauben geteilten Zugriff auf persistente Datenspeicher (z.B. relationale Datenbank) – Können auch transiente Attribute besitzen – Besitzen unique object identifier (primary key) – Können in Relation zu anderen Entity Beans stehen Persistenzarten: – Bean-managed: Bean verwaltet Zustände selbst, z.B. DB-Zugriffe – Container-managed: Container organisiert Datenzugriff (Portabilität!), hierzu EJB Query language (EJB QL) 84 Message-Driven Beans Message-Driven Bean Eigenschaften: – Asynchrone Prozessierung eingehender Messages – Empfängt JMS Messages von Clients – Verarbeitet Messages einzeln. – Wird asynchron erzeugt – Lebt gewöhnlich nur kurz. – Repräsentiert keine persistenten Daten (zustandslos), kann aber auf persistente Daten zugreifen. – Kann transaktionsorientiert arbeiten. – Message-Driven Beans haben keine eigenen Interface Definitionen, werden also nicht direkt von Clients angesprochen 85 Lebenszyklus von EJBs Stateful Session Bean Stateless Session Bean Entity Bean Message-Driven Bean 86 Zugriff auf Beans Remote Zugriff – Ort des Beans ist für den Client transparent – Zugriff über JVMs hinweg möglich – Zu implementierende Schnittstellen: W Home Interface W Remote Interface Lokaler Zugriff – Ort des Beans ist für den Client nicht transparent – Bean und Client müssen in der gleichen JVM liegen – Zu implementierende Schnittstellen: W LocalHome Interface W Local Interface 87 Remote Interface (Session-, Entity-Beans) Namenskonvention: classname Erweitert EJBObject Interface Beschreibt die Schnittstellen der Anwendungslogik (Business logic) des Beans Beispiel: public interface MailReaderSession extends EJBObject { public String getVersion() throws RemoteException; public String getUserName() throws RemoteException; // mehr Business Logic ... } 88 Home Interface (Session-, Entity-Beans) Namenskonvention: classnameHome Erweitert EJBHome Interface LifeCylce Methoden (create, remove) Finder Methoden (Entity Beans) Das Bean muss für jede create(…)-Methode des Interfaces eine entsprechende ejbCreate(…)-Methode implementieren Beispiel: public interface MailReaderSessionHome extends EJBHome { public MailReaderSession create() throws RemoteException, CreateException; // evt. weitere create(…) Methoden } 89 Local Interface Namenskonvention: classnameLocal Erweitert EJBLocalObject Beschreibt die Schnittstellen der Anwendungslogik (Business logic) des Beans Beispiel: public interface MailReaderSessionLocal extends EJBLocalObject { public String getVersion() throws RemoteException; public String getUserName() throws RemoteException; // mehr Business Logic ... } 90 LocalHome Interface Namenskonvention: classnameLocalHome Erweitert EJBLocalHome Interface LifeCylce Methoden (create, remove) Finder Methoden (Entity Beans) Das Bean muss für jede create(…)-Methode des Interfaces eine entsprechende ejbCreate(…)-Methode implementieren Beispiel: public interface MailReaderSessionLocalHome extends EJBLocalHome { public MailReaderSession create() throws RemoteException, CreateException; // evt. weitere create(…) Methoden o. find... Methoden } 91 (Enterprise) Bean Klasse Namenskonvention: classname Implementiert SessionBean, EntityBean oder MessageDrivenBean Konkrete Implementierung der Schnittstellen des Home- und des RemoteInterfaces Enthält Methoden die während des Bean Lifecycles vom EJB Kontainer aufgerufen werden (abhängig vom Typ des Beans) z.B.: – ejbCreate (analog zu den create(…)-Methoden des Home Interfaces) – ejbActivate() – ejbPassivate() 92 Bean Implementierung (SessionBean, Stateful) public class MailReaderSessionBean implements SessionBean { private String username = null; private String password = null; public void ejbCreate() throws CreateException{ } public void ejbCreate(String login, String password) throws CreateException { this.username = login; this.password = password; } public void setSessionContext(SessionContext context) throws EJBException, RemoteException { } public void ejbRemove() throws EJBException, RemoteException { } public void ejbActivate() throws EJBException, RemoteException { } public void ejbPassivate() throws EJBException, RemoteException { } public String getVersion() { return "Version 0.1"; } public String getUserName() { return this.username; } } 93 Bean Client import import import import import java.util.Hashtable; javax.naming.Context; javax.naming.InitialContext; javax.naming.NamingException; javax.rmi.PortableRemoteObject; import sample.mailapp.beans.MailReaderSession; import sample.mailapp.beans.MailReaderSessionHome; public class MailCient { public static void main(String[] args) { String version = "no version"; InitialContext jndiContext = null; try { jndiContext = new InitialContext(); // initial context properties are read from the jndi.properties file } catch (NamingException e) { e.printStackTrace(); } … continue on next slide 94 Bean Client (cont.) … // Retrieve the home object. MailReaderSession mailSession = null; try { Object obj = jndiContext.lookup("MailReader"); MailReaderSessionHome home = (MailReaderSessionHome) PortableRemoteObject.narrow(obj, MailReaderSessionHome.class); mailSession = home.create("me","123"); version = mailSession.getVersion(); System.out.println("Is vesion (" + version + ")"); System.out.println("User ("+ mailSession.getUserName()+")"); } catch (Exception e1) { e1.printStackTrace(); } } 95 Message Driven Beans Im Gegensatz zu Entity o. Sessions Beans keine Local, Home o. Remote Interfaces Werden an eine Message-Queue des EJB Kontainers gebunden Muss MessageListener Interface implementieren (onMessage(Message aMessage) Methode behandelt eingehende Nachrichten) Jeweils genau eine ejbCreate und ejbRemove Methode 96 Web Services Grundidee: unvereinbare Welten miteinander zu verknüpfen und kommunizieren lassen. Web Services sind Dienste (Softwarekomponenten), die im Web zur Verfügung stehen und miteinander kommunizieren. Offene und Hersteller unabhängige Standards: – Eindeutige Identifizierung eines Dienstes (URI) – Autonome Dienste, d.h. die Verarbeitung einer Nachricht eines Dienstes kann von außen nicht beeinflusst werden. – Einheitliche „mark up“ Sprache für die Kommunikation (XML) mittels Internetprotokollen (z.B. HTTP, SMTP) – Einheitliches Nachrichtenformat zum Informationsaustausch (SOAP) – Einheitliches Format für die Schnittstellen-/Servicebeschreibung (WSDL) – Gemeinsames Verzeichnis, um Services auffindbar zu machen (UDDI) 97 Begriffe Web Service Universal UDDI Description Discovery and XML Integration Web Service WSDL Description Language XML Simple Object Access SOAP Protocol 1. Namensdienst (optional) 2. Schnittstellen definitionssprache (optional) 3. Nachrichtenformat XML 98 Rollen 99 Struktur eines Web Service 100 SOAP SOAP Envelope (XML): strukturiertes und typisiertes XML-Dokument, zusätzliche Kontroll-Daten, z.B. bzgl. Transaktionssemantik, Sicherheit, Zuverlässigkeit SOAP Transport Binding: Für Kommunikation genutztes Netzwerkprotokoll (Standard: HTTP, möglich u.a. IIOP) SOAP Encoding Rules: Definition, wie (komplexe) Parameter und Ergebniswerte serialisiert werden SOAP RPC Mechanismus: Vorgänger ist XML/RPC SOAP Intermediaries: Bearbeiten ggf. die Nachricht auf dem Weg vom Sender zum Empfänger (z.B. Protokollierung, Abrechnung) 101 Typische SOAP Transaktion: RPC via HTTP 102 SOAP über HTTP: Anfrage 103 SOAP über HTTP: Antwort 104 SOAP Programming: Bean Service public MyBean scramble(MyBean bean){ //create return value MyBean retVal = new MyBean(); //write text backwards (scramble text value) String text = ""; for(int i =bean.getText().length();i>0;i--) text+=bean.getText().substring(i-1,i); //set new text value retVal.setText(text); //return scrambled object return(retVal); } 105 SOAP Programming: Bean Client … bean = new MyBean(); call = (Call)service.createCall(); //create bean //create call //create qualified name for attachment type (DataHandler). QName qname = new QName("http://myBean.org","MyBean",“my"); //add (de-)serializer for bean call.registerTypeMapping(MyBean.class, qname, BeanSerializerFactory.class, BeanDeserializerFactory.class); call.addParameter("bean", qname, ParameterMode.IN); //register (passed) parameter for bean call.setReturnType(qname); //specify expected return type of web service method call.setOperationName(new QName("scramble")); //specify web service method call.setTargetEndpointAddress(HOST + SERVICE_PATH); //specify web service URI Object ret = call.invoke(new Object[] {bean}); } catch (Exception ex) { //invoke web service with passing bean as parameter. 106 WSDL Beschreibt abstrakt, d.h. unabhängig vom Nachrichtenformat oder Netzwerkprotokoll, Web Services als eine Menge von Zugriffsendpunkten, die untereinander Nachrichten auf prozedur- oder dokumentenorientierter Weise austauschen WSDL ist eine XML-Grammatik Beschreibung beinhaltet Informationen über: – Funktionsweisen eines Web Services Was – zulässigen Datenformate (types) Wie – Form der Operationsaufrufe (PortType) Wie – Ort des Web Services (service) Wo WSDL ist ein Rezept, das dazu dient, die Details der Kommunikation zwischen Anwendungen zu automatisieren. Version 2.0 – W3C Candidate Recommendation (2006) 107 WSDL Beispiel (V1.1) Datentypen und Nachrichten <types> </types> <message name="getLastTradePriceRequest"> <part name="companyName type="xsd:string”/> </message> <message name="getLastTradePriceResponse"> <part name="price" type="xsd:float"/> </message> <portType name="StockQuotePortType"> <operation name="getLastTradePrice"> <input message="myns:getLastTradePriceRequest"/> <output message="myns:getLastTradePriceResponse"/> </operation> </ portType> Aufrufbare Methoden 108 WSDL Beispiel (V1.1) Client –Server Kommunikation <binding name="StockQuoteSoapBinding„ type="tns:StockQuotePortType"> <soap:binding style=“rpc" transport=“http"/> <operation name=“GetLastTradePrice"> Soap-spezifische Einstellungen... </operation> </binding> <service name="StockQuoteService"> <port name="StockQuotePort" binding="tns:StockQuoteBinding"> <soap:address location=“http://www.stockquoteserver.com/stockquote"/> </port> Ort des </service> Web Services 109 UDDI Es gab bisher keinen allgemeinen Standard, zum Auffinden von Diensten. Yahoo und Google sind unzureichend. Plattformunabhängiger universeller Rahmen (UNIVERSAL), – um Services zu beschreiben (DESCRIPTION), – Unternehmen zu finden (DISCOVERY) – und die Services zu integrieren (INTEGRATION) Globaler Verzeichnisdienst Entspricht einer verteilten Datenbank (UBR: UDDI Business Registry) UDDI Kommunikation mittels SOAP UDDI API aus XML Elementen 110 Informationen White Pages Adresse, Kontaktinformationen, Ansprechpartner Yellow Pages Branchenverzeichnis, Kategorisierung nach Unternehmen: Einordnung des Unternehmens gemäß Geschäftsbereich Green Pages technische Informationen zu angebotenen Dienstleistungen und Verweise zu genauen Spezifikationen 111 Policies Zur Beschreibung von Qualitätseigenschaften eines Dienstes, wie etwa Transaktionsunterstützung, Sicherheit, oder geschäftlich relevanten Informationen, wie etwa Kosten, Zahlungsart. Grundelemente: Assertion. Assertion für Sicherheit geben z.B. Verschlüsselungsverfahren vor. Mittels Operatoren und Assertions können komplexere Policy-Ausdrücke formuliert werden. Zuordnung mittels Attachments (Referenzierung der Policy in einem Attachment). Zuordnung zu einzelnen Web Services, einzelnen Operationen eines Dienstes oder einzelnen Nachrichten möglich. Effektive Policy eines Elementes setzt sich aus den Policies der „übergeordneten“ Policies und der eignen zusammen. 112 Policies <Policy … xmlns:f1=„http://frank.com/p olicies“> Stammkunden und Laufkundschaft <ExactlyOne> werden unterschiedlich <All Id=„StammKunde“> behandelt: <f1:MonatlicheZahlung/> Stammkunden zahlen monatlich <f1:DatenGeheimhaltung/> und deren Daten werden geheim </All> gehalten. <All Id=„Laufkundschaft“> Laufkundschaft zahlt für jede <f1:ZahlungProNutzung/> einzelne Nutzung mit Kreditkarte <f1:Kreditkarte/> und deren Daten werden <f1:DatenWeitergabe/> weitergegeben. </All> f1 ist der Namensraum des </ExactlyOne> Anwenders. </Policy> 113