Seminar-Layout
Download
Report
Transcript Seminar-Layout
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