Common Object Request Broker Architecture (CORBA) Evgueni Kouris WS 03/04 Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 1 Evolution der SoftwareAnwendungssysteme (1) Von der Monolith-Architektur zur 2-Tier-Architektur... SQL Monolith Fat-Clients Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris Datenbank-Server 2 Evolution der SoftwareAnwendungssysteme (2) ... zur 3- oder n-Tier-Architektur ... SQL SQL Thin-Clients Server-Logik Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris Datenbank-Server 3 Evolution der SoftwareAnwendungssysteme (3) ... zur heterogenen n-Tier-Architektur auf Middleware-Basis. Middleware Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 4 Gliederung: Basics von CORBA OMA, ORB, IDL, Stubs, Skeletons, etc. Entwicklung einer CORBA-Applikation in Java/C++ CORBA Services Einige nützliche Features von CORBA DII, IIOP, IOR, etc. Neurungen in CORBA 3.0 Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 5 Object Management Architecture (1) Application Objects Vertical CORBA Facilities Horizontal CORBA Facilities Object Request Broker (ORB) CORBA Services Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 6 Object Management Architecture (2) CORBA – genauere Spezifikation von ORB Weitere vier Anwendungs-Komponenten: CORBA Services – generelle, systemnahe Erweiterung von Grundfunktionalität eines ORBs (z.B. Transactions, Security) Horizontal CORBA Facilities – komplette höhere DomainUnabhängige Funktionen (z.B. Printing, Internalization) Vertical CORBA Facilities – Teillösungen für bestimmte Anwendungsgebiete (z.B. Finanzen oder Medizin) Application Objects – angepasste, konkrete Lösungen Vertical enstprechen den Einzelprogrammen werden nicht standardisiert Application Objects CORBA Facilities Horizontal CORBA Facilities Object Request Broker (ORB) CORBA Services Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 7 Applikationen in CORBA Applikationen als „Objekte“ Diskrete Softwarebausteine oder Module Zustand + Methoden OO Abstraktion der einzelnen Anwendungen Instantiierung Overloading, Subtyping (auch mehrfach) Kapselung (Trennung der Implementierung und der Schnittstelle) Sprachen der Applikationen in CORBA Java, C, C++, Cobol, Ada, Smalltalk, List, Python Ist eine Schnittstellensprache erforderlich? Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 8 Interface Definition Language (IDL) Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 9 Interface Definition Language (IDL) Stellt eine Obermenge der Sprachkonzepte dar Unterstützte Sprachen: Java, C, C++, Cobol, Ada, Smalltalk, List, Python Objekt Verwendet C++/Java-ähnliche Syntax Vorteile einer selbständigen Schnittstellen-Sprache rein deskriptiv vollkommene Trennung von der Implementierung mehrere Implementierung pro IDL-Interfaces und umgekehrt möglich automatische Generierung der Interfaces für alle Sprachen Sicherstellung der Interface-Gleichheit bei allen Clients/Objekten Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 10 Beispiel für eine IDL-Schnittstelle module MeineBank { exception BankFehler { string info; }; interface BasisKonto { readonly attribute long nummer; double einzahlen ( in double betrag ) raises ( BankFehler ); }; // GiroKonto wird von BasisKonto abgeleitet interface GiroKonto : BasisKonto { double attribute dispoKredit; }; interface SparKonto : BasisKonto { double attribute zinssatz; }; // GiroSparKonto wird von SparKonto und GiroKonto abgeleitet interface GiroSparKonto : SparKonto, GiroKonto {}; }; Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 11 IDL-Datentypen Basis Datentyp Beschreibung Java-Mapping C++-Mapping short 16 bit Integer short CORBA::Short long 32 bit Integer int CORBA::Long long long 64 bit Integer long CORBA::LongLong unsigned short 16 bit vorzeichenlos short CORBA::UShort unsigned long 32 bit vorzeichenlos int CORBA::ULong unsigned long long 64 bit vorzeichenlos long CORBA::ULongLong float 16 bit IEEE Gleitkomma float CORBA::Float double 32 bit IEEE Gleitkomma double CORBA::Double long double 64 bit IEEE Gleitkomma double CORBA::LongDouble char 8 bit Zeichen char CORBA::Char wchar 16 bit Zeichen (Unicode) char CORBA::WChar boolean TRUE oder FALSE boolean CORBA::Boolean octet einzelnes Byte byte CORBA::Octet string Zeichenkette java.lang.String CORBA::String wstring Zeichenkette (Unicode) java.lang.String CORBA::WString any Container für einen beliebigen Datentyp Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris ? CORBA::Any 12 Selbst-definierte IDL-Datentypen Unterstützung für typedef enum const struct union arrays exception Auch für Precompiler-Anweisungen #include #define Quelle: Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris „An intoducation to CORBA“ von Paul Jonusaitus 13 Client/Server Kommunikation CORBA - Clients kommunizieren über die IDL-Schnittstelle des Objekts senden „Requests“ oder „Invocations“ ORB - Kommunikationsbus vollkommen Transparent, d.h. unabhängig von der Residenz des Objektes unabhängig von der Programmiersprache des Objektes Idealfall: Clients wissen gar nicht, dass CORBA verwendet wird! CORBA - Server stellen Applikation- bzw Objekt-Implementierungen dar müssen nicht „heavyweight“ sein (z.B. Java-Applet) Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 14 Was steckt hinter einem Methodenaufruf? Proxy-Patterns: werden aus IDL-Schnittstelle automatisch generiert Stub: Server-Proxy Skeleton: Client-Proxy Client return value operation() + args Objekt Language mapping operations signature Language mapping entry points Stub Skeleton ORB Operations Laufzeitumgebung, (re)aktiviert Objekte Portable Object Adapter Object Request Broker Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris Quelle: „An intoducation to CORBA“ von Paul Jonusaitus 15 Entwicklung einer Client/Server Anwendung mit CORBA Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 16 Entwicklungs-Schema IDL-Definition IDL-Compiler Client Programm Source Stub Source Skeleton Source Objekt Implementierung Source Java/C++ Compiler Java/C++ Compiler Client-Programm Objekt-Implementierung Quelle: Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris „An intoducation to CORBA“ von Paul Jonusaitus 17 IDL-Schnittstelle Zuerst wird die Schnittstelle in OMG-IDL definiert: //Hello.idl interface Hello{ void say_hello(); }; l Man bekommt die Übersetzung der Schnittstelle in C++ und Java durch die Aufrufe von: u IDL-to-C++ translator · Hello.h, Hello.cpp, Hello_skel.h, Hello_skel.cpp u IDL-to-Java translator · Hello.java, HelloHelper.java, HelloHolder.java, HelloOperations.java, HelloPOA.java, _HelloStub.java Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 18 Hello-Objekt in C++ Die Header-Datei des Objektes in C++: (Hello_impl.h) #include “Hello_skel.h” class Hello_impl : public POA_Hello { public: virtual void say_hello() throw(CORBA::SystemException); }; Die Implementierung der Header-Datei: (Hello_impl.cpp) #include <iostream.h> #include <OB/CORBA.h> #include “Hello_impl.h” void Hello_impl::say_hello() throw(CORBA::SystemException){ cout << "Hello World!" << endl; } Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 19 Server-Programm in C++ #include <OB/CORBA.h> #include <Hello_impl.h> #include <fstream.h> POA öffnen int main ( int argc, char* argv[] ){ try { CORBA::ORB_var orb = CORBA::ORB_init ( argc, argv ); CORBA::Object_var poaObj = orb -> resolve_initial_references("RootPOA"); PortableServer::POA_var rootPoa = PortableServer::POA::_narrow(poaObj); PortableServer::POAManager_var manager = rootPoa -> the_POAManager(); Hello_impl* helloImpl = new Hello_impl(); Hello_var hello = helloImpl -> _this(); CORBA::String_var s = orb -> object_to_string(hello); const char* refFile = "Hello.ref"; ofstream out(refFile); out << s << endl; out.close(); POA aktivieren, ORBReferenz starten einer (warten auf Clients) Instanz erzeugen manager -> activate(); orb -> run(); orb -> destroy(); } catch ( const CORBA::Exception& e ) { cerr << e << endl; } IOR des Objektes speichern } Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 20 Client-Programm in Java public class Client{ public static void main ( String args[] ) { java.util.Properties props = System.getProperties(); try { org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, props); org.omg.CORBA.Object obj = null; String refFile = "Hello.ref"; java.io.BufferedReader in = new java.io.BufferedReader( new java.io.FileReader(refFile)); String ref = in.readLine(); obj = orb.string_to_object(ref); Hello hello = HelloHelper.narrow(obj); IOR der Instanz auslesen hello.say_hello(); orb.destroy(); } catch ( Exception e ) { e.printStackTrace(); } Den Proxy anhand der IOR ermitteln } Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 21 Hello-Objekt in Java Man kann natürlich den Client auch in C++ und den Server auch in Java implementieren Hier z.B. die Implementierung des Hello-Objektes in Java: //Hello_impl.java public class Hello_impl extends HelloPOA { public void say_hello() { System.out.println("Hello World!"); } } Nachteil dieser Implementierungen: Referenz des Objektes erforderlich Übergabe in der Datei sehr “unschön” Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 22 CORBA Services Verteilung von Objektreferenzen Name Service – Auffinden von Objekten anhand deren Namen Trader Service – Objekte registrieren sich als Dienste Benachrichtigung über Ereignisse Event Service – übernimmt Übermittlung von Ereignissen Notification Service – Filtern von E. nach Inhalt oder Priorität Transaktionen Object Transation Service – Zuverlässigkeit bei Fehlern, sicheres Beenden von Prozessen, Wiederherstellung des Zustands Kontrolle/Sicherheit Security Service – Identität, Privilegien, Rechte, Verschlüsselung Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 23 Server in C++ mit „Name Service“ #include <OB/CORBA.h> #include <Hello_impl.h> #include <fstream.h> int main ( int argc, char* argv[] ){ try { CORBA::ORB_var orb = CORBA::ORB_init ( argc, argv ); CORBA::Object_var poaObj = orb -> resolve_initial_references("RootPOA"); PortableServer::POA_var rootPoa = PortableServer::POA::_narrow(poaObj); PortableServer::POAManager_var manager = rootPoa -> the_POAManager(); Hello_impl* helloImpl = new Hello_impl(); Hello_var hello = helloImpl -> _this(); CORBA::Object_var ns = orb -> resolve_initial_references( "NameService“ ); CosNaming::NamingContext_var nc = CosNaming::NamingContext::_narrow ( ns.in() ); CORBA::String_var s = orb -> object_to_string(hello); const char* refFile = "Hello.ref"; CosNaming::Name aName; ofstream out(refFile); aName.length(1); out << s << endl; aName[0].id = CORBA::string_dup("hello"); out.close(); aName[0].kind = CORBA::string_dup(""); nc -> bind( aName, hello.in() ); manager -> activate(); orb -> run(); orb -> destroy(); } catch ( const CORBA::Exception& e ) { cerr << e << endl; } } Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 24 Client in Java mit Name Service public class Client{ public static void main ( String args[] ) { java.util.Properties props = System.getProperties(); try { org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, props); org.omg.CORBA.Object ns = orb.resolve_initial_references ( "NameService" ); NamingContext nc = NamingContextHelper.narrow ( ns ); org.omg.CORBA.Object obj = null; String refFile = "Hello.ref"; NameComponent[] aName =innew NameComponent[1]; java.io.BufferedReader = new java.io.BufferedReader( aName[0] = new NameComponent(); new java.io.FileReader(refFile)); aName[0].id "hello"; String ref = =in.readLine(); aName[0].kind = ""; org.omg.CORBA.Object obj = nc.resolve ( aName ); obj = orb.string_to_object(ref); Hello hello hello == HelloHelper.narrow(obj); HelloHelper.narrow ( obj ); Hello hello.say_hello(); orb.destroy(); } catch ( Exception e ) { e.printStackTrace(); } } Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 25 CORBA „Schnick-Schnack“ Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 26 Ein „Dynamischer Methodenaufruf“ DII – Dynamic Invocation Interface Interface Repository: Laufzeit-Datenbank beinhaltet maschinenlesbare IDL-Interfaces Dynamic Interface Query Client Objekt Interface Repository Skeleton DII ORB Operations Portable Object Adapter Object Request Broker Quelle: Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris „An intoducation to CORBA“ von Paul Jonusaitus 27 Inter-ORB Kommunikation Erst mit CORBA 2.0 standardisiert „General Inter-ORB Protocol” (GIOP) spezifiziert ein einheitliches Kommunikationsprotokoll eine Transfersyntax (Common Data Representation, CDR) für die Übertragung von Daten über das Netz Objektreferenzenformat (Interoperable Object Reference, IOR) „Internet Inter-ORB Protocol” (IIOP) Spezifikation von GIOP für die TCP/IP-Protokoll-Familie O1 C1 ORB 1 O2 C2 GIOP Protocol Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris ORB 2 28 Interoperable Object Reference (IOR) Jedes Objekt besitzt eine weltweit eindeutige Referenz Eine IOR besteht aus: einem Objekt-Schlüssel (fixed object key) Typidentifizierung Referenz der Schnittstelle (Repository ID) einigen Profilen ( Interoperability Profiles, IOPs ) Name des Hosts TCP/IP-Port-Nummer Eine IOR kann in einen String (und zurück) umgewandelt werden persistent gemacht werden (sogar für mehrer Instanzen eines O.) Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 29 Und zuletzt die Vorgeschichte... Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 30 Object Management Group(OMG) OMG – ein internationales Konsortium 1989 gegründet von acht Firmen (mittlerweile mehr als 800) 3COM, American Airlines, Canon, Data General, Hewlett Packard, Philips Telecommunications, Sun Microsystems und Unisys Ziel: Verbreitung von verteilten, modularen OO-Software Weg: Erarbeitung von offenen Standards die Realisierung und Umsetzung übernehmen die Mitglieder Entwickelte Spezifikationen „Unified Model Language“ (UML) „Model Driven Architecture“ (MDA) „Object Management Architecture“ (OMA) „Common Object Request Brocker Architecture“ (CORBA) Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 31 Geschichte von CORBA 1989 – Gründung der OMG 1990 – Die Vorstellung des OMA-Referenzmodells 1991 – CORBA 1.0 (nur für C), 1992 – OMA 2.0 (und weitere Releases von CORBA) 1996 – CORBA 2.0 Erweiterungen für C++, Smalltalk Interoperabilität zwischen ORBs verschiedener Hersteller Es folgen in CORBA 2.1/2.2 Erweiterungen für Java/Cobol/Ada Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 32 CORBA 3.0 Interoperabilität mit Enterprise JavaBeans, RMI-Objekten „call by value“ möglich Spezifikationen der Anforderungen für minimumCORBA: z.B Verzicht auf„Dynamic Invocation“ etc. realtimeCORBA: Erweiterung mit Threads, Verbindungsmanagment fault-tolerant-CORBA: kontrolliertes Verhalten im Fehlerfall „Asynchronous Messaging“ und „Quality of Service Control“ Ausführung nach Priorität, Lebensdauer Festlegung von Start- und End-Zeitpunkten der Ausführung Polling- bzw. Callback-Funktionen Firewall-Spezifikation, Kommunikation über Firewall-Systeme Interoperable Name Service im URL-Format z.B: iioploc://www.myserver.de/nameService Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 33 ¿Fragen? Universität Bonn, Seminar „Component and Aspect Engineering“ im WS 2003, Evgueni Kouris 34