Hochschule Bonn-Rhein-Sieg Service-Orientierte Architekturen Kapitel 5: Web Services II Vorlesung im Masterstudiengang Informatik Sommersemester 2010 Prof. Dr. Sascha Alda ([email protected]) (Vorläufiger) Aufbau der Vorlesung Kapitel 1 2 3 4 (11.5.) Thema Organisation, Einführung in Software-Architekturen Einführung in Service-Orientierte Architekturen Design Prinzipien von Service-Orientierten Architekturen Web Services I (SOAP, WSDL) 5 (18.5.) Web Services II (Axis2) 6 (25.5.) Modellierung von Geschäftsprozessen (BPEL, BPMN) 7 (1.6.) Vertiefung und Backup Web Services 8 (8.6.) REST Architekturen 9 (15.6.) Einführung in Swordfish 11 (22.6.) Exception Handling in SOA (Gastvortrag) 12 (29.6.) SOA Point of View von Accenture (Gastvortrag) Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 2 Ziele dieser Unterrichtseinheit Grundlagen des Web Services Framework verstehen Implementierungen eines Web Service basierend auf AXIS2 verstehen und eigenständig anwenden können Analyse von AXIS2 in Hinblick auf die Entwurfsprinzipien einer SOA Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 3 Aufbau dieser Veranstaltung Kapitel 5: Einführung in Web Services, Teil 2 1 Überblick über AXIS2 2 Service-Entwicklung mit AXIS2 3 Aufrufmuster in AXIS2 (inkl. WS-Addressing) 4 Bewertung von AXIS2 5 Zusammenfassung und Ausblick Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 4 Aufbau einer SOAP-basierten Web Services Architektur UDDI (-compatible) Directory Return“possibleservices” : WSDL[ ] Discover “aService” SOAP SOAP Publish “aService” : WSDL SOAP Service Consumer Service Bind / Interaction Web Service Provider Web Service “aService” : WSDL SOAP • XML-basiertes Nachrichtenformat für den Aufruf / Interaktion mit einem Web Service WSDL (Web Service Description Language) • XML-basierte Meta-Sprache zur Beschreibung der Schnittstelle eines Web Service UDDI (Universal Description, Discovery and Integration) • Directory-Service für die Publikation und Suche von Web Services Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Überblick AXIS2 Laufzeitumgebung für Web Services basierend auf den W3-Standards SOAP und WSDL Bibliotheken für die Erstellung von Web Service-Clients Tools für die automatische Generierung von Source Code und WSDLDokumenten Plug-ins für Eclipse für das vereinfachte Deployment eigener Services und für eine vereinfachte Code-Generierung Web-Oberfläche für die Administration von AXIS2 bzw. von Web Services Weitere Infos unter: http://ws.apache.org/axis2/ Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 6 Installation von AXIS2 Zwei Installationen von AXIS2 sind verfügbar: - - Aktuelle Version: Version 1.5.1 http://ws.apache.org/axis2/download/1_5_1/download.cgi Standard Binary Version - Entwickler-Version mit vielen Beispielen und einen Standalone Web Server zum Testen von Web Services - Entwicklungstools (Java2WSDL und WSDL2Java) WAR Distribution - Version für das Deployment von Web Services (ohne Entwicklungstools) - Download als .war File (axis2.war), das in jedem Servlet Container installiert werden kann (z.B. Tomcat) - File muss in das Directory ../webapps/ kopiert werden Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 7 Servlet und Servlet Container Ein Servlet ist eine Java-Klasse (package javax.servlet.*), mit der ein Java Programm ein HTTP-Request empfangen und verarbeiten kann. - Kapselung des HTTP-Requests in eine objektorientierte Struktur (Klasse HttpServletRequest) - Zentrale Methoden: doGet(), doPost(), doPut(), doDelete() u.a. - Ausgabe von dynamischen HTML oder XML Code Implementierung der Java Servlet API (aktuell: 3.0) von der Firma SUN Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 8 Servlet und Servlet Container POST web/my HTTP/1.1 Host myserver.com Content-Type: application/ soap+xml …. „Mini“-HTTP-Server Web Browser, Java Programm Servlet-Container (Java) doGet() Servlet „Anwendung 1“ doGet() Servlet „Anwendung 2“ Application-Server Servlet-Klassen müssen in speziellen Laufzeitumgebungen (Servlet Container) installiert werden Servlet-Container nimmt einen HTTP-Request entgegen und kompiliert diesen in ein Java-kompatibles Format - Übergabe des Request an Methode doGet() bzw. doPost() eines selektierten Servlets (Bestimmung durch URL) Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 9 Architektur von AXIS2 (High-Level View) POST web/my HTTP/1.1 Host myserver.com Content-Type: application/ soap+xml SOAP Envelope …. „Mini“-HTTP-Server <<Service Consumer>> ServletContainer (Java) AXIS2 (= Servlet-Anwendung) doPost() Web Service n Web Service 1 Application-Server Deployment von AXIS2 als Servlet-Anwendung in einem Servlet-Container - Weiterleitung des kompilierten HTTP-Requests inkl. SOAP-Envelope an AXIS2, hier Selektion und Aufruf an den Service (durch URL bestimmt) Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 10 Handler in AXIS2 Handler dienen dazu, die Kernfunktionalität von AXIS2 zu erweitern, indem sie bestimmte Funktionen implementieren, die dann in den Verarbeitungsprozess ein- und ausgehender Nachrichten eingefügt werden können. Nicht zu verwenden für anwendungsspezifische Daten ( SOAP Body) Nur Auswertung von anwendungsunabhängigen Daten ( SOAP Header) Anwendung: - - - - - Logging Überprüfung von sicherheitsrelevanten Aspekten Transaktionen Sessionverwaltung Erweiterte Adressierungskonzepte Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 11 Handler in AXIS2 Implementierung von Handlern nach einer generischen Schnittstelle - Wichtige Methode: - InvocationResponse invoke( MessageContext context ) Definition von Handler in Handler-Flows - - - Interface org.apache.axis2.engine.Handler Eingehende Flows (Behandlung von eingehenden Requests) Ausgehende Flows (Behandlung von ausgehenden Responses) Handler können Abhängigkeiten zu anderen Handlern oder aber auch Angaben zur Reihenfolge mitbestimmen Definition und Verwaltung der Flows in der Konfigurationsdatei axis2.xml Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 12 Module in AXIS2 Mit Modulen kann die Funktionalität von AXIS2 erweitert werden (Plugin Konzept) In den meisten Fällen realisieren Module Funktionserweiterungen, indem sie mehrere zusammenhängende Handler installieren, die dann für bestimmte Services zugeordnet werden können Module können auch Web Services enthalten Beispiele: - - - WS-Addressing WS-Security WS-AtomicTransactions Module werden in der Datei module.xml spezifiziert Engagement von Modulen zu Services: - - - Global für alle Services: in Datei axis2.xml Local für einen Service: in Datei services.xml Manuell oder per Web-Schnittstelle Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 13 Nachrichtenfluss in AXIS2 (Detail-Sicht auf Architektur) AxisEngine MC-Req SOAP Request H1 H2 Hn IN FLOW MC-Req Message Receiver Web Service AXIS Servlet Http Transport Utils MC-Res MC-Res SOAP Response Transport Sender Hm H1 OUT FLOW AxisEngine Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 14 Aufbau dieser Veranstaltung Kapitel 5: Einführung in Web Services, Teil 2 1 Überblick über AXIS2 2 Service-Entwicklung mit AXIS2 3 Aufrufmuster in AXIS2 (inkl. WS-Addressing) 4 Bewertung von AXIS2 5 Zusammenfassung und Ausblick Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 15 Der Code-First Ansatz Implementierung (Source Code) einer Komponente liegt zuerst vor Ableitung der abstrakten Schnittstellen-Beschreibung (WSDL) Generierung von Proxy-Klassen (Stubs) für einen Client Verwendung und Integration der Komponente als Web Service Input für KomponentenImplementierung (z.B. Java) WSDL-Generator erzeugt WSDL-kompatible Beschreibung der Schnittstelle Input für Proxy-Klasse für Client (Java) Source CodeGenerator Proxy-Klasse für Client (C++) Proxy-Klasse für Client (C#) Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 16 Der Contract-First Ansatz Spezifikation der anwendungsspezifischen Datentypen in verschiedenen XML-Schemata Spezifikation der auszutauschenden Nachrichten (XML-Schema) Ableitung des WSDL-Files aus den Schemata Client-Proxy (Stub) und Service-Skeleton Generierung Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Der Contract-First Ansatz Datentypen I Datentypen I (XML-Schema) (XML-Schema) Input für Input für Nachrichten (XML-Schema) Input für WSDL-Tool WSDL-kompatible Beschreibung der Schnittstelle Input für Source CodeGenerator Service-Skeleton (Java, C++,...) Proxy-Klasse für Client (Java) Klassen für Datentypen Proxy-Klasse für Client (C++) Klassen für Nachrichten Proxy-Klasse für Client (C#) Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 18 Contract-First vs. Code-First – ein Vergleich Code-First - Vorteile: - Nachteile: Bestehende Komponenten (Altbestände) können als Web Service integriert werden Probleme bei der Umwandlung von komplexen, programmiersprachen-spezifischen Datentypen Probleme bei der Interoperabilität zwischen verschiedenen Programmiersprachen Contract-First - Vorteile: - Geringere Interoperabilitätsprobleme, da frühzeitige Einigung auf gemeinsame anwendungsspezifische Datentypen Nachteile: Schlechte Tool-Unterstützung, schlechte Compiler Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 19 Code-First bei AXIS AXIS2 erlaubt die Entwicklung und Inbetriebnahme von Web Services von POJOs („Plain Old Java Objects“) Keine AXIS-spezifischen Klassen, Packages, Code-Fragmente sind notwendig - Anders als beim Sun Java Web Services Developer Pack (JWSDP)! Folgerung: “Alt-Systeme” können ohne Erweiterung des Source-Codes integriert werden Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 20 Implementierung der Klasse „PartnerChange“ als Web Service public class PartnerChange { public PartnerChange(){ } public String deletePartner( Partner partner ){ if ( partnerVorhanden( partner )) { deletePartnerINT ( partner ); return "Partner gelöscht"; } return "Partner nicht gefunden"; } public String changePartner( Partner partner ){ Object ref = null; if (!partnerVorhanden( partner )) { ref = legePartnerNeuAn( partner ); // nur Neuanlage } else { ref = getReference( partner ); //anhand PrimKey } changeAndSaveProperties( ref , partner ); //Übertrage neue Werte } return "Erfolgreiche Änderung"; Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 21 Paketierung der Klassen des Service Die resultierenden Klassen werden compiliert und in ein spezielles Archiv (.aar) gepackt - - Packen nach ZIP, dann Unbennenung Tools (z.B. Eclipse, AXIS2-Wizard-Service-Generator unter http://archive.apache.org/dist/ws/axis2/tools/1_4/ Aufbau des Archivs: - PartnerChangeService.aar de service PartnerChange.class Partner.class ... lib META-INF services.xml Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Spezifische Klassen (POJO!) und Libraries für den Service Spezieller Deployment Deskriptor zur weiteren Definition des Service Folie 22 Der Deployment Decriptor services.xml Der Deployment Descriptor „services.xml“ konfiguriert den Web Service für das eigentliche Deployment (Installation) Aufgaben: - - - Identifikation der relevanten Operationen Zuordnung des Kommunikationsstils (RPC, Document) Zuordnung von Modulen Aufbau: <service> <description>PartnerChangeService</description> <parameter name = „PartnerChange“> de.service.PartnerChange </parameter> <operator name=„deletePartner“> <messageReceiver class=„org.apache.axis2.rpc.receivers.RPCMessageReceiver“ /> <operation> .... // weitere Operationen </service> Deployment descriptor „services.xml“ Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 23 Das Administrator-Interface AXIS2 bietet ein Web-basiertes Frontend zum Hochladen, Löschen und zur Statuskontrolle (Administration) von Services an. Link: http://<yourhost>8080/axis2/axis2-admin/ Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 24 Hot Deployment und Hot Update von Services Die hochgeladenen Services werden unter <webapps>/axis2/WEB-INF/ services hochgeladen Module (Handler) werden unter <webapps>/axis2/WEB-INF/modules hochgeladen (Format *.mar) Manuelles Hochladen in das Directory ist auch möglich AXIS2 unterstützt das Hot Deployment von Web Services, d.h. der Service steht nach der Kopie in das WEB-INF Verzeichnis unmittelbar zur Verfügung ohne den AXIS2-Server neu zu starten Support auch vom Hot Update: - - - Änderung eines einzelnen, bereits im Betrieb befindenden Web Service zur Laufzeit Beispiel: Änderung der Zuordnung einer Klasse zu einem Service (Änderung der services.xml Datei) Änderung werden ohne Neustart des Servers übernommen Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 25 WSDL2Java und Java2WSDL AXIS2 stellt zwei wichtige Tools zur Entwicklung bereit - WSDL2Java - Aus einer Java-Klasse wird eine WSDL-Datei erzeugt Kommandozeilen-Befehle - Aus einer gegebenen WSDL-Datei werden die Stub-Klassen für einen Javabasierten Client und (optional) für den Server entwickelt Java2WSDL - Verfügbar nur in der Standard Binary Edition Verfügbar für Windows und UNIX, sehr gut implementiert Tool-Support für Eclipse - - AXIS2-Wizard-Code-Generator (recht „bugy“) http://archive.apache.org/dist/ws/axis2/tools/1_4/ Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 26 Stub-Generierung mit WSDL2Java Mit dem Tool WSDL2Java können aus einer WSDL-Beschreibung eines Web Service die für den Client relevanten Stub-Klassen erzeugt werden Befehl: - wsdl2java –uri http://localhost/axis2/services/PartnerChangeService?wsdl -o C:/ClientCode – p de.services.client.example - - - - Der Aufruf erzeugt den Client-Stub (= eine Java-Klasse) „PartnerChangeServiceStub“, der im Verzeichnis „C:/ClientCode“ abgelegt wird Die Klasse gehört dem Package an, das mit dem Parameter –p spezifiziert wurde Die intern gebrauchten Datentypen (hier: Partner) werden als Inner Classes zu der Stub-Klasse generiert (Auslagerung mit Parameter –u ) Für die Request-Nachricht und die Response wird eine eigene Klasse generiert Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 27 Implementierung des Service Consumers basierend auf generierten Stubs package de.services.client.example; import java.rmi.RemoteException; import import import import import org.apache.axis2.AxisFault; org.apache.ws.axis2.*; org.apache.ws.axis2.MyServiceStub.ChangePartner; org.apache.ws.axis2.MyServiceStub.ChangePartnerResponse; org.apache.ws.axis2.MyServiceStub.Partner; public class Client { public static void main ( String [] args ) throws RemoteException { MyServiceStub stub = new MyServiceStub("http://localhost:8080/axis2/services/PartnerChangeService"); // Request erzeugen ChangePartner partnerRequest = new ChangePartner(); Partner partner = new Partner(); partner.setName("Maier"); partnerRequest.setPartner( partner ); //Service aufrufen und Ergebnis aus Response holen ChangePartnerResponse response = stub.changePartner(partnerRequest); String antwort = response.get_return(); System.out.println("Ergebnis der Änderung: " + antwort); }} Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 28 Service Consumer ohne Code-Generierung Der Client zum Aufruf eines Web Service lässt sich auch ohne CodeGenerierung implementieren. Zentrale Klassen, die benötigt werden (bei der Codegenerierung weitesgehend gekapselt durch die „Stub“-Klasse): Klasse (aus Package Bedeutung org.apache.axis2.client) ServiceClient Kapselung von Methoden zur Interaktion auf einen Web Service, ggf. mit weiteren Options noch weiter konfiguriert; Setzen von HeaderInformationen Options Konfigurationsdaten für den Aufruf eines Web Service (z.B. Kommunikationsmuster, Übernahme der EndpointReference) EndpointReference Endpunkt und Ziel-Adresse des Web Service RPCServiceClient Spezieller Client für den RPC-Kommunikationsstil Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 29 AXIOM als Basis für XML-Nachrichten AXIS2 verwendet das Framework AXIOM zur Erzeugung und Interpretation von XML-Nachrichten XML-Nachrichten werden zwischen einem Service-Client und einem Web Service ausgetauscht Zentrale Klassen: Klassen Bedeutung org.apacheaxiom.om.OMElement Kapselung eines XML-Dokuments. Übergabe an Web Service (Request) und Rückgabe nach Verarbeitung an den ServiceClient (Response) org.apache.axis2.databin ding.utils.BeanUtil Operationsparameter (RPC-Style) werden hier umgewandelt in ein XML-Dokument (OMElement) Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 30 Aufruf eines Web Service mit ServiceClient public void sendRequest() throws AxisFault{ // Service-Client mit Optionen und Endpoint referenzieren ServiceClient sender = new ServiceClient(); Options options = sender.getOptions(); EndpointReference targetEPR = new EndpointReference("http://localhost:8080/axis2/services/PartnerChangeService"); options.setTo( targetEPR ); // Selektiere die Operation "deletePartner" in ein XML-Fragment QName deletePartner = new QName("Link to XML-Schema" , "deletePartner" ); //Parameter für die Operation "deletePartner“ übergeben Partner partner = new Partner(); // Üergabe der Werte ... Object[] opArgs = new Object[] { partner }; // OMElement mit der RequestNachricht erzeugen OMElement request = BeanUtil.getOMElement(deletePartner, opArgs, null, false, null); //Request an Web Service schicken (synchron, IN-OUT bzw. Request-Response) OMElement response = sender.sendReceive( request ); // diese Datentypen sollen zurückgeliefert werden Class[] returnTypes = new Class[] { String.class }; //Antwort mit BeanUtil zu deserialisieren Object[] result = BeanUtil.deserialize( response, returnTypes, null); //Ermittlung des String String antwort = (String) result[0]; } Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 31 Aufruf eines Web Service mit RPCServiceClient public void sendRequestRPC() throws AxisFault{ RPCServiceClient sender = new RPCServiceClient(); Options options = sender.getOptions(); EndpointReference targetEPR = new EndpointReference("http://localhost:8080/axis2/services/PartnerChangeService"); options.setTo( targetEPR ); // Selektiere die Operation "deletePartner" in ein XML-Fragment QName deletePartner = new QName("Link to XML-Schema" , "deletePartner" ); //Parameter für die Operation "deletePartner“ übergeben Partner partner = new Partner(); // Übergabe der Werte ... Object[] opArgs = new Object[] { partner }; // diese Datentypen sollen zurückgeliefert werden Class[] returnTypes = new Class[] { String.class }; //Request an Web Service schicken (synchron, IN-OUT bzw. Request-Response) Object[] response = sender.invokeBlocking( deletePartner ,opArgs, returnTypes ); //Ermittlung des String String antwort = (String) response[0]; } Vorteil: - - Kapselung der Erzeugung des OMElement-Objekt Kürzerer Source Code Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 32 Weitere Infos zum ServiceClient Ein ServiceClient benötigt immer eine Laufzeitumgebung von AXIS2, um Requests verschicken und empfangen zu können Die Laufzeitumgebung wird repräsentiert durch ein Objekt der Klasse ConfigurationContext, das über sämtliche Informationen der Laufzeitumbeung verfügt - Weitere Services - Installierte Module Ist der Service in einem Server eingebettet, so wird der ConfigurationContext des Servers übernommen Ist der ServiceClient nicht in einem Server (z.B. Tomcat) eingebunden, so wird eine Default-Konfiguration aus dem Kernel erzeugt (axis2-kernel.jar) erzeugt Über die Methode „addHeader( OMElement header ) kann ein SOAP-Header explizit hinzugefügt werden. Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 33 Aufbau dieser Veranstaltung Kapitel 5: Einführung in Web Services, Teil 2 1 2 Überblick über AXIS2 3 Aufrufmuster in AXIS2 (inkl. WS-Addressing) 4 Bewertung von AXIS2 5 Zusammenfassung und Ausblick Service-Entwicklung mit AXIS2 Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 34 Synchrone und asynchrone Aufrufmuster AXIS2 bietet die Möglichkeit, Nachrichten synchron sowie asynchron zu verschicken (Erweiterung gegenüber AXIS1.x) - Unterscheidung (API-Level-Asynchronität) - - Aufrufmuster (Message Exchange Patterns) Synchron (Blockierendes API): Service Consumer wartet nach Absetzen des Service-Aufrufs auf die Antwort und bleibt während der Wartezeit blockiert Asynchron (Nicht-blockierendes API): Service Consumer kann nach Absetzen des Service-Aufrufs weiter operieren, Rückgabe über Callback-Handler Konform zu unseren Entwurfsprinzipien für eine SOA (siehe Kapitel 2/3) - - Asynchronität sorgt für eine lose Kopplung zwischen Service Consumer und Provider des Web Service Service Consumer kann auch z.B. beim Ausfall des Service Provider weiter operieren Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 35 Transport-Level-Asynchronität Weitere Unterscheidung bei AXIS2: Transport-Level-Asynchronität - Probleme beim Standard-Transportprotokoll HTTP: - - - Anzahl der notwendigen Verbindungen während des Service-Aufrufs zwischen dem Consumer und dem Provider Typisches Zwei-Wege-Protokoll: per Default wird dieselbe Verbindung für den Transport eines Requests und der zugehörigen Response (+ Empfangsbestätigungen) verwendet Probleme bei sehr langläufigen Transaktionen: möglicher Time-Out beim Service Consumer Service Consumer könnte Response nicht mehr empfangen Time-Out kann verlängert werden Nicht immer praktikabel, da u.U. hoher Ressourcenverbrauch Ansatz bei AXIS2 - Etablierung von zwei unterschiedlichen Verbindungen für den Transport von Request und Response Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 36 Übersicht der möglichen Aufrufmuster Durch die Kombination von API-Auswahl und Anzahl der eingesetzten Verbindungen ergeben sich vier Aufrufmuster: AXIS2 unterstützt über die Klasse ServiceClient alle Aufrufmuster API Anzahl der Verbindungen Beschreibung Blockierendes API 1 Synchroner Aufruf des Web Service, Aufruf z.B. über HTTP Nicht-blockierendes API 1 Asynchroner Aufruf des Web Service, Einsatz von CallbackHandler, Aufruf z.B. über HTTP Blockierendes API 2 Synchroner Aufruf des Web Service, Aufruf z.B. über SMTP (selten eingesetzt), oder HTTP (neuer HTTP-Prozess) Nicht-blockierendes API 2 Asynchroner Aufruf des Web Service, , Aufruf z.B. über SMTP (selten eingesetzt), oder HTTP (neuer HTTP-Prozess) Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 37 Request-Response mit blockierenden API – eine Verbindung <<Service Consumer>> ServiceClient (Klasse von AXIS2) Request Response H T T P <<Service Provider >> RPCServiceClient sender = new RPCServiceClient(); Options options = sender.getOptions(); EndpointReference targetEPR = new EndpointReference(...); options.setTo( targetEPR ); //Request an Web Service schicken (synchron, IN-OUT bzw. Request-Response) Object[] response = sender.invokeBlocking( deletePartner ,opArgs, returnTypes ); //Alternative: SendReceive, Rückgabe ist ein XML-Document OMElement requestPayload = createRequestPayload(); //Erzeugung des Request-Docs OMElement responsePayload = sender.sendReceive(requestPayload); Nachteil: Antwortzeit kann sehr lange dauern, ServiceClient wird geblockt Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 38 Request-Response mit nicht-blockierenden API – eine Verbindung <<Service Consumer>> ServiceClient (Klasse von AXIS2) Callback-Handler Request Response H T T P <<Service Provider >> org.apache.axis2.client.async.Callback callback = new org...Callback(){ public void onComplete(AsyncResult result) { // Analyse des SOAP-Bodies Object obj1 =result.getResponseEnvelope().getBody(); //Analyse des SOAP-Headers Object obj2 = result.getResponseEnvelope().getHeader(); } } public void onError(Exception result) { // ... } sender.sendReceiveNonBlocking(requestPayload, callback); Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 39 Request-Response mit nicht-blockierenden API – zwei Verbindungen Request <<Service Consumer>> ServiceClient (Klasse von AXIS2) Transport Sender ACK Response Callback-Handler Client-Side Server ACK <<Service Provider >> H T T P ServiceClient sender = new ServiceClient(); Options options = sender.getOptions(); // Client-seitige Integration des Modules "WS-Adressing" sender.engageModule( new QName( Constants.MODULE_ADDRESSING)); // Erzeugung eines separaten Serverprozesses options.setUseSeparateListener(true); // Payload erzeugen.. // Request verschicken mit Referenz auf Callback sender.sendReceiveNonBlocking(requestPayload, callback); Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 40 WS-Adressing Das WS-Adressing Module erlaubt die Spezifikation von getrennten Adressangaben innerhalb einer SOAP-Nachricht für die flexible Interaktion zwischen Service Konsumenten und Service Providern Basiert auf einer Spezifikation von W3C (2006) Geeignet für Zwei-Wege Aufrufmuster (siehe letzte Folien) Verwendung von unterschiedlichen Transport-Protokollen innerhalb einer Request-Response Sequenz Informationen werden im SOAP Header eingefügt Wichtige Informationen: - - - - - - To: An welchen Endpunkt soll die Nachricht versendet werden? From: Welches ist die Adresse des Absenders ReplyTo: An welchen Endpunkt soll die Response geschickt werden? FaultTo: An welchen Endpunkt sollen Fehlermeldungen geschickt werden? MessageID: Zu welchem Callback-Handler bezieht sich die Request (vom Service Client oder Consumer definiert) RelatesTo: Zu welchem Callback-Handler bezieht sich die Request (vom Service Provider gesetzt, i.d.R. aus MessageID) Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 41 Beispiel-Request mit WS-Addressing POST /axis2/services/PartnerChangeService Host: myserver.de ... <soapenv:Envelope>.... <soapenv:Header> <wsa:To> <wsa:Address> http://myserver.com/axis2/services//PartnerChangeService </wsa:Address> </wsa:To> <wsa:ReplyTo> <wsa:Address> http://anotherserver.com/axis2/services/anonService83833993211/output </wsa:Address> </wsa:ReplyTo> <wsa:MessageID> urn:uuid:F4f8fdjkd9c99d </wsa:MessageID> .... </soapenv:Envelope> Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 42 Einweg-Aufruf mit nicht blockierendem API <<Service Consumer>> ServiceClient (Klasse von AXIS2) Request ACK H T T P <<Service Provider >> ServiceClient sender = new ServiceClient(); Options options = sender.getOptions(); // Payload erzeugen.. // Request verschicken ohne Rückgabewerte oder Callback sender.fireAndFortget( requestPayload ); Server liefert einen HTTP-Reponse mit Status-Code 202 („Accepted“) Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 43 Aufbau dieser Veranstaltung Kapitel 5: Einführung in Web Services, Teil 2 1 2 3 Überblick über AXIS2 Service-Entwicklung mit AXIS2 Aufrufmuster in AXIS2 (inkl. WS-Addressing) 4 Bewertung von AXIS2 5 Zusammenfassung und Ausblick Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 44 Diskussion Service Schnitt Referenzfreiheit ist immer gegeben - Grobe Granularität - - - Abhängig von der Entwicklung der Service-Schnittstellen In einer Service-Klasse können auch private Methoden definiert werden, somit ist eine Basis für Redundanzfreiheit gegeben Session-Kontext - - Abhängig von der Entwicklung der Service-Schnittstellen Redundanzfreiheit - Implementierung von eher feingranularen Services bei AXIS2 üblich Grobgranular durch workflow-basierte Laufzeitumgebungen Normalform - Aufrufe werden immer per Kopie durchgeführt (Call-By-Value) Abhängig von der Entwicklung der Service-Schnittstellen und –Implementierung Session-Kontext kann über Header mitgeliefert werden Technische Neutralität - Gegeben durch die Verwendung von Standards wie WSDL, WS-Adressing Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 45 Anpassbarkeit AXIS2 garantiert eine hohe Anpassbarkeit einer service-orientierten Architektur durch das „explizit machen“ der Architektur der Laufzeitumgebung - Handler-Konzept - Module-Konzept - Hot Deployment von neuen Services - Hot Update von laufenden Services Anpassbarkeit von Verbindungen zwischen Services: - - - Abhängigkeiten zwischen Web Services können in AXIS2 nicht realisiert und angepasst werden Nachbildung eventuell über Handler-Konzept möglich, aber umständlich Verbesserung erst durch BPEL Keine Adaptivität, keine Tailorabilität Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 46 Performanz Erreicht durch besseres XML-Parsing durch das Framework AXIOM XML-Dokument wird nie zu Ende geparst, nur bis der Ziel-Code erreicht - Verbesserte Serialsierung und De-Serialisierung von XML-Dokumenten Alternative DOM: Nachricht wird komplett in eine objekt-orientierte Struktur umgewandelt, hoher Ressourcenverbrauch Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 47 Skalierbarkeit Durch die flexible Adressierung und durch das Händler-Konzept sind die Verbindungen nicht starr Anfragen sondern können unter Umständen (z.B. hohe Client oder ServerAuslastung) umgeleitet oder priorisiert werden AXIS2 ist leichtgewichtig, daher ist das Klonen einer AXIS2 Instanz recht einfach Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 48 Loose Coupling und Sicherheit Durch verschiedene Aufrufmuster wird eine lose Kopplung zwischen Service Consumer und Provider erreicht Kein Enterprise Service Bus realisiert - Würde die lose Kopplung noch verringern Sicherheit - Wird durch das Modul „WS-Security“ erreicht, Vorstellung und Diskussion erfolgt später... Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 49 Aufbau dieser Veranstaltung Kapitel 5: Einführung in Web Services, Teil 2 1 2 3 4 5 Überblick über AXIS2 Service-Entwicklung mit AXIS2 Aufrufmuster in AXIS2 (inkl. WS-Addressing) Bewertung von AXIS2 Zusammenfassung und Ausblick Prof. Dr. Sascha Alda, Hochschule Bonn-Rhein-Sieg, FB Informatik. c/o 2010 Folie 50