Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 1 Common Object Request Broker Architecture (CORBA) Evgueni Kouris.

Ähnliche Präsentationen


Präsentation zum Thema: "Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 1 Common Object Request Broker Architecture (CORBA) Evgueni Kouris."—  Präsentation transkript:

1 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 1 Common Object Request Broker Architecture (CORBA) Evgueni Kouris WS 03/04

2 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 2 Evolution der Software- Anwendungssysteme (1) Von der Monolith-Architektur zur 2-Tier-Architektur... Monolith Fat-ClientsDatenbank-Server SQL

3 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 3 Evolution der Software- Anwendungssysteme (2)... zur 3- oder n-Tier-Architektur... Thin-Clients Server-Logik Datenbank-Server SQL

4 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 4 Evolution der Software- Anwendungssysteme (3)... zur heterogenen n-Tier-Architektur auf Middleware-Basis. Middleware

5 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 5 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

6 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 6 Object Management Architecture (1) Object Request Broker (ORB) CORBA Services Vertical CORBA Facilities Horizontal CORBA Facilities Application Objects

7 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 7 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 Domain- Unabhä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 enstprechen den Einzelprogrammen werden nicht standardisiert Object Request Broker (ORB) CORBA Services Vertical CORBA Facilities Horizontal CORBA Facilities Application Objects

8 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 8 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?

9 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 9 Interface Definition Language (IDL)

10 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 10 Interface Definition Language (IDL) Stellt eine Obermenge der Sprachkonzepte dar Unterstützte Sprachen: Java, C, C++, Cobol, Ada, Smalltalk, List, Python 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 Objekt

11 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 11 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 {}; };

12 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 12 IDL-Datentypen Basis DatentypBeschreibungJava-MappingC++-Mapping short 16 bit Integer shortCORBA::Short long 32 bit Integer intCORBA::Long long 64 bit Integer longCORBA::LongLong unsigned short 16 bit vorzeichenlos shortCORBA::UShort unsigned long 32 bit vorzeichenlos intCORBA::ULong unsigned long long 64 bit vorzeichenlos longCORBA::ULongLong float 16 bit IEEE Gleitkomma floatCORBA::Float double 32 bit IEEE Gleitkomma doubleCORBA::Double long double 64 bit IEEE Gleitkomma doubleCORBA::LongDouble char 8 bit Zeichen charCORBA::Char wchar 16 bit Zeichen (Unicode) charCORBA::WChar boolean TRUE oder FALSE booleanCORBA::Boolean octet einzelnes Byte byteCORBA::Octet string Zeichenkette java.lang.StringCORBA::String wstring Zeichenkette (Unicode) java.lang.StringCORBA::WString any Container für einen beliebigen Datentyp ?CORBA::Any

13 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 13 Selbst-definierte IDL-Datentypen Unterstützung für typedef enum const struct union arrays exception Auch für Precompiler-Anweisungen #include #define Quelle: An intoducation to CORBA von Paul Jonusaitus

14 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 14 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)

15 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 15 Object Request Broker ORB Operations operation() + args Was steckt hinter einem Methodenaufruf? Proxy-Patterns: werden aus IDL-Schnittstelle automatisch generiert Stub: Server-Proxy Skeleton: Client-Proxy Skeleton Quelle: An intoducation to CORBA von Paul Jonusaitus Stub Language mapping operations signature Language mapping entry points return value Client Objekt Portable Object Adapter Laufzeitumgebung, (re)aktiviert Objekte

16 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 16 Entwicklung einer Client/Server Anwendung mit CORBA

17 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 17 Entwicklungs-Schema Quelle: An intoducation to CORBA von Paul Jonusaitus IDL-Definition Client Programm Source Objekt Implementierung Source IDL-Compiler Skeleton Source Stub Source Java/C++ Compiler Client-Programm Java/C++ Compiler Objekt-Implementierung

18 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 18 IDL-Schnittstelle Zuerst wird die Schnittstelle in OMG-IDL definiert: //Hello.idl interface Hello{ void say_hello(); }; //Hello.idl interface Hello{ void say_hello(); }; l Man bekommt die Übersetzung der Schnittstelle in C++ und Java durch die Aufrufe von: IDL-to-C++ translator ·Hello.h, Hello.cpp, Hello_skel.h, Hello_skel.cpp uIDL-to-Java translator ·Hello.java, HelloHelper.java, HelloHolder.java, HelloOperations.java, HelloPOA.java, _HelloStub.java

19 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 19 Hello-Objekt in C++ #include Hello_skel.h class Hello_impl : public POA_Hello { public: virtual void say_hello() throw(CORBA::SystemException); }; #include Hello_skel.h class Hello_impl : public POA_Hello { public: virtual void say_hello() throw(CORBA::SystemException); }; #include #include Hello_impl.h void Hello_impl::say_hello() throw(CORBA::SystemException){ cout << "Hello World!" << endl; } #include #include Hello_impl.h void Hello_impl::say_hello() throw(CORBA::SystemException){ cout << "Hello World!" << endl; } Die Header-Datei des Objektes in C++: (Hello_impl.h) Die Implementierung der Header-Datei: (Hello_impl.cpp)

20 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 20 Server-Programm in C++ #include 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(); manager -> activate(); orb -> run(); orb -> destroy(); } catch ( const CORBA::Exception& e ) { cerr << e << endl; } } #include 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(); manager -> activate(); orb -> run(); orb -> destroy(); } catch ( const CORBA::Exception& e ) { cerr << e << endl; } } POA öffnen Referenz einer Instanz erzeugen IOR des Objektes speichern POA aktivieren, ORB starten (warten auf Clients)

21 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 21 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); hello.say_hello(); orb.destroy(); } catch ( Exception e ) { e.printStackTrace(); } } 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); hello.say_hello(); orb.destroy(); } catch ( Exception e ) { e.printStackTrace(); } } IOR der Instanz auslesen Den Proxy anhand der IOR ermitteln

22 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 22 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!"); } //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

23 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 23 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

24 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 24 Server in C++ mit Name Service #include 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(); manager -> activate(); orb -> run(); orb -> destroy(); } catch ( const CORBA::Exception& e ) { cerr << e << endl; } } #include 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(); manager -> activate(); orb -> run(); orb -> destroy(); } catch ( const CORBA::Exception& e ) { cerr << e << endl; } } CORBA::Object_var ns = orb -> resolve_initial_references( "NameService ); CosNaming::NamingContext_var nc = CosNaming::NamingContext::_narrow ( ns.in() ); CosNaming::Name aName; aName.length(1); aName[0].id = CORBA::string_dup("hello"); aName[0].kind = CORBA::string_dup(""); nc -> bind( aName, hello.in() ); CORBA::Object_var ns = orb -> resolve_initial_references( "NameService ); CosNaming::NamingContext_var nc = CosNaming::NamingContext::_narrow ( ns.in() ); CosNaming::Name aName; aName.length(1); aName[0].id = CORBA::string_dup("hello"); aName[0].kind = CORBA::string_dup(""); nc -> bind( aName, hello.in() );

25 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 25 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 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); hello.say_hello(); orb.destroy(); } catch ( Exception e ) { e.printStackTrace(); } } 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); hello.say_hello(); orb.destroy(); } catch ( Exception e ) { e.printStackTrace(); } } org.omg.CORBA.Object ns = orb.resolve_initial_references ( "NameService" ); NamingContext nc = NamingContextHelper.narrow ( ns ); NameComponent[] aName = new NameComponent[1]; aName[0] = new NameComponent(); aName[0].id = "hello"; aName[0].kind = ""; org.omg.CORBA.Object obj = nc.resolve ( aName ); Hello hello = HelloHelper.narrow ( obj ); org.omg.CORBA.Object ns = orb.resolve_initial_references ( "NameService" ); NamingContext nc = NamingContextHelper.narrow ( ns ); NameComponent[] aName = new NameComponent[1]; aName[0] = new NameComponent(); aName[0].id = "hello"; aName[0].kind = ""; org.omg.CORBA.Object obj = nc.resolve ( aName ); Hello hello = HelloHelper.narrow ( obj );

26 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 26 CORBA Schnick-Schnack

27 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 27 Ein Dynamischer Methodenaufruf DII – Dynamic Invocation Interface Interface Repository: Laufzeit-Datenbank beinhaltet maschinenlesbare IDL-Interfaces Object Request Broker ORB Operations Portable Object Adapter Skeleton Quelle: An intoducation to CORBA von Paul Jonusaitus Client Objekt DII Interface Repository Dynamic Interface Query

28 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 28 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 ORB 1 C1 O1 ORB 2 C2 O2 GIOP Protocol

29 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 29 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.)

30 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 30 Und zuletzt die Vorgeschichte...

31 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 31 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)

32 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 32 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

33 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 33 CORBA 3.0 Interoperabilität mit Enterprise JavaBeans, RMI-Objekten call by value möglich Spezifikationen der Anforderungen für minimumCORBA: z.B Verzicht aufDynamic 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

34 Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 34 ¿Fragen?


Herunterladen ppt "Universität Bonn, Seminar Component and Aspect Engineering im WS 2003, Evgueni Kouris 1 Common Object Request Broker Architecture (CORBA) Evgueni Kouris."

Ähnliche Präsentationen


Google-Anzeigen