9. Verteilte Objektsysteme 9.1 Grundidee • Ausgangssituation: Programmierung objektorientierter Anwendungen. • Verteilung der Objekte auf verschied. Rechner eines verteilten Systems: - verteilungs- und ortstransparenter Methodenaufruf, - aber keine Konsistenz von replizierten Objekten, - und i.d.R. auch keine Persistenz respektive Fehlertoleranz. • Herausforderung: - Kommunikationsaufwand unterscheidet sich enorm gegenüber dem lokalen Fall, - Datenübertragung von Referenzen (Hüllenbildung), • Unterstützung von verteilten Objekten im Programiermodell: - Middleware-Ansätze: z.B. Corba, .NET, AspectX, ... - Verteilte objekt-orientierte Betriebssysteme: Amoeba, Chorus, Plurix, ... 207 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.2 9.2.1 .NET und Historie Historie COM - Grundlagen • COM = Component Object Model, 1992 - sprachunabhängig (C++, Java, Basic, ...). - Objekte in DLLs oder Programmen, • Grundidee: Zusammenfassen von Funktionen eines Serverobjektes zu Einheiten (Interfaces): Æ COMObjekt Klient • COM definiert binäres Speicherlayout von Interfaces - Speicherformat entspricht dem einer abstrakten C++ Klasse. • Grundlage für viele weitere Dienste: - OLE (Open Link Embedding), DCOM (Distributed COM), OCX, ActiveX, .NET. 208 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Instanzierung • Objekte nicht mit „new“ instanziieren, sondern über COM-Laufzeitbib. • Erzeugen von COM-Objekten erfolgt durch Klassenfabrik. • Objekte durch UUID weltweit eindeutig identifizierbar. • UUID = Universal Unique Identifier - mit Tool guidgen.exe erzeugen, - Abbildung auf DLL oder (1) eIn ad L i br eat Cr 209 ce Bem.: Für Klienten bleibt unsichtbar, ob das Objekt in einer DLL oder in einem Programm untergebracht ist. n sta • ClassFactory ary Co (4) Lo • Ablauf der Instanziierung: Æ COMObjekt Klient ( 3) Programm in Registry. Server (4) t ea r C e nc a t s e In COM-Bibliothek (2) Registry Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Registrierung der Objekte: Aufsuchen eines Interfaces über die GUID und Einträge in der Registry. 210 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Local Server • Wird in einem fremden Adreßraum ausgeführt, Æ COM Objekte in einem separaten Programm • Server: - eigenständiges Programm, - Kommunikation über RPC, - registriert seine Klassenfabrik beim Start. • Proxy-Stub-Objekte für Interfaces eines fremden Adreßraumes: - Signatur gemäß RPC Notation, - Erzeugung mittels MIDL-Compiler, - es gibt vordefinierte Interfaces: IStream, IStorage, ... Klient ProxyDLL • Ablauf der Instanziierung: - Klient ruft „CoGetClassObject“, COM-Bib. lädt LocalServer und Proxy-Dll, Klient ruft „CreateInstance“ der ClassFactory, LocalServer gibt Klient Zeiger auf Interface. Class Factory COMObject Server 211 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.2.2 DCOM • DCOM = Distributed Component Object Model. • DCOM ist ab NT 4.0 standardmäßig enthalten. • DCOM Objekte: - gleich implementiert wie ein Local-Server Objekt, - aber auf anderen Maschine Æ Remote-Server, - Klient muß für die Instanziierung einen Server angeben. • Sicherheitseinstellungen durch dcomcnfg.exe. • Adressierung: - über Ort im verteilten Dateisystem, - über GUID, - über URL. 212 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.2.3 .NET Überblick • Anwendungsplattform Æ zur Entwicklung von verteilten XML-basierten Web-Anwendungen • Merkmale des .NET Frameworks: Framework & Tools Common Language Runtime Einheitliche Klassenbibliothek Visual Studio.NET Building Block Services Ständig verfügbare Internet-Dienste (Code-Updates, Suchdienste, Messenger) - sprachunabhängig durch Common Type System, - plattformunabhängig durch Zwischencode, - sprachübergreifende Laufzeitumgebung, - Kommunikation über HTTP & XML. Infrastruktur Devices Heutige „2000-Produktfamilie“ (zukünftig .NET Enterprise Servers) Mobile Geräte, auf denen .NET Anwendungen laufen (Handy, Handheld) • Wesentliche Teile standardisiert Æ ECMA - OpenSource Implementierung Mono. 213 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.2.4 Common Language Runtime • Compiler generieren Zwischencode: Oberon C# C++ Compiler Compiler Compiler IL Code IL Code IL Code ASM Code Common Language Runtime JIT Compiler Betriebssystem 214 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner • Common Language Runtime (CLR): - sprachübergreifende Laufzeitumgebung, sprachübergreifende Klassenbibliothek, erweiterbares Format für Meta-Daten, sprachübergreifendes Typsystem. • Microsoft Intermediate Language (IL=MSIL) Æ IL für eine abstrakte Stackmaschine (vgl. Java Virtual Machine). • Managed Code/Data: - automatische Freispeichersammlung (GC), wird unter Regie der CLR ausgeführt, Fehlerbehandlung (Exceptions), Sicherheitsprüfungen, Versionsprüfungen. • Ausführung durch Execution Engine (EE): - Exe-Datei: IL-Code + Stub zum Laden der Execution Engine, - nach Laden wird native Code erzeugt (IL wird nie interpretiert), - Bem.: EE ist als COM-Komponente realisiert. • Unmanaged Code/Data: - Brücke zu anderen Code-Teilen z.B. C-DLLs, - bzw. explizit verwaltetem Speicher (malloc & free). 215 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner MSIL – MicroSoft Intermediate Language • Im Vergleich mit reinen Assembler-Sprachen eher an höhere Programmiersprachen angelehnt: .assembly hello {} .method public static void Main() il managed { .entrypoint .locals(int32 V_0) // lokale 'var' ldc.i4.2 // push '2' ldc.i4.3 // push '3' add // addiere stloc.0 // speichere in 'var' ldloc.0 // push var call void [mscorlib]System.Console::WriteLine(int32) ret } 216 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner .NET Klassenbibliotheken • Umfangreiche Bibliotheken, z.B. System: System.Web Services Description UI HtmlControls Discovery WebControls System.WinForms Design Protocols ComponentModel System.Drawing Caching Security Drawing2D Printing Configuration SessionState Imaging Text System.Data System.Xml ADO SQL XSLT Design SQLTypes XPath Serialization System 217 Collections IO Security Runtime InteropServices Configuration Net ServiceProcess Diagnostics Reflection Text Remoting Globalization Resources Threading Serialization Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.2.5 Common Type System • Typen sind sprachübergreifend eindeutig. • Objektmodell Æ Typen im Object Namespace System Value Type 218 Type Enum Boolean Struct Char String Array Int32 Exception ... ... Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner • Werte-Typen: primitive Datentypen, Aufzählungen und Records. • Referenz-Typen: Arrays, Klassen, Interfaces, und Delegates. • Vererbung: - einfache Klassenvererbung, - mehrfaches Subtyping durch Interfaces. • Boxing: - Umwandlung zwischen primitiven Datentypen und Objekten, - Man vergleiche Typklassen (Integer, Double, ...) in Java. x 5 public static void main() { int x = 5; object o = x; int y = (int)o; } System.Int32 o y 219 5 5 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.2.6 Assemblies • Assemblies sind Container für eines oder mehrere Module: - äquivalent zu Java JAR-Dateien, ersetzen DLL- und Exe-Dateien, dynamisch ladbar von Disk oder Internet, enthalten: o MSIL-Code, o Reflectioninformation, o Versionskennung Æ „avoid DLL hell“, o Manifest (Import-, Export- & Sicherheitsanweisungen). Assembly (app1.dll) Modul Manifest MSIL (Typ A) MSIL (Typ B) MSIL (Typ C) Metadaten fürA, B und C 220 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Assembly Kategorien • Private Assemblies: - normalerweise nur von einer Anwendung nutzbar, typischerweise im Anwendungsverzeichnis, Identifikation anhand einfachen Namens, keine Versionsprüfung. • Shared Assemblies: - Installation in Global Assembly Cache, - sind global für alle Anwendungen, - obligatorische Versionsprüfung. • Strong Names für Shared Assemblies: - Name + Version, - und Key (Signatur). Æ kein Austausch möglich. 221 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Signieren von Assemblies • Verfahren mit öffentlichen Schlüsseln. • Öffentlicher Schlüssel im Manifest ablegen. • Rechtmässiger Erzeuger signiert Dateien mit privatem Schlüssel. • Mithilfe des öffentlichen Schlüssels ist Echtheit der Signatur prüfbar. • Klienten speichern mit Key-Pair dem Namen auch den Compiler Compiler öffentlichen Schlüssel. Quellen Æ Strong Name MyLib • Schlüsselpaar erzeugen: Main - sn.exe –k c:\outf - sn = strong name (utility). Manifest Ref.: MyLib PK=34e25c… Manifest PK=34e25c… Strong Name Signature 222 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Versionierung • Version im Manifest: Major.Minor.Revision.Build • Annahme: Assembly kompatibel, falls Major- & Minor-nr. gleich. • Klient per Default an Version gebunden, die sein Manifest referenziert. • Side-by-Side Execution: Æ Calc.DLL App.exe - veschiedene Versionen einer DLL in einem Prozess gleichzeitig ladbar. • Abschaffung der „DLL-Hölle” - Anpassung der Bindung explizit durch eine CFG-Datei steuerbar z.B. client.exe.config Æ Lösung des DLL-Problems (hier kein Versionsmanagement vorhanden). • Culture-Attribute für Lokalisierung. Ref-1: Calc.DLL 1.2.3.4 22acab57 Ref-2: AdvMath.DLL (private) 1.2.3.4 22acab57 AdvMath.DLL Ref-1: 2.0.0.0 56ab8157 Calc.DLL 2.0.0.0 56ab8157 223 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.2.7 Application Domains • CLR abstrahiert von OS-Prozessen u. arbeitet mit virtuellen Prozessen. • Application Domain = isolierter Ausführungsraum für eine Anwendung. • Sicherheit & Isolierung durch strenges Typsystem und Code-Verifier. • Marshalling für Aufrufe zwischen Application Domains. Marshaling Prozeß 1 AppDomain Objekt Prozeß 2 AppDomain AppDomain Objekt Objekt Objekt Objekt Marshaling 224 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Marshalling • Marshalling: Serialisierungsformat XML / SOAP. • Marshal-By-Value: - Kopie an Ziel senden (Standard), keine Verbindung zw. Kopie & Original, auto. Serialisierung mit Klassen-Attribut Serializable, Einschränkung durch Variablen-Attribut NonSerialized, individuelle Serialisierung durch das Interface ISerializable. • Marshal-By-Reference: - nur Referenz an Ziel senden – keine Kopien, - Verbindung zwischen Referenz & Original durch Stellvertreter-Objekt (Proxy). - Implementierung durch Ableiten einer Klasse von System.MarshalByRefObject. 225 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.2.8 Remoting • Framework für Kommunikation zw. (entfernten) Application-Domains. • Messages: Was wird gesendet? • Channels: Wohin wird gesendet? • Formatter: Datenformat für die Kommunikation • Proxy: Umwandlung von Methodenaufrufe in Messages. • Dispatcher: Umwandeln von Messages in Methodenaufrufe. Client "Proxy" 226 Channel Server Dispatcher Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Channel & Formatter • Channel: Wohin wird gesendet? - bidirekt. Kommunikation zw. 2 Endpunkten, TcpChannel, HttpChannel & SmtpChannel, - eigene Channels mögl. Æ IChannel. - Adressierung Æ • Formatter: Datenformat - definiert Wire-Format (Channel-Protokoll). • Formate: - Soap über HTTP Æ interoperabel, Binary über TCP Æ schnell, eigene Formate möglich Æ IFormatter, wird vom Channel dynamisch angefordert. • Serialisierung mithilfe der Metainformation im Assembly. MyObj MyService MyObj HTTPChannel StackBuilderSink (URI:MyObj) CLR AppDomain User Prozeß Winsock: Socket TCP:345 345 Å 80 BS Kern myhost.org http://myhost.org:345/MyObj 227 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner • Beispiel: [Serializable] class Point : ISerializable { private int x,y; public void GetObjectData(SerializationInfo info, StreamingContext ctx) { Type t = this.GetType(); . . . . info.AddValue("x",x); info.AddValue("y",y); } } public void ToFile (string file) { FileStream fs = new FileStream(file,FileMode.Create); SoapFormatter form = new SoapFormatter(); form.Serialize(fs,this); } class FormatterTester { static void Main(string[] args) { Point p = new Point(); p.ToFile("test.dat"); } } 228 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Proxy • Transparent-Proxy (TP): - automatisch generiert aus Schnittstelle, wandelt Aufrufe in ein IMessage-Objekt um, und ruft dann Invoke des Real-Proxy. TP kann nicht erweitert oder Klient ersetzt werden, • Real-Proxy: - kann ersetzt werden, - für eigene Erweiterungen, - z.B. für Lastverteilung, ... Proxy Server IMessageSink Channel Transparent Proxy mthA Invoke SyncProcessMessage mthB varV Real Proxy 229 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Sinks • Ein Channel kann mehrere Sinks implementieren. • Werden dynamisch erzeugt und installiert. • Bei Bedarf mehrere miteinander verkettet. ObjRef • Zum Überwachen und Logging, ... TP RP Sink Sink Sink Sink Formatter Channels Compiler Sink Sink Sink Sink Object 230 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Aktivierung von Objekten durch den Server • Server meldet Objekt im System an und Klienten verbinden sich damit. • SingleCall: pro Aufruf ein neues Obj. (kein Status Æ skaliert gut). • Singleton: ein Objekt für alle Klienten (Synchronisierung?). Server: public class ServerObject : MarshalByRefObject { public int print(string s) {} } public class MyServer { public static int Main(string [] args) { HttpChannel chan = new HttpChannel(999); ChannelServices.RegisterChannel(chan); } 231 } RemotingConfiguration.RegisterWellKnownServiceType( typeof(ServerObject), "myendpoint", WellKnownObjectMode.Singleton); Console.ReadLine(); Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Klient: public class Client { } 232 public static int Main(string [] args) { ServerObject factory; string EP="http://localhost:999/myendpoint"; factory = (ServerObject) RemotingServices.Connect(typeof(ServerObject), EP); factory.print("hallo"); } Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Aktivierung von Objekten durch den Klienten • Der Server meldet die Klasse im System an. • Die Klienten können selbst Objekte erzeugen. • Klient kann die Lebensdauer der Objekte steuern. • Verbindungsorientiert (vgl. DCOM). Server: public class MyServer { public static int Main(string [] args) { HttpChannel chan = new HttpChannel(999); ChannelServices.RegisterChannel(chan); } 233 } RemotingConfiguration.ApplicationName = “myobj"; RemotingConfiguration.RegisterActivatedServiceType(typeof(ServerObject)); Console.ReadLine(); Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Klient: public class Client { public static int Main(string [] args) { object[] attrs = new object[1]; Object[0] = new UrlAttribute("http://localhost:999/myobj"); ObjectHandle oh = Activator.CreateInstance("Server","ServerObject",attrs); if (oh!=null) { ServerObject so = (ServerObject)oh.Unwrap(); so.print("hallo"); } } } 234 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Lease Manager pro Domain • Verwaltet die Lebenszeit der klientenaktivierten Objekte. • Objekte deren Lebenszeit abgelaufen ist, werden der GC zugeführt. • Verlängerung durch Sponsor oder via Methodenaufruf des Klienten. • Jeder Aufruf des Objektes verlängert die Lebenszeit um konfig. Wert. public class ServerObject : MarshalByRefObject { public int v=0; public override Object InitializeLifetimeService() { ILease lease = (ILease)base.InitializeLifetimeService(); if (lease.CurrentState == LeaseState.Initial) { lease.InitialLeaseTime = TimeSpan.FromSeconds(10); lease.SponsorshipTimeout = TimeSpan.FromSeconds(20); lease.RenewOnCallTime = TimeSpan.FromSeconds(20); } return lease; } } 235 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.2.9 Web-Programmierung Active Server Pages • Script-Code eingebettet in HTML-Seiten wird auf Server ausgeführt. • Erzeugt dynamische HTML-Seiten für den Klienten. • Skriptsprachen: VBScript & JScript. • Microsoft Web-Server (IIS) notwendig. • ASP-Dateien (bestehende Technik vor .NET), • Beispiel: Cookie auslesen und Inhalt in HTML-Seite einfügen <HTML> <BODY> Ich lese ein Cookie vom Klienten: <% a=Request.Cookies("Name") Response.Write(a) %> </BODY> </HTML> 236 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner ASP.NET – Web Applikationen • Web Applikationen: - ASPX-Dateien in Web-Server Verzeichnis, Code in separaten Dateien (*.cs, *.mod), Kompilation beim ersten Aufruf, Klient erhält nur HTML. • Web Controls: - laufen auf dem Server, - ersetzen HTML Input-Tags, - im Code über ID zugreifbar. • Klient erzeugt Ereignis, Server verarbeitet es: Web Client Event Event Message Server Parse Message Aufruf Event Handler Event Handler Antwort 237 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner • Beispiel.aspx: <%@ Page Inherits="SeiteBerechnen" Src="Simple.cs" %> <html> <head><title>ASP.NET Hypotheken Rechner</title></head> <body> <form runat="server"> <asp:Button Text="knopf" OnClick="click" RunAt="server" id="button1" /> </form> </body> </html> • Simple.cs: public class SeiteBerechnen : Page { protected Button button1; public void click(Object sender, EventArgs e) { … } } 238 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner ASP.NET – Web Dienste • Idee: Dienste über das Web anbieten aufbauend auf http & XML. • Web Dienste: - ASMX-Dateien (*.asmx), - Methoden mit Attribut „WebMethod“ (können von entferntem Klient gerufen werden), - plattform- und sprachunabhängige Komponenten, - einfach einbindbar durch auto. erzeugte Proxy-Objekte. • Web Dienst allgemein: - ein Dienst, dessen Schnittstelle mit WSDL beschrieben, mit UDDI registriert und gefunden und mit SOAP angesprochen wird. • Techniken: - 239 XML: Datenaustausch, DISCO (Discovery): XML-File zum Erforschen eines bekannten URLs, SOAP (Simple Object Access Protocol): XML-basierter Methodenaufruf, WSDL (Web Service Description Language): Beschreibung eines Dienstes, UDDI (Universal Service Description, Discovery, and Integration): Auffinden von Diensten. Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner • Beispiel.asmx: <%@ WebService Language="C#" Class="MyService" %> using System; using System.Web.Services; public class MyService : WebService { [WebMethod] public int add(int a, int b) { return a+b; } } • Interaktives Testen auf WebServer-Maschine über HTTP: http://localhost/Service/Service.asmx?op=add • Mehr Infos: Architekturen für verteilte Internetdienste (F. Hauck). 240 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.3 Corba 9.3.1 Standardisierung • CORBA = Common Object Request Broker Architecture: - plattformunabhängige Middleware-Architektur für verteilte Objekte, - aufgesetzt auf ein vorhandenes Betriebssystem, - auch für heterogene verteilte Systeme. • OMG = Object Management Group: - Standardisierungsorganisation mit etwa 1000 Mitgliedern, - Publikation verschiedener Standard-Dokumente, - Definition von CORBA –Kompatibilität. • Teilbereiche der Standardisierung: - CORBA – Softwarearchitektur für Komponenten, - UML – Unified Modelling Language, - XMI – XML Metadata Interchange ... • Entwurf von Systemen mit hoher Komplexität ... 241 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.3.2 Zielsetzung • Verteilte objektbasierte Programmierung: - verteilte Objekte mit definierter Schnittstelle. Obj Obj Obj • Heterogenität in Verteilten Systemen: - verschiedene Betriebssystem-Architekturen, - verschiedene Hardware-Architekturen, - verschiedene Programmiersprachen. • Anbindung an Altsysteme (Legacy): - insbesondere C, Pascal und Visual Basic, - CORBA-Anwendungen sollen mit Middleware OS OS OS OS Altsystemen interagieren. • Freiheitsgrade bei der Middleware-Implementierung: - CORBA schreibt keine Implementierung vor, sondern die Funktionalität, - CORBA fordert Interoperabilität verschiedener Implementierungen, - partielle Implementierung zulässig. 242 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.3.3 OMA - Object Management Architecture • ORB als “Softwarebus” bzw. „Komponentenbus“: - Services: systemorientierte Dienste, - Facilities: anwendungsorientierte Dienste. Anwendungsobjekte Vertikale Vertikale VerticalFacilities Facilities Facilities Horizontal Facilities ORB CORBA Services 243 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Anwendungsobjekte • Verteilte CORBA-Objekte: - Ein Objekt immer auf einem bestimmten Rechner (keine verteilten Objektfragmente), - Kommunikation zwischen den Objekten über ORB, - Objekte bilden gemeinsam eine Anwendung. • Implementierungsperspektive: - interne Implementierung über Stellvertreterobjekte, - Legacy-Anwendungen können Objektaufrufe durchführen, - Der Aufrufer muss nicht unbedingt ein CORBA-Objekt sein: non-object object Knoten 244 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner CORBA-Services • Services bieten weitergehende systemorientierte Dienstleistungen an: - allgemein brauchbare und standardisierte Dienstleistungen, - Mit Objektschnittstelle und Methoden zum Aufruf, - ORB-Erweiterungen. • Konkret zum Beispiel: - 245 Namensdienst (zum Auffinden von Objekten), Zeitdienst (zum Synchronisieren der Zeit), Sicherheitsdienst (zur Zugriffskontrolle). Concurrency, Transactions, Licensing … Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner CORBA-Facilities • Facilities sind anwendungsorientierte Dienstleistungen: - im Gegensatz zu CORBA-Services (systemorientierte Dienstleistungen), - könnten auch vom Anwendungsprogrammierer erstellt werden. • Horizontale CORBA-Facilities: - über Anwendungsgebiete hinweg nutzbare Dienstleistungen, - z.B. Dokumentenbearbeitung, Druckdienst, Mobile Agenten, ... • Vertikale CORBA-Facilities: - 246 Betrachtung einer Anwendungsdomäne (Domain Facilities) z.B. Dienste für Gesundheitswesen (Patientenverwaltung CORBAmed), Finanzdienstleistungsgewerbe, Produktmanagement, Telekommunikation, ... Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner ORB - Object Request Broker • Rückgrat einer CORBA-Middleware. • Vermittelt Methodenaufrufe von einem zum anderen Objekt. • Interne Komponenten im ORB: Language Mapping, Dynamic Interfaces, Inter Orb Protocols, Objekt-Adapter, … Objekte (im Servant) Klient Interface Repository DII 247 IDL Stubs GIOP / IIOP Skeleton ORB Intf. DSI Object Adapter ORB Core Implementation Repository - Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.3.4 CORBA Objekte • Eigenschaften eines CORBA-Objekts - Attribute (von außen zugreifbare Instanzvariablen), Operationen (von außen zugreifbare Methoden), verteilt bzw. remote aufrufbar, Identität der Instanz, Zustand. • Stub enthält GET- und SET-Routinen für exportierte Variablen. • Zum Thema „Objektorientierung“: - CORBA-Objekt muss nicht identisch mit einem Objekt in einer Programmiersprache sein, - CORBA kann auch „objektlose“ Programmiersprachen unterstützen, z.B. C. 248 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.3.5 Interface Definition Language Schnittstellenkonzept • Von außen zugreifbare Attribute und Operationen müssen in Schnittstellendefinition deklariert werden. • Schnittstelle wird unabhängig von der benutzten Programmiersprache in einer Interface-Definition-Language (IDL) beschrieben • Language-Mapping: - Abbildung zwischen Programmiersprache und IDL-Syntax/Typen, - Von CORBA unterstützte Sprachen: o Ada, C, C++, Java, Lisp, PL/I, Python, Smalltalk, o weitere inoffizielle Language-Mappings existieren, z.B. für Perl. • IDL angelehnt an C++: - 249 geringer Lernaufwand für C++ Programmierer, Basistypen, Aufzählungstyp, Strukturen, Vererbung, geschachtelte Module, Exceptions, ... Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Parameterübergabesemantik • Call-by-Value: Wert wird kopiert - für Basistypen, z.B. byte, int, long, … - für zusammengesetzte Typen: arrays, union, … • Call-by-Object-Reference: Referrenz auf das Objekt wird kopiert - für Objekttypen, • Value-Types (seit CORBA 2.3): - Call-by-Value-Übergabe für CORBA Objekte (optional), - Parameter wird serialisiert (ähnlich Java), - Z.B. für struct, record, Objekte, … valuetype AccountVal{ public short accoutnNr; private double balance; double withdraw( in double amount ) ; double deposit( in double amount ); factory init( in short accountNr ); } 250 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Beispiel: Umsetzung von IDL in Sprachkonstrukte (z.B. Java) • Java IDL-Compiler: idlj hello.idl module HelloApp { interface Hello { string sayHello(); }; }; • Java Version des IDL-Interfaces: /* Hello.java as generated by idlj */ package HelloApp; public interface Hello extends org.omg.CORBA.Object { String sayHello(); } • Ausgabe des IDLJ Präcompilers: _HelloStub.java: Client Stub, Hello.java: Java version des IDL-Interfaces HelloPOA.java: stream-basierter Server Skeleton, HelloOperations.java: Operationen des Interfaces (extends Hello), HelloHolder.java: Operationen (read & write) für out- und inout-Parameter, HelloHelper.java: u.a. Hilfsfkt. zur Typumwandlung von CORBA- auf Java-Typen. 251 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner • Java Holder-Klassen: für mehrfache Ergebnisse / inout-Parameter - manche Programmiersprachen können nicht mehrere Ergebnisse zurückzugeben - Lösung: Java Holder-Klassen Æ Rückgabewerte gepackt in ein Objekt, welches zurückgegeben wird. • Java Helper-Klassen: für Typumwandlung bei Vererbung - Umwandlung in spezifischeren Typ ist nur möglich, wenn tatsächlich vorliegend, - Umwandlung in weniger spezifischen Typ ist immer möglich, - narrow-Operation (CORBA-Cast) benötigt sprachabhängige Umsetzung. • Vorteile: - Schnittstellenbeschreibung unabhängig von Implementierungssprache, - ermöglicht Unterstützung vieler Programmiersprachen, - IDL ist sehr ausdrucksstark. • Nachteile: - Objektschnittstelle muss in IDL und in der Implementierungssprache beschrieben werden (letzteres kann teilweise automatisiert werden), - Sprachabbildung für IDL-Konstrukte, die in einer Programmiersprache nicht direkt vorhanden sind, ist kompliziert, - Einige besondere Fähigkeiten einer Sprache, können nicht genutzt werden. 252 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.3.6 Objekterzeugung auf dem Server • Beschreibung der Objekt-Schnittstelle in IDL. • Implementierung des Servant: - Servant realisiert ein (oder auch mehrere) CORBA-Objekte, - Entscheidung für eine Programmiersprache, - Umsetzung der IDL-Schnittstelle in ein Skeleton, - Skeleton (HelloPOA.java) wird in der Regel ausgefüllt mit Implementierungscode, - Prä-Compiler wird i.d.R. IDL-Compiler genannt. 253 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner • Schritt-1: Instanzieren des CORBA-Objekts (Servant): • Schritt-2: Aktivieren des Portable Object Adapter (POA): - mindestens eine POA-Instanz pro Adressraum (Server-Prozess), - Aufruf von activate() am POA, um diesen zu aktivieren: • Schritt-3: CORBA-Objektreferenz erzeugen: - Aufruf von servant_to_reference(ServantRef) am POA, - liefert Objektreferenz auf CORBA-Objekt (nicht Servant). • Schritt-4: CORBA-Objekt im Namensdienst registrieren: - zunächst Referenz auf Namensdienst beschaffen: o Initiale entfernte Objektreferenz muss irgendwie beschafft werden, o ORB-Interface: z.B. orb.resolve_initial_reference( “NameService” ). - dann Objekt mir rebind(Pfad, ObjektReferenz) registrieren. 254 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Java-Beispiel: HelloServer.java import HelloApp.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; import org.omg.PortableServer.*; import org.omg.PortableServer.POA; import java.util.Properties; public class HelloServer { public static void main(String args[]) { try { ORB orb = ORB.init(args, null); // create and initialize the ORB // step-1: create servant HelloServant helloObj = new HelloServant(); // step-2: get reference to rootpoa & activate the POAManager POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate(); // step-3: get object reference from the servant org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloObj); Hello href = HelloHelper.narrow(ref); 255 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner // step-4: get reference to name service org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); // bind the Corba object reference in the name service String name = "Hello"; NameComponent path[] = ncRef.to_name( name ); ncRef.rebind(path, href); System.out.println("HelloServer ready and waiting ..."); // wait for invocations from clients orb.run(); } catch (Exception e) { … } } } • Beispiel: HelloServant (extends Skeleton HelloPOA): public class HelloServant extends HelloPOA { public String sayHello() { return "\nHello world!\n"; } 256 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Portable Object Adapter • Aufgaben eines Objektadapters (OA): - Generierung der Objektreferenzen, Aktivierung und Deaktivierung von Servants, Authentisierung des Aufrufers (im Security-Service), Entgegennahme/Weiterleitung eingehender Methodenaufruf-Anfragen. • Portable-Object-Adaptor (POA): - definierte Funktionalität für die häufigsten Aufgaben, - Obligatorischer Adapter für alle ORBs. • Jeder Servant kennt seine OA-Instanz: - OA-Instanz kennt die an ihm angemeldeten Objekte, - OA stellt Kommunikationsplattform bereit, - nimmt Aufrufe entgegen für seine Obj. • Root-POA existiert in jedem ORB: - voreingestellte Konfiguration, - Anfrage am ORB mit: orb.get_initial_references( “RootPOA” ), - kann zur Aktivierung von Objekten und weiteren OAs verwendet werden. 257 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.3.7 Objektnutzung durch den Klienten • Erzeugung eines Stubs durch den Pre-Compiler: - Auswahl einer Programmiersprache für die Client-Seite, - Umsetzung der IDL-Schnittstelle in einen Stub. • Zugriff: - Schritt-1: zunächst Referenz auf Namensdienst beschaffen, - Schritt-2: CORBA-Objekt per Namen suchen, - Schritt-3: Methoden rufen. • Bem.: Empfang eines Parameters mit Objekttyp: - autom. Erzeugung einer neuen Objektreferenz mit Hilfe des Stub-Code, - Objekttyp ist zur Compile-Zeit bekannt: Stub-Code kann erzeugt werden. 258 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner Java-Beispiel: HelloClient.java import HelloApp.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; public class HelloClient { public static void main(String args[]) { try { ORB orb = ORB.init(args, null); // create and initialize the ORB // step-1: get the root naming context org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); // step-2: resolve the Object Reference in name service String name = "Hello"; Hello helloObj = HelloHelper.narrow(ncRef.resolve_str(name)); System.out.println("Obtained a handle on server object: " + helloObj); // step-3: use CORBA object System.out.println(helloObj.sayHello()); } catch (Exception e) { … } }} 259 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.3.8 Dynamic Invocation Interface • Der Typ eines Objekts ist zur Compilierungszeit evtl. nicht bekannt. • Interface-Repository: - wird über den ORB abgefragt, hier müssen Schnittstellendefinitionen hinterlegt werden, Abfrage der Objektschnittstelle beim Interface Repository, Methoden, Parameter und deren Typen können erfragt werden. • Dynamische Konstruktion des Aufrufobjekts: - Durch den Programmierer, zunächst Request-Objekt erzeugen, Benennung der Methode und Param. als String, Typ des Rückgabewertes setzen, (vgl. textueller Aufruf in Plurix). • Aufruf durch Invoke() am Request-Objekt. • Bem.: sehr umständlich zu programmieren. 260 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.3.9 Kommunikationsprotokolle • Innerhalb einer ORB-Instanz können Objekte mit herstellerspezifischem Protokoll kommunizieren. • Zwischen ORBs verschiedener Hersteller: GIOP oder IIOP. • GIOP – General Inter-ORB Protocol (standardisiert in CORBA): - Austauschformat zwischen ORBs verschiedener Hersteller, - Common Data Representation (CDR) definiert Marshalling & Unmarshalling von IDL-Typen - GIOP Request Typen: o o o o o LocateRequest & LocateReply zum Auffinden eines Objektes, Request & Reply für einen Methodenaufruf, MessageError, Fragment, CloseConnection, CancelRequest. • IIOP – Internet Inter-ORB Protocol: GIOP über TCP/IP. • Bem.: GIOP-Implementierungen über andere Protokolle möglich. 261 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner IOR – Interoperable Object Reference • Darstellung einer Objektreferenz als IDL-Datenstruktur: - muss verwendet werden für GIOP, - Repräsentation als String möglich (object_to_string). • Profile in der IOR: - für jede Protokollfamilie eigenes Profil möglich, - Objekt kann theoretisch mehrere Protokolle unterstützen, z.B. IIOP neben herstellerspezifischem Protokoll. - Inhalt: o Repository-ID: Objekttyp, o Host-ID: IP-Adresse, o POA-ID: Server-POA, o Object-ID: Servant, … • Typische Implementierung in Standard-ORBs: - IOR wird als IOR eindeutiger Objektbez.benutzt, - Nutzung von IIOP auch innerhalb des ORBs? 262 Repository ID POA Object Server Identifier Identifier spec. IIOP Host Port Version ID number Profile ID Profile Data ... Object Key Components Next Profile Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.3.10 CORBA Perspektive • Verknüpfung mit RMI: - RMI kann mit IIOP betrieben werden, standardisierte Abbildung von Remote-Schnittstellen auf IDL (und zurück), CORBA-Objekt erscheinen als RMI-Objekte, RMI-IIOP-Objekte können als CORBA-Objekte auftreten. • Fault-Tolerant-CORBA: - CORBA-Erweiterung (ab Version 3.0) für fehlertolerante Objekte, - Middleware-Erweiterung für Objektgruppen-Referenzen, - Transparente Replikation von CORBA-Objekten: o Aufruf wird automatisch an alle Replikate verteilt, o strikte Konsistenz oder manuell durch Programmierer gesteuert. • Quellen: - 263 Hauck F., Vorlesung „Architektur für verteilte Objekte“, Th. Guenkova-Luy, Vorlesung „Verteilte Betriebssysteme“, WS01/02, Weber M., Verteilte Systeme, 2002, Tanenbaum A., v. Steen M., Distributed Systems, Prentics Hall 2002, Bengel G., Verteilte Systeme, Vieweg 2000. Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner 9.4 Zusammenfassung • Verteilung der Objekte auf verschied. Rechner eines verteilten Systems: - verteilungs- und ortstransparenter Methodenaufruf, - aber keine Konsistenz von replizierten Objekten, - punktuell mit Fehlertoleranz (z.B. Corba 3.0). • Microsoft .NET: - sprachübergreifende Laufzeitumgebung und ein gemeinsames strenges Typsystem, - Versionsmanagement für Assemblies (i. Geg. zu DLLs), - Remoting: o Channel: Wohin wird gesendet? o Formatter: Datenformat (z.B. SOAP über HTTP) o Proxy: Umwandlung von Aufrufen in Nachrichten o Dispatcher: Servergengstueck für Proxy o Sinks: dyn. erzeugbar; mehrere pro Channel mögl.; zum Überwachen ... o Objektaktivierung: durch Server oder Klient (mit Timeout / Lease) - ASP.NET Anwendungen: .NET Code in Webserver-Verz. Æ reagiert z.B. auf Klient-Ereignisse. - ASP.NET WebDienste: o Services über WebServer per SOAP zugreifbar, o Proxies auto. generierbar, o nicht nur für .NET. 264 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner • Corba: - plattformunabhängige Middleware-Architektur für verteilte Objekte, - verschied. kompatible Implementierungen für beliebige Betriebssysteme, - wesentliche Bestandteile: o ORB: vermittelt Methodenaufrufe zwischen CORBA-Objekten, o Anwendungsobjekte (auch in nicht-objekt-orientierten Sprachen mögl.), o Services: systemorientierte Dienste (z.B. Naming), o Facilities: anwendungsorientierte Dienste, o kein gemeinsames Typsystem, sondern IDL Sprache für Interfaces, - Instanziierung: o Servant stellt ein oder mehrere Objekte bereit, o Objekte werden beim POA aktiviert, o POA erzeugt CORBA-Referenzen, o diese werden im Namensdienst registriert, o Klient greift ueber Stub (generiert durch IDL-Comp.) hierauf zu. - Kommunikationsprotokolle: GIOP bzw. IIOP zw. ORBs verschied. Hersteller, - IOR: o unterstützt mehrere Protokolle, o Inhalt (u.a.): IP-Adr., Port, POA-ID, Object-ID, ... 265 Verteilte Betriebssysteme, Winter 2005 © Verteilet Systeme, Universität Ulm, M. Schöttner