2.5 RMI-Übung Übung: Schreiben Sie ein RMI-Serverobjekt, das eine Funktion String hello(String name) { return "Hello " + name; } anbietet. Es bekommt als Übergabeparameter einen Namen mitgegeben und liefert einen String der Form "Hello Name", wobei name durch den übergebenen Namen ersetzt wird. Tipp: Verwenden Sie das vorhandene RMI-Beispiel als Vorlage 02.04.2007 Prof. Dr. Thomas Specht: Verteilte Systeme 156 → 2.5 Lösung zur RMI-Übung: Remote-Interface import java.rmi.*; public interface HelloRemote extends Remote { String hello(String name) throws RemoteException; } 02.04.2007 Prof. Dr. Thomas Specht: Verteilte Systeme 157 → 2.5 Lösung zur RMI-Übung: Dienstnutzer (Client) import java.rmi.*; public class HelloClient { public static void main(String args[]) { if (System.getSecurityManager() == null) System.setSecurityManager(new RMISecurityManager()); try { String name = "//" + args[0] + "/Hello"; HelloRemote helloRemote = (HelloRemote) Naming.lookup(name); String outputString = (helloRemote.hello(args[1])); System.out.println(outputString); } catch (Exception e) { System.err.println("Hello exception: " + e.getMessage()); e.printStackTrace(); } } } 02.04.2007 Prof. Dr. Thomas Specht: Verteilte Systeme 158 → 2.5 Lösung zur RMI-Übung: Diensterbringer (Serverobjekt) import java.rmi.*; import java.rmi.server.*; public class HalloEngine extends UnicastRemoteObject implements Hallo { public HalloEngine() throws RemoteException { super(); } public String hallo(String name) { return "Hallo " + name; } } 02.04.2007 Prof. Dr. Thomas Specht: Verteilte Systeme 159 → 2.5 RMI-Übung: Lösung : Startup-Code für das Serverobjekt import java.rmi.*; public class HelloServerStartup { public static void main(String[] args) { if (System.getSecurityManager() == null) System.setSecurityManager(new RMISecurityManager()); String name = "//" + args[0] + "/Hello"; try { HelloServer helloServer = new HelloServer(); Naming.rebind(name, helloServer); System.out.println("HelloServer bound"); } catch (Exception e) { System.err.println("HalloServer exception: " + e.getMessage()); e.printStackTrace(); } } } 02.04.2007 Prof. Dr. Thomas Specht: Verteilte Systeme 160 → 2.5 RMI-Beispiel: Übersetzen und Starten Übersetzen: • javac HelloServer.java • rmic HelloServer • javac HelloServerStartup.java • javac HelloClient.java // Server übersetzen // Stubs und Skeletons aus dem Remote Interface erzeugen // Startup-Code für das Server-Objekt übersetzen // Client übersetzen Starten der RMIRegistry (Naming Service des RMI) • rmiregistry // Muss auf dem Rechner mit dem Serverobjekt laufen! Starten des Servers: • java -Djava.rmi.server.codebase=file:/c:\Kurse\VerteilteSysteme\Beispiele\RMIHello\ -Djava.security.policy=java.policy HelloServerStartup localhost Name des Name des Rechners mit policy-Files der RMIRegistry Starten des Clients: • java -Djava.security.policy=java.policy HelloClient localhost Thomas Name des Rechners mit der RMIRegistry 02.04.2007 Prof. Dr. Thomas Specht: Verteilte Systeme Name 161 → 2. Verteilte Softwaresysteme 2.1 2.2 2.3 2.4 2.5 2.6 2.7 02.04.2007 Grundlagen verteilter Softwaresysteme Kommunikation über TCP/IP-Sockets Grundlagen des entfernten Methodenaufrufs Basisdienste in verteilten Softwaresystemen Remote Method Invocation (RMI) CORBA SOAP / WSDL Prof. Dr. Thomas Specht: Verteilte Systeme 162 2.6 Übersicht zu den CORBA-Packages (1/2) org.omg OMG-Features (insbesondere CORBA) org.omg.CORBA CORBA-Schnittstelle im JDK org.omg.CORBA.ORBPackage org.omg.CORBA.portable Klassen für ORB-unabhängige ORB-Zugriffe org.omg.CORBA.TypeCodePackage org.omg.CORBA_2_3 Erweiterungen von CORBA 2.3 org.omg.CORBA_2_3.portable Erweiterungen für ORB-unabh. ORB-Zugriffe org.omg.COSNaming Naming Service für CORBA org.omg.COSNaming.NamingContextExtPackage Erweiterungen des Naming Service org.omg.COSNaming.NamingContextPackage Exceptions für Naming Service org.omg.Dynamic org.omg.DynamicAny org.omg.DynamicAny.DynAnyFactoryPackage org.omg.DynamicAny.DynAnyPackage org.omg.IOP org.omg.IOP.CodecFactoryPackage org.omg.IOP.CodecPackage 02.04.2007 Prof. Dr. Thomas Specht: Verteilte Systeme 163 → 2.6 Übersicht zu den CORBA-Packages (2/2) org.omg.Messaging org.omg.PortableInterceptor org.omg.PortableInterceptor.ORBInitInfoPackage org.omg.PortableServer Klassen für ORB-unabhängige Server org.omg.PortableServer.CurrentPackage org.omg.PortableServer.POAManagerPackage org.omg.PortableServer.POAPackage org.omg.PortableServer.portable org.omg.PortableServer.ServantLocatorPackage org.omg.SendingContext 02.04.2007 Prof. Dr. Thomas Specht: Verteilte Systeme 164 → 2.5 CORBA im Vergleich mit anderen Middlewarestandards RMI CORBA SOAP / WSDL Objektorientiert ja ja ja Programmiersprachneutral ja ja Herstellerneutral ja ja ja Betriebssysteme alle mit JAVA VM (alle) alle Netzwerkbasisprotokolle TCP/IP TCP/IP HTTP … Protokoll RMI IIOP SOAP Interfacedefinitionssprache JAVA Interface IDL WSDL Statische Schnittstellen ja ja ja Dynamische Schnittstellen ja Synchroner Methodenaufruf ja ja ja Asynchr. Methodenaufruf (mit JMS) (ab CORBA 3) (ja) Performance gut sehr gut weniger gut Name Service RMI Registry CORBA NameService DNS Einlernaufwand Kompatibilität der Produkte Im JDK enthalten 02.04.2007 mittel hoch ab JDK 1.1 hoch mittel ab JDK 1.2 Prof. Dr. Thomas Specht: Verteilte Systeme mittel (mittel) ab JDK 1.6 165 → 2.6 Object Management Group (OMG) Object Management Group (OMG) • Gründung: 1989 • Heute: Über 800 Mitglieder (alle nennenswerten Softwarefirmen außer Microsoft) • Rolle: Spezifikations- und Standardisierungsgremium für die Softwareindustrie • herstellerneutral • plattformneutral • möglichst programmiersprachneutral • von der Softwareindustrie mitgetragen und anerkannt • technisch exzellente Ergebnisse • KEINE eigenen Produkte und Implementierungen →Softwarehersteller setzen Spezifikationen der OMG in Produkte um Wichtige Arbeitsfelder der OMG: • CORBA (Common Object Request Broker Architecture) • Objektorientierter verteilter Framework (d.h. Infrastruktur für verteilte Objekte) • Object Management Architecture (OMA) • programmiersprach-, plattform- und herstellerneutral • UML (Unified Modeling Language) • Objektorientierte Software-Modellierungssprache • MDA (Model Driven Architecture) • Modellgetriebene Softwareentwicklung 02.04.2007 Prof. Dr. Thomas Specht: Verteilte Systeme 166 → 2.6 OMA (Object Management Architecture) Application Objects Common Facilities Business Objects / Domain Services Object Request Broker (ORB) Corba Object Services • • • • ORB (Object Request Broker): Kommunikationsinfrastruktur für verteilte Objekte Application Objects: Anwendungslogik (d.h. selbst programmierte Objekte) Common Facilities: Normierte Standardobjekte, z.B. für mobile Agenten Business Objects (Domain Services): Teillösungen und Frameworks für spezielle Branchen, z.B. Manufacturing, Transportation, Finance, Healthcare, Telecom, Electronic Commerce • CORBA Object Services (COS): Gemeinsame Dienste, z.B. Naming Service, Event Service 02.04.2007 Prof. Dr. Thomas Specht: Verteilte Systeme 167 → 2.6 CORBA (Common Object Request Broker Architecture) Dienstnutzer Anwendungsebene Objekt a RemoteInterface Methodenaufruf Stub Middlewareebene ORB Hardwareebene Objekt b Skeleton IIOP-Verbindung Socket Protokollebene Diensterbringer ORB Socket TCP/IP TCP/IP TCP/IP-Verbindung Hardware- schnittstelle Hardware- schnittstelle Ethernet Netzwerkkabel / Funkverbindung Ethernet • CORBA (Common Object Request Broker Architecture) • Remote-Methodenaufruf beliebiger Objekte auf fremden Rechnern (programmiersprach- und plattformneutral) • Beschreibung der Remote-Schnittstelle als IDL (Interface Definition Language) Interface • Name Service: CORBA Name Service 02.04.2007 Prof. Dr. Thomas Specht: Verteilte Systeme 168 → 2.5 Statischer Methodenaufruf über CORBA Dienstnutzer b = ncRef.resolve(path)); name = b.getName(index) RemoteInterface (IDL) 1 2 Objekt a (Dienstnutzer) Diensterbringer class B { String getName(int index) { return names[index] 6 } } Objekt b (Diensterbringer) 5 9 Stub 8 02.04.2007 Object Adapter 3 4 ORB (Object Request Broker) 7 Skeleton 4 IIOP TCP/IP 8 ORB (Object Request Broker) Prof. Dr. Thomas Specht: Verteilte Systeme 169 → 2.6 Ablauf eines statischen Methodenaufrufs über CORBA Ablauf eines statischen Methodenaufrufs: 1. Dienstnutzer erfragt Referenz auf Diensterbringer beim CORBA Name Service 2. Dienstnutzer ruft Methode des Diensterbringers auf 3. Stub übergibt den Methodenaufruf dem ORB 4. ORB und Object Adapter leitet Methodenaufruf zum Diensterbringerobjekt weiter 5. Skeleton des Diensterbringers ruft gewünschte Methode auf 6. Diensterbringerobjekt führt gewünschte Methode aus und gibt Ergebnis zurück 7. Ergebnis wird vom Skeleton und Object Adapter an ORB weitergegeben 8. ORB leitet das Ergebnis zum Aufrufer 9. Ergebnis wird dem Aufrufer übergeben Der Dienstnutzer bekommt also den Eindruck vermittelt, als ob es sich um einen Methodenaufruf eines lokalen Objektes gehandelt hätte! 02.04.2007 Prof. Dr. Thomas Specht: Verteilte Systeme 170 → 2.6 Object Request Broker (ORB) ORB (Object Request Broker) • Kommunikations- und Nachrichtentransportinfrastruktur für verteilte Objekte • Jeder beteiligte Rechner (egal ob Dienstnutzer oder Diensterbringer) benötigt einen ORB • ORBs unterschiedlicher Rechner und Hersteller kommunizieren untereinander über IIOP • Arbeitet als Forwarding Broker: • Leitet entfernten Methodenaufruf vom Dienstnutzer zum Diensterbringer weiter • Gibt das Ergebnis des Diensterbringers an den Dienstnutzer zurück • Kernbestandteil jeder CORBA-Implementierung IIOP (Internet Inter-ORB-Protocol) • Normiertes Protokoll zwischen ORBs auch unterschiedlicher Hersteller und Plattformen • Setzt auf TCP/IP auf →kompatibel mit gängigen Internet-Standards →über beliebige Netzwerke (z.B. Ethernet, WLAN, DSL …) mit TCP/IP • Ermöglicht den Mischeinsatz von ORBs unterschiedlicher Hersteller • Standard-Kommunikationsprotokoll zwischen ORBs verschiedener Rechner und Hersteller 02.04.2007 Prof. Dr. Thomas Specht: Verteilte Systeme 171 → 2.6 Object Adapter (OA) Object Adapter: • Verbindungsglied zwischen Diensterbringerobjekt bzw. Skeleton mit dem ORB • Basic Object Adapter (BOA) • Nicht genau genug spezifiziert →BOA-Schnittstelle ist hersteller- und ORB-abhängig →Eingeschränkte Austauschbarkeit des ORBs • Veraltet, sollte nicht mehr benutzt werden • Portable Object Adapter (POA) • CORBA 3-Feature (also nachträgliche Ergänzung des CORBA-Standards) • Genau spezifiziert →Herstellerunabhängig →Austauschbarkeit des ORBs ist gewährleistet • Aktueller Stand der Technik • Empfehlungen • Grundsätzlich nur noch POA benutzen • CORBA-Produkte, die nur BOA unterstützen, sind veraltet 02.04.2007 Prof. Dr. Thomas Specht: Verteilte Systeme 172 → 2.6 Vorgehensweise für statische Methodenaufrufe 1 Remote Interface in IDL erstellen 2 Precompiler (z.B. IdlToJava) Stubs (auf Clientseite) 3 Codieren des Clients 5 Stubs 7 Compiler Clientcode Linker Client Dienstnutzer 02.04.2007 Skeletons (auf Serverseite) 4 Codieren des Servers 6 Compiler Servercode Skeletons Linker 8 Server Diensterbringer Prof. Dr. Thomas Specht: Verteilte Systeme 173 → 2.6 Vorgehensweise für statische Methodenaufrufe 1. Remote-Interface in IDL erstellen 2. Precompiler erzeugt Stubs für Dienstnutzer und Skeletons für Diensterbringer 3. Manuelles Codieren des Dienstnutzers unter Nutzung der Stubs 4. Manuelles Codieren des Diensterbringers unter Nutzung des Skeletons 5. Konventionelles Compilieren des Dienstnutzers 6. Konventionelles Compilieren des Diensterbringers 7. Linken des Dienstnutzers mit den Stubs (in JAVA nicht nötig) 8. Linken des Diensterbringers mit dem Skeleton (in JAVA nicht nötig) 9. Starten des CORBA Name Service (sofern noch nicht geschehen) 10. Starten des Diensterbringers 11. Starten des Dienstnutzers 02.04.2007 Prof. Dr. Thomas Specht: Verteilte Systeme 174 →