PowerPoint-Präsentation

Werbung
Forschungszentrum Karlsruhe
Technik und Umwelt
Verteilte Kommunikation oberhalb der
Socket-API
Datencodierung,
Remote Procedure Calls,
Verteilte Objektkommunikation,
Namensdienste und Ortstranparenz
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Zunächst mal 2 Probleme
•
•
Kommunikation basiert auf Nachrichtenaustausch (über Sockets)
Ein grundsätzliches Problem mit Sockets ist
– Wir müssen Encoding / Decoding der Nachrichten definieren, dass
jeder Kommunikationspartner versteht
– Nachrichten sollen dabei beliebig komplex sein können (i.e. auch
komplexe binäre Strukturen)
•
2. Problem:
– Wir brauchen einfache, aber universell funktionierende Mechanismen
an Stelle von selbst-definierten Protokollen (Abstraktion oberhalb der
Protokollebene)
•
Höherwertige Kommunikationsmechanismen stellen Lösungen für
diese beiden Probleme bereit
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Übertragung komplexer binärer Daten
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Externe Datenrepräsentation
•
•
Höherwertige Kommunikationsmechanismen nutzen ein
gemeinsames Datenformat, genannt externe Datendarstellung
zur transparenten Übertragung von beliebigen (binären) Daten.
Notwendig wegen der Heterogenität der Umgebungen
– Unterschiedliche Hardwarearchitektur
– Verschiedene Betriebssysteme
– Verschiedene Programmiersprachen
•
•
Unter Marshalling versteht man den Prozess der Transformation
strukturierter Datenelemente und elementarer Werte in eine (mit einer
Nachricht übertragbaren) externe Datendarstellung
Unter Un-Marshalling versteht man den Prozess der Erstellung
elementarer Werte aus ihrer externen Datendarstellung und den
Wiederaufbau der ursprünglichen Datenstrukturen.
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Formen von externen Darstellungen
Sender und Empfänger sind sich
über die Reihenfolge und die
Typen der Datenelemente in
einer Nachricht einig
Vollständige Informationen über
Reihenfolge und die Typen der
Datenelemente sind in einer
Nachricht enthalten
•
ISO: ASN.1 (Abstract Syntax
Notation)
•
•
Sun ONC (Open Network
Computing)-RPC: XDR
(eXternal Data Representation)
•
Corba: IDL und CDR (Common
Data Representation): CDR
bildet IDL-Datentypen in
Bytefolgen ab.
Clemens Düpmeier, 16.05.2016
Java: Objektserialisierung, d.h.
Abflachung eines (oder
mehrerer) Objektes zu einem
seriellen Format inkl.
Informationen über die
Klassen.
Deserialisierung ist die
Wiederherstellung eines
Objektes ohne Vorwissen über
die Typen der Objekte.
Corba CDR Format
Typ
Sequence
Darstellung
Länge gefolgt von Elementen in der angegebenen Reihenfolge
String
Länge gefolgt von Zeichen in der angegebenen Reihenfolge
Array
Array-Elemente in der angegebenen Reihenfolge
Struct
Die Reihenfolge der Deklarationen der Komponenten
Enumerated
Unsigned Long
Reihenfolge und Typen der Elemente
bei Sender und Empfänger bekannt!
Struct Person{
Smith
string name;
London
string place;
unsigned int year; 1934
};
Index in Bytefolge
4 Byte
0–3
5
4–7
"Smit"
8–11
"h___"
12–15
6
16–19
"Lond"
20-23
"on__"
24–27
1934
Länge der
Zeichenkette
“Smith”
Länge der
Zeichenkette
“London”
unsigned int
Java Objektserialisierung: vereinfacht
public class Person implements Serializable{
private String name;
private String place;
private int year;
public Person(String aName, String aPlace, int aYear) {
name = aName;
place = aPlace;
year = aYear;
}
// gefolgt von Methoden für den Zugriff auf die Instanzvariablen
}
Person p = new Person(„Smith“,“London“,1934);
Person
8-Byte Versionsnummer
3
int year
java.lang.String
name:
java.lang.String
place:
1934
5 Smith
6 London
h1
h0
Klassenname,
Versionsnummer
Nummer, Typ und Name
der Instanzvariablen
Werte der Instanzvariablen
Das echte serialisierte Format enthält zusätzliche Typkennzeichner;
h0 und h1 sind Handles, also Verweise auf serialisierte Objekte
Forschungszentrum Karlsruhe
Technik und Umwelt
Fazit
• Zuerst die schlechte Nachricht: das sieht alles
ziemlich kompliziert zu implementieren aus,
und das ist es auch!
• Die gute Nachricht: Solche externen
Datendarstellungen sind schon konzipiert und
implementiert
– und ihre Nutzung ist (insbesondere bei
objektorientierten Sprachen) einfach
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Elementare Kommunikationsmuster
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Blockierende, synchrone Interaktion
•
über Anfrage-Anwort (Request-Reply) Protokoll
– Client schickt Anfrage-Nachricht an Server
– Server empfängt Nachricht und führt
zugehörige Aktion durch
– Server sendet Antwort-Nachricht an Client
zurück
•
•
Ausführung auf dem Client blockiert nach
Schicken der Anfrage-Nachricht so lange, bis
Antwort-Nachricht erhalten wurde
Beide, Client und Server, müssen zur Zeit der
Interaktion verfügbar sein
•
•
– Wenn nicht, muss durch wiederholtes Senden
von Nachrichten Fehlersituation bereinigt
werden
Clemens Düpmeier, 16.05.2016
•
Typischer Weise über
Verbindungs-orientierte
Sockets implementiert
Punkt-zu-Punkt Verbindung
– Kommunikationspartner
müssen direkt verbunden
sein (Keine MessageRouter dazwischen)
Viele mögliche
Fehlersituationen
Forschungszentrum Karlsruhe
Technik und Umwelt
Mögliche Fehlersituationen bei Request-Reply
Client
1) Verlust der Auftragsnachricht
Server
1)
2) Verlust der Ergebnisnachricht
3) Ausfall des Servers
3)
4)
2)
4) Ausfall des Clients
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
at least once Semantik
Client
Server
at most once Semantik
Client
Server
Reply
Bearbeitung
des Requests
Ergebnis kann
verschieden sein!
Clemens Düpmeier, 16.05.2016
Timeout
Request
Reply
Bearbeitung
des Requests
Timeout
Timeout
Request
Request
Request
Timeout
Timeout
Request
Timeout
Liste der Requests
Request
Reply
Bearbeitung des Requests;
Request eintragen
Liste der Requests überprüfen; Verwerfen des 2.
Reply Requests
Acknowledgement
Request löschen
Forschungszentrum Karlsruhe
Technik und Umwelt
Fehlersemantiken und Eigenschaften
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Weiteres zur Fehlerbehandlung
• Um zu verhindern, dass ein Service vorübergehend
nicht verfügbar ist, kann
– Replizierung des Service (Serverteils) und
automatische Lastverteilung und Relokation bei
Fehlern eingesetzt werden
• Für eine "Exactly Once"-Strategie und
kompliziertere Konsistenzerhaltung von Daten
benötigt man Transaktionskonzept (siehe später)
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Remote Procedure Calls (RPC)
Vorläufer der Verteilten
Objektkommunikationsmechanismen
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Idee für einen entfernten Prozeduraufruf
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Remote Procedure Calls (Sun-RPC)
•
Realisieren entfernten Funktionsaufruf
– übernehmen Funktion des Anwenderprotokolls bei Socketorientierter Kommunikation
– At least once Semantik (d.h. entfernter Prozeduraufruf wird
mindestens 1-mal ausgeführt)
– synchrone Kommunikation
– beliebig komplexe Argument(e) und Returnwerte werden als
komplexe Datenstrukturen aufgefasst und mit XDR kodiert
übertragen bzw. dekodiert.
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Synchrone Kommunikation in RPC‘s
Client vor Aufruf
Client wartet
Client nach Aufruf
Client
RPC Aufruf
Server
RPC Return
Lokale Funktion
aufrufen
Lokale Prozedur
Zeit
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Registrierung von RPC Programmen
Portmap / rpcbind
Client
Programm
Lookup
111
Registrierung
RPC Server
RPC Call
Client System
Clemens Düpmeier, 16.05.2016
Server System
Forschungszentrum Karlsruhe
Technik und Umwelt
Beispiel für RPC Server (Low Level)
#include <stdio.h>
#include <rpc/rpc.h>
#include <rpcsvc/rusers.h>
•
–
/* lokale Funktion, die Anzahl Benutzer feststellt */
void *rusers();
main()
{
if (rpc_reg(RUSERSPROG,RUSERSVERS,RUSERSPROCNUM,rusers,
xdr_void, xdr_u_int, /* Welche Argument hat RPC Prozedur,
* was wird zurückgegeben */
"visible") == -1)
/* Tranportwege = hier alle */
{
fprintf(stderr, "Couldn't register myself as RPC program\n");
exit(1);
}
svc_run(); /* Endlosschleife,
* nur return, wenn durch Signal abgebrochen */
fprintf(stderr, "Programm wurde beendet\n");
exit(1);
}
Clemens Düpmeier, 16.05.2016
Registrierung einer lokalen
Prozedur im Laufzeitsystem
des Servers unter Angabe von
Programmnummer,
Version
•
–
Prozedurnummer
–
Lokaler Funktion
–
Parameterdecodierung
–
Returnwertdecodierung
Starten der
Laufzeitinfrastruktur des
Servers
–
Laufzeitinfrastruktur
registriert Programme
und Prozeduren im
Namensdienst
Forschungszentrum Karlsruhe
Technik und Umwelt
Beispiel für RPC Client (Low Level)
/* einige includes */
main(argc, argv)
int argc;
char **argv;
{
unsigned int nusers; enum clnt_stat cs;
if (argc != 2) {
fprintf(stderr,"usage: rusers hostname\n");
exit(1);
}
if (cs= rpc_call(argv[1], RUSERSPROG, /* Programmnummer */
RUSERSVERS, RUSERSPROC_NUM,/* Version, Prozedur */
xdr_void, (char *)0,
/* Argumente */
xdr_u_int, (char *)&nusers,
/* Returnwert */
"visible") != RPC_SUCCESS)
{
clnt_perrno(cs); /* Gebe RPC Fehlercode auf Console aus */
exit(1);
}
fprintf(stdout, "%d users on %s\n", nusers, argv[1]);
exit(1);
}
Clemens Düpmeier, 16.05.2016
•
Aufruf der Prozedur
unter Angabe von
– Hostname,
– Programmnr.,
Version
– Prozedurnummer
– Codierer +
Parameter
– Decodierer,
Variable für
Returnwert
•
Ausgabe des Wertes
auf Standardausgabe
Forschungszentrum Karlsruhe
Technik und Umwelt
Low Level RPC sieht wirklich hässlich aus
•
Problem: sieht noch nicht wirklich wie lokaler Prozeduraufruf
aus
•
Lösung hierfür ist Stub- und Skeleton Generierung
– Führe RPC Sprache ein, mit der RPC Aufrufe bzgl. Parameter
(welche XDR Typen gehören dazu, etc.) spezifiziert werden
– RPC-Compiler generiert daraus lokale Funktionen
•
•
•
•
XDR-Kodierungs- und Dekodierungsfunktionen
Stubs für die Clientseite (sehen wie lokale Funktionen aus)
Anwendungsprogrammierer benutzt nur die Stubs
Skeleton für die Serverseite (Skeleton ruft normale
Anwenderprozedur auf)
• Anwendungsprogrammierer programmiert nur
Anwendungsprozeduren
• Stubs und Skeleton kommunizieren dann miteinander über die
bereits vorgestellte Low Level RPC Schnittstelle
•
Ähnliches Prinzip sehen wir gleich auch bei RMI und CORBA
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
/* einige includes */
main(argc, argv)
int argc;
char **argv;
{
unsigned int nusers;
if (argc != 2) {
fprintf(stderr,"usage: rusers hostname\n");
exit(1);
}
nusers=rusers(argv[1]); // Aufruf Stub
fprintf(stdout, "%d users on %s\n", nusers, argv[1]);
exit(1);
}
Bedeutung von
Stubs
Aufruf von Stub
int rusers(char *hostnname) {
if (cs= rpc_call(hostname, RUSERSPROG, /* Programmnummer */
RUSERSVERS, RUSERSPROC_NUM,/* Version, Prozedur */
xdr_void, (char *)0,
/* Argumente */
xdr_u_int, (char *)&nusers,
/* Returnwert */
"visible") != RPC_SUCCESS)
return -1;
else return cs;
}
Clemens Düpmeier, 16.05.2016
Stuboder Proxy
Forschungszentrum Karlsruhe
Technik und Umwelt
Wo wird RPC eingesetzt?
•
•
•

RPC Einsatz findet sich an vielen Stellen bei Linux und Windows Betriebssystemen
Beispiele Unix / Linux
–
NFS - Network File Sytem
–
YP - YP / NIS Verzeichnisdienst
–
Mount Daemon für das Mounten von Netzwerklaufwerken
–
...
Windows - alles an Diensten, was abhängig vom RPC Dienst ist
–
COM+ Ereignissystem (COM+ Kommunikation allgemein)
–
Dateireplikation
–
Distributed Transaction Dienst
–
Druckerdienst
–
...
RPC Schnittstellen stellen oftmals unbekannte Sicherheitslücken im Netz dar
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Verteilte Objektkommunikation
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Entfernte und lokale Methodenaufrufe
entfernter
Aufruf
lokaler
Aufruf
lokaler
Aufruf
lokaler
Aufruf
entfernter
Aufruf
•
Jeder Prozess hat Objekte, einige, die entfernte Aufrufe erhalten
können - entfernte Objekte genannt -, einige, die nur lokale Aufrufe
erhalten können
•
Objekte müssen die entfernte Objektreferenz eines Objektes in einem
anderen Prozess kennen, um dessen Methoden aufrufen zu können. Wo
bekommen sie diese Referenz her ?
•
Die entfernte Schnittstelle spezifiziert, welche Methoden entfernt
aufgerufen werden können
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Eigenschaften Verteilter Objekte
•
Interagierende Objekte sind auf mehr als einen Prozess
verteilt
•
Wichtige Begriffe (Auswahl, vereinfacht):
– Entfernte Objektreferenz: die „Adresse“/eindeutige Identität eines Objekts im
ganzen verteilten System
– Entfernte Schnittstellen: die Schnittstelle eines entfernten Objekts (interface
definition language, IDL)
– Ereignisse/Aktionen: Ereignisse/Aktionen von Objekten können
Prozessgrenzen überschreiten
– Exceptions/Ausnahmen: verteilte Ausführung des Systems erweitert das
Spektrum möglicher Fehler
– Garbage Collection: Freigabe nicht mehr benutzten Speichers wird im
verteilten System schwieriger
Clemens Düpmeier, 16.05.2016
Entfernte Objektreferenzen
•
Über Raum und Zeit garantiert eindeutig!
•
Bestehen aus
– Internetadresse: gibt den Rechner an
– Port-Nummer und Zeit: Identifizieren eindeutig den Prozess
– Objektnummer: Identifiziert das Objekt
– Schnittstelle: beschreibt die entfernte Schnittstelle des Objekts
•
Werden erzeugt von einem speziellen Modul - dem entfernten Referenzmodul wenn eine lokale Referenz als Argument an einen anderen Prozess übergeben
wird und in dem korrespondierenden Proxy gespeichert.
32 bits
32 bits
Internetadresse Port-Nummer
32 bits
Zeit
32 bits
Objektnummer
Schnittstelle des
entfernten Objektes
Achtung: Diese Art der Referenz erlaubt kein Verschieben des Objektes in einen
anderen Prozess zur Laufzeit!
Forschungszentrum Karlsruhe
Technik und Umwelt
Entfernte Schnittstellen
•
Die entfernte Schnittstelle gibt an, wie auf entfernte Objekte
zugegriffen wird (Signatur der Methodenmenge).
•
Ihre Beschreibung enthält
– Den Namen der Schnittstelle
– Möglicherweise Datentypdefinitionen
– Die Signatur aller entfernt verfügbaren Methoden, bestehend
aus
• Dem Methodennamen
• Ihrer Ein- und Ausgabeparameter
• Ihrem Rückgabewert
•
Jede Verteilte Objektkommunikationstechnologie besitzt eine
eigene Sprache, um solche Schnittstellen zu beschreiben.
Clemens Düpmeier, 16.05.2016
Enternte Schnittstelle: Beispiel CORBA IDL
struct Person {
string name;
CORBA hat Strukturen,
string place;
entfernte Schnittstelle
Java hat Klassen
long year;
};
interface PersonList {
Signatur: Definition
readonly attribute string listname;
der Methoden
void addPerson(in Person p) ;
void getPerson(in string name, out Person p);
long number();
Parameter sind in, out oder inout
};
entfernte
Schnittstelle
entfernter
Aufruf
m1
m2
m3
Daten
Implementierung
der Methoden
lokaler
m4 Aufruf
m5
m6
Forschungszentrum Karlsruhe
Technik und Umwelt
Proxy Design Pattern
<<interface>>
Subject
+request()
RealSubject
Proxy
realSubject
+request()
Clemens Düpmeier, 16.05.2016
+request()
Forschungszentrum Karlsruhe
Technik und Umwelt
Bedeutung von Schnittstellen
Client
Server
Implementierung
im Server
Gewünschte
Schnittstelle
im Client
Proxy Object
(Stub)
Skeleton
Kommunikationsschnittstelle
Netzwerk
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Teile einer Implementierung
•
Kommunikationsschnittstelle: zuständig für das Request-/Reply
(Anfrage-Antwort) Protokoll
•
Entferntes Referenzmodul: Übersetzt zwischen entfernten und lokalen
Objektreferenzen; besitzt meist eine entfernte Objekt-Tabelle, in der
diese Zuordnung eingetragen wird. Beim ersten Aufruf wird die
entfernte Objektreferenz von diesem Modul erzeugt.
•
Proxies und Skeletons
– Proxies (auch Stubs) genannt stellen Client Schnittstelle zur
Verfügung
– Skeletons rufen serverseitige Objektimplementierung auf
Clemens Düpmeier, 16.05.2016
Rolle von Proxy und Skeleton
Proxy: schafft Transparenz für Client.
Proxy implementiert entfernte Schnittstelle.
Marshals Request und unmarshals Reply.
Leitet Request weiter.
Ausführung des
Request/Reply Protokolls
Client
Entferntes
Referenzmodul
Übersetzung zwischen
lokalen und entfernten
Objektreferenzen
Request
Reply
Kommunikationsschnittstelle
Proxy B
Kommunikationsschnittstelle
Objekt A
Server
Dispatcher: wählt
Methode im Skeleton
aus.
Dispatcher B
Objekt B
Skeleton B
Entferntes
Referenzmodul
Skeleton: implementiert Methoden der
entfernten Schnittstelle. Unmarshals
Request und Marshals Reply. Ruft
Methode in entferntem Objekt auf.
Forschungszentrum Karlsruhe
Technik und Umwelt
Parameterübergabe: Referenz- und
Kopiersemantik
•
Entfernte Methodenaufrufe sollten Parameterübergabe-Semantik der
verwendeten Programmiersprache respektieren:
– In Java Übergabe von Werten per Kopie, Übergabe von Objekten per
Referenz
– In C++ freie Wahl der Übergabeart
•
Probleme:
– Entfernte Referenzen auf Werte prinzipiell nicht möglich
– Entfernte Referenzen auf Objekte nur möglich, wenn entsprechende
Stubs und Skeletons existieren
– Empfänger benötigt Implementierungsklasse für erhaltenes Objekt
(Kopiersemantik) bzw. Stub (Referenzsemantik)
Clemens Düpmeier, 16.05.2016
Beispiel für Parameterübergabe
Betrachte folgende Objektklasse:
import B;
public interface A extends Remote {
public void setB(B b) throws Throwable;
public B getB() throws Throwable;}}
public class AServant
extends UnicastRemoteObject
implements A {
private B b;
public void setB(B b) {
this.b = b;
}
public B getB() {
return this.b; }}
ASkeleton AServant
B
Forschungszentrum Karlsruhe
Technik und Umwelt
Parameterübergabe: Kopiersemantik (1)
1. Clientobjekt hält
Referenz auf Instanz
von A, ruft darauf
Methode getB() auf.
2. Stub übermittelt
Methodenaufruf an
Skeleton
3. Skeleton delegiert
Methodenaufruf an
Servant
4. Servant übergibt
Referenz auf Instanz
von B an Skeleton
"getB"
Klienten- AStub
objekt
ASkeleton AServant
B
Adressraum 1
Clemens Düpmeier, 16.05.2016
Adressraum 2
Forschungszentrum Karlsruhe
Technik und Umwelt
Parameterübergabe: Kopiersemantik (2)
8. Stub übergibt
Verweis auf neue
Instanz an Aufrufer
7. Stub lädt Klasse B,
dekodiert Zustand
und erzeugt damit
neue Instanz von B
Klienten- AStub
objekt
6. Kodierter Zustand
wird an Stub
übertragen
codierter Zustand
von B
B
Adressraum 1
Clemens Düpmeier, 16.05.2016
5. Skeleton kodiert
Zustand von Instanz
gemäß Wire Protocol
ASkeleton AServant
B
B.jar
Adressraum 2
Forschungszentrum Karlsruhe
Technik und Umwelt
Parameterübergabe: Referenzsemantik (1)
1. Clientobjekt hält
Referenz auf Instanz
von A, ruft darauf
Methode getB() auf.
2. Stub übermittelt
Methodenaufruf an
Skeleton
3. Skeleton delegiert
Methodenaufruf an
Servant
4. Servant übergibt
Referenz auf Instanz
von B an Skeleton
"getB"
Klienten- AStub
objekt
ASkeleton AServant
B
Adressraum 1
Clemens Düpmeier, 16.05.2016
Adressraum 2
Forschungszentrum Karlsruhe
Technik und Umwelt
Parameterübergabe: Referenzsemantik (2)
8. A-Stub übergibt
Verweis auf B-Stub
an Aufrufer
7. A-Stub erzeugt
neuen B-Stub, der
Netzwerkadresse von
B-Skeleton enthält
6. A-Skeleton sendet
Netzwerkadresse von
B-Skeleton an A-Stub
5. A-Skeleton erzeugt
neues Skeleton für B,
falls nicht bereits
vorhanden
(hostname, port)
Klienten- AStub
objekt
ASkeleton AServant
BStub
Adressraum 1
Clemens Düpmeier, 16.05.2016
BSkeleton B
B.jar
Adressraum 2
Forschungszentrum Karlsruhe
Technik und Umwelt
Weitere Aspekte der Objektübergabe
•
Festlegung der Übergabesemantik i.A. durch Typ des formalen Parameters:
–
Referenzen und keine Referenzen sind zunächst alles Werte! Die Übergabesemantik
regelt die Art der Interpretation.
–
Referenzübergabe, wenn formaler Parameter bestimmtes Interface (in Java RMI z.B.
java.rmi.Remote) implementiert
–
•
Wertübergabe sonst
Bei Wertübergabe Komplikationen möglich:
–
Wenn übergebenes Objekt direkt oder indirekt andere Objekte referenziert, müssen diese
ebenfalls übergeben werden (mit welcher Übergabesemantik?)
–
Sharing von Objekten muss auf der Clientseite rekonstruiert werden
–
Wenn übergebenes Objekt echter Untertyp des formalen Parameters ist, ist u.U. Upcast
erforderlich
•
Was ist mit Garbage Collection von Serverobjekt, wenn Client Referenz darauf hat (siehe
nächste Folie)?
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Weitere Implementierungsaspekte
•
Namensdienst, der Clients Objektreferenzen zunächst unabhängig
von ihrer Lage vermitteln kann
•
Parallele Abarbeitung: Um zu verhindern, dass ein entfernter Aufruf
einen anderen Aufruf verzögert, weisen Server der Ausführung jeden
entfernten Aufrufs einen eigenen Thread zu!
•
Aktivierung: Automatische Erzeugung einer Instanz und Initialisierung
der Instanzvariablen.
•
Persistenter Objektspeicher: Verwaltet persistente Objekte, also
Objekte, die zwischen Aktivierungen weiterbestehen.
•
Verteiltes garbage collection: Stellt sicher, dass in einem verteilten
System garbage collection durchgeführt wird. Problem: Referenzen,
die nur in Nachrichten vorhanden sind.
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Fallbeispiel(e)
Am Beispiel von Java
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Beispiel RMI
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
RMI – Remote Method Invocation
•
•
•
•
•
•
•
Definiert Verteilte Objektkommunikation von Java-Objekten
unabhängig von ihrem Ort
Eine reine Java-Lösung
Callback Funktionalität und dynamisches Laden von Code
Alle entfernten Objekte müssen eine entfernte Schnittstelle
definiert als Java Interface abgeleitet von java.rmi.Remote
besitzen
Es sind Werkzeuge für die Generierung von Stubs und
Skeletons vorhanden.
JDK stellt eine Implementierung eines Naming-Service zur
Verfügung: die RMIregistry.
Ein RMI-Dämon erlaubt eine flexible (on-demand)Instanziierung (Aktivierung) von Objekten.
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
RMI Architektur
Server
Server Programm
Client
Gemeinsames
Interface
Skeleton/Reflection
Remote Reference Layer
Transport Layer
Stubs
RMI
Komponenten
Netzwerk
Clemens Düpmeier, 16.05.2016
Client Programm
Remote Reference Layer
Transport Layer
Forschungszentrum Karlsruhe
Technik und Umwelt
Remote Reference Layer (RRL)
• Stub benutzt RRL-API, um Methodenaufrufe
auf die Serverseite zu übertragen
• RRL auf Serverseite benutzt Reflection oder
Skeleton Objekte, um auf Serverobjekt
zuzugreifen
• RRL unterstützt unicast Punkt-zu-Punkt
Objektverbindungen und aktivierbare
Objekte
• Andere Formen (Multicast) sind denkbar
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Transportlayer
• Stellt eigentliche Verbindung zwischen JVM's her
– spricht JRMP (Java Remote Method Protocol) als
stream-basiertes Protokoll oberhalb von TCP/IP
• RMI ab JDK 1.3 spricht zusätzlich das RMI-IIOP
Transportprotokoll basierend auf IIOP (Internet
Inter-ORB Protocol)
– ermöglicht Kommunikation zwischen CORBA und
RMI Objekten
• enthält Fähigkeiten, RMI Verkehr über andere
Verbindungen zu tunneln (z.B. über HTTP)
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Beispiel: Interfacebeschreibung eines RMI
Objektes (entfernten Objektes)
public interface Compute extends Remote {
<T> T executeTask(Task<T> t)
throws RemoteException;
}
• Interface von Remote ableiten
• Jeder Methode throws java.rmi.RemoteException
hinzufügen
• Objekte, die so ein "Remote" Interface
implementieren, sind entfernte Objekte
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Verwendet "normales" Objekt mit Interface Task
import java.io.Serializable;
public interface Task<T> {
T execute();
}
•
Nicht-Remote Objektparameter von entfernten Methoden müssen
serialisierbar sein
– Implementierungen müssen also sagen: implements Serializable
•
•
Ein Task ist für uns ein beliebiges Objekt, dass eine execute() Methode zur
Ausführung einer Berechnung besitzt und irgendein Ergebnis zurückgibt
Objekte, die Task implementieren, sind lokale Objekte
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
RMI Parameterübergabe
•
Entfernte Objekte werden als Proxy (Stub) an den Client
übergeben (Referenzsemantik)
– Bei Benutzung sind sowohl Methoden wie auch Daten des
Objektes entfernt
•
Andere (lokale Objekte) werden Call by Value (Kopiersemantik)
übergeben
– Beim Kommunikationspartner wird dabei eine Kopie des
Objektes angelegt
• Die Objekte müssen hierfür serialisierbar sein, um übertragen
werden zu können
• Der Code muss beim Kommunikationspartner verfügbar sein oder
dynamisch geladen werden
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Implementierung des entfernten Objektes
public class ComputeEngine extends UnicastRemoteObject
implements Compute
{
public ComputeEngine() throws RemoteException() {
super();
}
public <T> T executeTask(Task<T> t) {
return t.execute();
}
}
•
Implementierungsklasse wurde von UnicastRemoteObject abgeleitet; dies
macht aus Objekt in Konstruktor von UnicastRemoteObject einen Server
•
Konstruktor registriert Remote Objekt gleichzeitig in RMI
Laufzeitinfrastruktur und macht Objekt so von aussen referenzierbar
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Alternative Implementierung
public class ComputeEngine implements Compute
{
public <T> T executeTask(Task<T> t) {
return t.execute();
}
}
// und später bei Instanzierung
ComputeEngine engine = new ComputeEngine();
Compute engineStub
=(Compute)UnicastRemoteObject.exportObject(engine,0);
•
Manuelles Registrieren des engine-Objektes in der RMI-Laufzeitinfrastruktur
•
Laufzeitinfrastruktur liefert dabei Stub (Proxyobjekt) zurück
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Namensauflösung bei RMI
Client
Programm
registry.lookup
(liefert Stub)
rmiregistry
1099
registry.rebind(...)
RMI Server
Stub
Client System
Clemens Düpmeier, 16.05.2016
rufe remote Methode
durch Stub auf
Server System
Forschungszentrum Karlsruhe
Technik und Umwelt
Registry Klasse
java.rmi.Registry
static void rebind(String name, Remote obj)
...
static Remote lookup(String name)
// registriere
// obj im Namensdienst
// mit Name name
// hole Stub zu Name
// unter Anfrage beim
// Namensdienst
…
Wie sieht RMI Name aus?
//hostname[:port]/Objektname
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Basisstruktur RMI Server (1. Version)
if (System.getSecurityManager() == null)
System.setSecurityManager(new
RMISecurityManager());
String name="//hostname/Compute";
try {
Compute engineStub=new ComputeEngine();
Registry registry = LocateRegistry.getRegistry();
registry.rebind(name, engineStub);
} catch (Exception e) { }
•
•
•
•
Security Manager setzen = Schutz vor Clientcode
Namen für das Serverobjekt definieren
Serverobjekt erzeugen;
hier Version mit extends UnicastRemoteObject
Mit Namen im rmiregistry registrieren
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Basisstruktur RMI Server (2. Version)
if (System.getSecurityManager() == null)
System.setSecurityManager(new
RMISecurityManager());
String name="//hostname/Compute";
try {
ComputeEngine engine=new ComputeEngine();
Compute engineStub
= UnicastRemoteObject.exportObject(engine,0)
Registry registry = LocateRegistry.getRegistry();
registry.rebind(name, engineStub);
} catch (Exception e) { }
•
•
Manuelle Registrierung in der Laufzeitinfrastruktur mit
exportObject()
Man beachte: das zurückgegebene Stubobjekt und nicht engine
wird im Namensdienst registriert
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Basisstruktur RMI Client
if (System.getSecurityManager() == null)
System.setSecurityManager(new
RMISecurityManager());
String name="//hostname/Compute";
try {
Registry registry =
LocateRegistry.getRegistry(args[0]);
Compute engine=(Compute)registry.lookup(name);
// Methoden des Remote Objektes verwenden
} catch ....
• Security Manager setzen = Schutz vor Servercode
• Lookup des Serverobjektes im Registry
• Verwendung der Methoden des Remote Objektes
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Basisstruktur RMI Client (2)
...
try {
Registry registry =
LocateRegistry.getRegistry(args[0]);
Compute engine=(Compute)registry.lookup(name);
Pi task = new Pi(Integer.parseInt(args[1]));
BigDecimal pi = engine.executeTask(task);
System.out.println(pi);
} catch ....
•
Client berechnet die Zahl PI über den Server
•
Hierzu muss es eine Implementierung des Task-Interfaces
geben, die innerhalb ihrer execute()-Methode PI berechnet
und den Wert als BigDecimal zurückgibt
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Implementierung der PI-Berechnungsklasse
• zu lang für Folie
• siehe aber Java Tutorial
– enthält die komplette Implementierung des
Beispiels unter
– http://java.sun.com/docs/books/tutorial/rmi/cli
ent.html
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Wie kommt der Server zum Code der Klasse PI?
•
Der jar-File mit dem Code des Servers muss nicht
notwendigerweise die Klasse PI enthalten
•
Wie kommt dann aber der Klassencode der Klasse PI zum
Server, wenn das PI-Berechnungsobjekt zum Server
übertragen und dort ausgeführt wird?
– Java kann Code dynamisch über Netz laden!
– Hierfür muss der Code von PI irgendwo zum Download für den
Server bereitgestellt werden
– Und die Infrastruktur so aufgesetzt werden, dass sie weiss,
woher der Code geladen werden soll
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Zusammenfassung: RMI Anwendung schreiben
1. Definiere die entfernte Schnittstelle
2. Implementiere die entfernte Schnittstelle durch eine
Klasse (z.B. abgeleitet von UnicastRemoteObject)
3. Generiere Stubs und Skeletons mit rmic
4. Schreibe einen Server und Client
5. Starte den Namensdienst mit rmiregistry
6. Starte den Server auf der Maschine, wo das
rmiregistry läuft
7. Starte den Client
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
RMI-Beispiel ablaufen lassen
•
•
Vollständiger Code und Beschreibung im Java Tutorial von Sun
Achtung: Beim Starten der Applikation (Client + Server) muss der
Klassenlader richtig aufgesetzt werden (siehe Beschreibung im Tutorial),
z.B.
java
-Djava.rmi.server.codebase=http://myhost/Compute/classes/ \
-Djava.rmi.server.hostname=zaphod.east.sun.com -
\
-Djava.security.policy=java.policy
\
ComputeEngine
•
da sonst die Klassen, die über Netz gehen (z.B. das Stubobjekt vom
Server, die Interfaces oder die Client Task Klasse), nicht geladen werden
können
Außerdem muss die Security-Policy Datei (wir schützen unsere
Programme von fremder Code durch SecurityManger) richtig aufgesetzt
werden
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Verteilte Objekttechnologien
Common Object Request Broker Architecture
(CORBA)
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Object Management Group (OMG)
•
Gründung: April 1989
•
Ziele:
– Interoperabilität
– Anwendungsintegration
in heterogenen Umgebungen
auf der Basis eines Objektmodells
– Portabilität
•
Mitglieder:
Distributed Component
Object Model (DCOM)
– über 800 Mitglieder
– darunter: Apple, AT&T, DEC, HP, IBM, Microsoft, SUN,...
•
Entwicklungsprozeß: Request for Proposal (RFP)
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Object Management Architecture (OMA)
•
Application
Objects
Common
Facilities
•
Application Objects
–
spezifische Anwendungsgebiete
–
gehören nicht zur Infrastruktur
Common Facilities
–
allgemein nützliche Dienste (Drucken, E-Mail,
Datenbanken)
ORB
–
•
•
Object Request Broker (Objektbus)
–
Infrastruktur für Kommunikation
–
garantiert Interoperabilität
Common Object Services
–
Common Object Services
Clemens Düpmeier, 16.05.2016
nicht notw. Teil aller Infrastrukturen
allg. Funktionen zum Erstellen u. Unterhalten von
Objekten
Forschungszentrum Karlsruhe
Technik und Umwelt
ORB Aufgabe
Application
Objects
Common
Facilities
ORB
 Einbettung von Objekt-Implementationen
("Server-Objekte")
Common Object Services
 Vergabe von Objektreferenzen
 Entgegennehmen von Aufrufen vom Client
 Transport der Aufrufe zum Server
 ggf. Aktivierung eines Server-Objektes
 Übergabe des Aufrufs zum Server-Objekt
 Entgegennehmen von Ergebnissen und Transport / Rückgabe
zum Client
 Unterstützung von Sicherheits- und Abrechnungsfunktionen
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
CORBA Protokolle: GIOP und IIOP
•
Mit CORBA 2.0 wurde GIOP = General Inter-Orb Protocol als
netzwerkunabhängiges Wire Protocol spezifiziert
•
Die (meist verwendete) TCP/IP-Variante heißt IIOP = Internet
Inter-Orb Protocol
•
GIOP spezifiziert
– Nachrichtentypen (Requests, Resultate, Ping, ...)
– Datenaustauschformat ("Common Data Representation")
– Interoperable Objektreferenzen (IORs)
– Service-Kontexte (Request-Anhängsel, mit denen Dienste
transparent Informationen übermitteln können)
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Aufbau eines CORBA Servers
•
POA (Portable Objekt Adapter)
dient als zentrale
Zugriffsschnittstelle auf
Objektimplementierungen
– erzeugt eindeutige
Applikationscode
aktive Servants
Hauptprogramm
Servant
Activator
main (String args[]) {
ORB orb
= ORB.init(args);
orb.connect (
new AServant()
);
orb.connect(
new BServant()
);
orb.run();
}
Default
statisch
Servant (mit Skeleton)
i
dynamisch
(ohne Skeleton)
...
Objektreferenzen
– hat Objekt Map
ORBSchnittstelle
Servant Default
Active Object
Activator
Servant
Map
Fabrik für
Objektreferenzen
Portable Object Adapter
– nimmt Requests für
Objekte vom ORB
entgegen
Request Interceptors
für verschiedene
Event Marshalling Services (optional)
Loop
Engine
ORB-Kern
Netzwerk
Clemens Düpmeier, 16.05.2016
1 2 ... ... n ...
Forschungszentrum Karlsruhe
Technik und Umwelt
Ablauf eines Methodenaufrufs
Client
Anwendung
1) Aufruf
IDL Stub
2) Parameter einpacken
und Aufruf weiterleiten
Objekt
Implementierung
5) Auspacken und
Aufruf
IDL Skeletton
4) Weiterleiten an
Schnittstelle
Object Adapter
Object Request Broker Core
3) Transport über den ORB mit GIOP (IIOP)
Clemens Düpmeier, 16.05.2016
4b) Aktivieren
Implementation
Repository
4a) Ermitteln der
Implementierung
Forschungszentrum Karlsruhe
Technik und Umwelt
Object Services
Application
Objects
Common
Facilities
ORB
Object Services
Naming
Event
Security
Transactions
Trading
Lifecycle
Time
(= Systemfunktionen)
Licensing
Properties
Relationships
Notification
Persistence
Concurrency Control
Externalisation
Nur Spezifikation der Schnittstellen und
grundlegender Funktionsprinzipien!
Clemens Düpmeier, 16.05.2016
Common Object Services
Forschungszentrum Karlsruhe
Technik und Umwelt
Common Facilities
Application
Objects
Common
Facilities
ORB
•
•
•
•
Höherwertige Dienste für ein breites Spektrum an
Anwendungsbereichen
Bereitstellung allgemein interessanter Funktionalität
(analog zu großen Klassenbibliotheken)
Horizontale Common Facilities (Basisfunktionalität allgemein)
Common Object Services
–
User Interface
–
Information Management (Speicherung komplexer Strukturen, Formatkonvertierung)
–
Task Management (Workflow, lange Transaktionen)
–
Internationalisierung („Sprachenübersetzung“)
Vertikale Common Facilities (Basisfunktionalität speziell)
–
für Marktsegemente, z.B. Banken, Gesundheitswesen, Finanzdienste
–
vgl. „application frameworks“, „business objects“
Clemens Düpmeier, 16.05.2016
Application
Objects
Application Objects
(Business Objekte)
ORB
Common Object Services
Andere Schnittstellen
PräsentationsObjekt
Komponenten
eines BusinessObjektes
•
Business-Objekte (M, Server)
–
MVC
legt fest, wie auf Änderungen in View/Modell
reagiert wird
•
BusinessObjekt
Business-Prozeßobjekte (C, Server)
–
kapseln Business-Logik
–
Verwaltung vorwiegend langlebiger Prozesse
(Workflow, Transaktion)
•
Andere
Business-Objekte
kapseln Speicher, Metadaten, Parallelität u. Regeln
einer aktiven Business-Einheit
–
BusinessProzeßObjekt
Common
Facilities
Dokument
Server
Präsentationsobjekte (V, Client)
–
grafische Darstellung des Objektes
–
unterschiedliche Präsentationen möglich
Forschungszentrum Karlsruhe
Technik und Umwelt
IDL (Interface Definition Language)
Ada
IDL
C
IDL
C++
IDL
ORB
COBOL
•
Basismechanismus zur Definition von
Schnittstellen (Standard)
•
Unabhängig von spezieller Sprache (deklarativ, d.h. ohne algorithmische Teile, d.h. ohne
Implementierungsdetails)
•
Sprachbindung für verschiedene Sprachen
•
IDL-Grammatik ist Teilmenge von C++;
zusätzlich Mittel für Verteilungskonzepte
•
Beinhaltet Mehrfachvererbung
•
Schnittstellenverzeichnis (Interface Repository),
damit selbstbeschreibend
•
IDL ist Kontrakt, der alle und alles
zusammenbringt
IDL
Java
IDL
Smalltalk
IDL
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Beispiel für eine IDL Datei (1)
module Bank {
typedef sequence<string> StringArray;
struct Person {
string name;
string vorname;
};
// hier fehlt noch exception Definition
interface Konto {
readonly attribute float kontostand;
readonly attribute long geheimzahl;
readonly attribute long kontonummer;
void einzahlen(in float betrag);
void abheben(in float betrag);
void unlock(); // Sperre freigeben
};
// hier geht es weiter mit dem KontoManager
};
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Beispiel IDL Datei (2)
module Bank {
typedef sequence<string> StringArray;
struct Person {
string name;
string vorname;
};
exception KontoException {
string begruendung;
};
// hier war interface Konto definiert
interface KontoManager {
Konto anmelden(in long kontonr, in long geheimzahl)
raises (KontoException);
Konto oeffnen(in Person daten);
void aufloesen(in Konto konto);
StringArray holeKontenInfos();
};
};
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Feature der IDL (1)
•
Mehrere Interface Beschreibungen können in einer
Modulbeschreibung zusammengefasst werden
•
Es gibt die von anderen Sprachen bekannten Standardtypen
(Gleitkomma, Integer, Zeichen-, bool, Byte und deren
Subtypen)
•
Es gibt Konstrukte zum Aufbau von struct's und union's
•
Template Typen sequence und string sowie Arrays
•
Neue Typen können mit typedef deklariert werden
•
interface Definitionen entsprechen neu definierten
Objekttypen (Klassen)
•
Es gibt den Begriff Attribut mit name() und name(value)
Zugriffsfunktionen
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Feature der IDL (2)
•
Es gibt Enumerations (Aufzählungstypen)
•
Man kann Konstanten deklarieren
•
Weiter gibt es Exception Deklarationen für
Ausnahmezustände
•
Parameter von Methoden lassen sich als in, out oder inout
Parameter definieren
•
Weiter gibt es die Möglichkeit Methoden als vom Typ oneway
(d.h. kein Returnwert erwartet) zu deklarieren, was eine nichtblockierende Bearbeitung bedeutet (der Client wartet hier
nicht auf den Server)
Clemens Düpmeier, 16.05.2016
Ablauf einer CORBA Entwicklung
Schnittstellendesigner
interfaces.idl
Programmierer
Anwendungsentwickler
IDL-Java
Compiler
client.jar
stubs.jar
Client
IDL-C++
Compiler
types.hh
stubs.cc
skels.cc
Server
servants.cc
Forschungszentrum Karlsruhe
Technik und Umwelt
RMI-IIOP
Corba Objekte mit RMI
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Beispiel-Interface
//HelloInterface.java
import java.rmi.Remote;
public interface HelloInterface extends java.rmi.Remote
{
public void sayHello( String from )
throws java.rmi.RemoteException;
}
• Ganz normales RMI Interface
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Implementierung des Interfaces
//HelloImpl.java
import javax.rmi.PortableRemoteObject;
public class HelloImpl extends PortableRemoteObject
implements HelloInterface {
public HelloImpl() throws java.rmi.RemoteException {
super(); // invoke rmi linking and remote object initialization
}
public void sayHello( String from ) throws java.rmi.RemoteException
{
System.out.println( "Hello from " + from + "!!" );
System.out.flush();
}
}
• Leitet von PortableRemoteObject ab!
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
RMI-IIOP Serverprogramm
//HelloServer.java
import javax.naming.InitialContext;
import javax.naming.Context;
public class HelloServer {
public static void main(String[] args) {
try {
HelloImpl helloRef = new HelloImpl();
// Step 2: Publish the reference using JNDI API
Context initialNamingContext = new InitialContext();
initialNamingContext.rebind("HelloService", helloRef );
} catch (Exception e) {
e.printStackTrace();
}
}
}
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
RMI-IIOP Clientprogramm
public class HelloClient {
public static void main( String args[] ) {
Context ic; Object objref;
HelloInterface hi;
try {
ic = new InitialContext();
hi = (HelloInterface)ic.lookup("HelloService");
hi.sayHello( " MARS " );
} catch( Exception e ) {}
}
}
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Aufruf RMI-IIOP Beispiel
// start des Nameservers
start orbd -ORBInitialPort 1050
// start des Servers
java
-classpath .
-Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
-Djava.naming.provider.url=iiop://localhost:1050
HelloServer
// start des Clients
java
-classpath .
-Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
-Djava.naming.provider.url=iiop://localhost:1050
HelloClient
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Was ist InitialContext()?
• Zugriff auf einen initialen Namenskontext (Context)
eines Namensdienstes über die JNDI-API
– Java Native Directory Interface (JNDI)
• Ein JNDI Namenskontext ist eine Menge von JNDINamen-zu-Objekt Mappings
– Jeder Kontext kann weitere Kontexte enthalten
(Hierarchische Struktur von Kontexten möglich)
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Context Interface
javax.naming.Context
void bind(Name name, Object object)
void bind(String name, Object object)
…
Context createSubContext(Name name)
Context createSubContext(String name)
…
Object lookup(Name name)
Object lookup(String name)
void rebind(Name name, Object object)
void rebind(String name, Object object)
…
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Wie bekomme ich initialen Context?
Context ctx = new InitialContext()
// falls INITIAL_CONTEXT_FACTORY und PROVIDER_URL bereits definiert
// z.B. durch Setzen von java.naming.* Properties
// oder
Hashtable env=new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.cosnaming.CNCtxFactory");
env.put(Context.PROVIDER_URL, "iiop://localhost:1050");
Context ctx=new InitialContext(env)
• Factory-Klasse definiert "Art des Namensdienstes",
auf den zugegriffen werden soll
• PROVIDER_URL die URL zum Zugriff
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Zugriff auf JNDI-Namensdienste
• CORBA konformer Namensdienst
– Factory:
com.sun.jndi.cosnaming.CNCtxFactory
– URL:
iiop://localhost:1050
Context ctx = new InitialContext()
• LDAP Directory Server
– Factory:
com.sun.jndi.ldap.LdapCtxFactory
– URL:
ldap://localhost:389/o=MyOrg
DirContext ctx=new InitialDirContext()
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
RMI-IIOP / JNDI / EJB
• EJB (Enterprise Java Beans) können RMI-IIOP
basierte entfernte Schnittstelle anbieten
• Zugriff von Clientseite erfolgt dabei typischer Weise
über JNDI
Context ctx = new InitialContext();
Object ref=ctx.lookup("Calculator/remote");
CalculatorRemote rechner=(CalculatorRemote)PortableRemoteObject
.narrow(ref, CalculatorRemote.class);
System.out.println("2 + 5 =" + rechner.add(2,5));
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Namens- und Verzeichnisdienste
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Namensdienst
bind (Name, Zugriffsinf.)
lookup("name")
Adresse /
Zugriffsinform.
Adresse /
Zugriffsinform.
P
•
Zugriff auf Resource
Resource
Ein Namensdienst (Naming Service) bildet Namen auf
Zugriffsinformationen (Adressen) zum Zugriff auf Ressourcen ab
– Den Vorgang der Zuordnung eines Namens zur Zugriffsinformation
nennt man Binden (bind)
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Warum Namensdienste
•
Entkoppelung des Zugriffs auf eine Resource von den
Adressierungsdetails
– erhöht die Konfigurierbarkeit (Adressdetails nicht hardcodiert in
Client)
– schafft Ortstransparenz – d.h. Resourcen können relokiert
werden
– ermöglicht Lastverteilung
– Es können administrative Entscheidungen zum ResourceManagement getroffen werden, ohne die Clients neu
compilieren zu müssen
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Was ist ein Name
•
Namen können verschiedene äquivalente Formen haben
– Im Programmierkontext häufig strukturierte Objekte,
• i.e. Array von NamingComponent Objekten in Corba oder
CompoundName, CompositeName in JNDI
– lassen sich typischer Weise äquivalent auch durch Strings
beschreiben, z.B. als
"cn=HomeDir,cn=John,ou=Marketing,ou=East" oder
"ejb/Calculator/Remote" oder [email protected]
• Benötigen zur Interpretation einen Kontext, in
dem die Namensauflösung stattfindet
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Was ist die Adresse (Zugriffsinformation)
•
definiert alle für den Zugriff auf die Resource notwendigen
Informationen
•
Je nach Kontext und Anwendungssituation nahezu beliebig
– Kann physikalische Adresse sein: IP-Adresse
– Kann Name bzgl. eines anderen Namensdienstes oder
Auflösungssystem sein
– Oder Kombination von beiden
– Oder Objektreferenz
•
In objektorientierten Systemen häufig wieder in Form von Objekten
gekapselt
– z.B. DataSource-Objekte zum Zugriff auf Datenbanken
– Oder entfernte Objektreferenz oder direkt serialisiertes Proxyobjekt
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Kontext
• Der Kontext eines Namensdienstes definiert bzw.
enthält
– Die Menge der erlaubten Namen (Namensraum)
– Die Menge der Bindings, die Namen an zugehörige
Resourcen bindet
• Er hat typischer Weise wieder einen Namen
– und kann als Resource innerhalb eines
übergeordneten Kontextes beschrieben sein
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Hierarchische Kontexte
Kontext "Root oder InitialContext"
zugehöriger Name:
Kontext "Kunde"
Kunde/Privatkunde/"Peter Meier"
Kontext "Privatkunde" Kontext "Geschäftskunde"
•
Namen können hierarchisch strukturiert sein
•
Jede Teilkomponente des Namens wird über eigenen Kontext
aufgelöst
•
Kontexte können mit gleichen Namensräumen oder
vollständig unterschiedlichen Namensräumen arbeiten
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Zusammenspiel mehrerer Namensdienste
(Federation)
zugehöriger Name:
DNS-Service
[email protected]
Benutzerverwaltung
Nutzername
Domainname
• Namen können als zusammengesetzte Namen
Komponenten haben, die über verschiedene
Namensräume definiert sind
• Zur Auflösung müssen verschiedene Dienste oder
Kontext-Provider zusammenspielen (Federation)
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Beispiele für Namensdienste / -räume
•
DNS (Domain Name Service)-Dienst
– mailhost.iai.fzk.de
•
User-Namen-, Gruppennamenauflösung in Rechnern
– typischer Weise über Verzeichnisdienste, siehe später, wie YP,
NIS oder LDAP
•
Email-Adressen
– mailto:[email protected]
•
RPC-registry, RMI-registry, CORBA-Namensdienst
– rmi://servername/objektname
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Verzeichnisdienste
• Ein Verzeichnisdienst ist ein Namensdienst,
der
– Resourcen neben den physikalischen
Adressen weitere beschreibende Metadaten
zuordnet
– oder auch nur beschreibende Metadaten für
eine Resource bereitstellt (Metadatendienst
oder Metaverzeichnis)
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Typische Verzeichnisdienste
•
YP (Yellow Page)-Dienst, NIS (Network Informationsdienst) für
Betriebssysteme
– lösen Anfragen nach Rechnern, Usern, Zugriffsrechten, Druckern,
Netzwerkdateisystemen, etc. auf
•
LDAP (Leigweight Directory Service Access Protocol) Services
– dieselben Informationen wir bei YP, NIS
– darüberhinaus Organisationsdaten
• Organsiation, Unterorganisation, Mitarbeiter inklusiver Telefonnummer,
etc.
– beliebige weitere Objekte, insbesondere häufig als Verzeichnisdienst
für entfernte Objekte, Datenbankresourcen, etc. eingesetzt
•
UDDI-Verzeichnisse für Web-Services
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Beispiel LDAP-Server
•
Lightweight Directory Access Protocol (LDAP)
•
Spezifiziert in RFC 2251
•
Protokoll zum Zugriff auf Verzeichnisdienste, die auf Basis von OSI
X.500 arbeiten (ASN.1 codierte Daten)
•
Namensbeschreibung hierarchisch in der Gestalt
"cn=HomeDir,cn=John,ou=Marketing,ou=East"
•
Unter Namen können beliebige LDAP-Objekte (beschrieben durch
Attributname-Value Paare) gespeichert werden
– flexibles Typsystem erlaubt hier beliebige Typen für Attribute
– eigene Erweiterungen der Schema für LDAP-Objektklassen über
Schemabeschreibungssprache möglich
•
Definiert Security-Interfaces, etc und weitere Infrastrukturdienste
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
binäres Bild
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Review – Was ist JNDI?
•
Universelle Client-seitige Java-Schnittstelle zum Zugriff auf
Namensdienste
– unterstützt alle möglichen Arten
– u.a. DNS, etc.
– LDAP-Verzeichnisdienste
– Namens- und Verzeichnisdienste von Business-Obektservern
•
besitzt eine Art von Treiberschnittstelle zum Zugriff auf
konkrete Dienste
– siehe Folie: wie bekomme ich einen Initial-Kontext
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Zentrale Schnittstelle: Context Interface
javax.naming.Context
void bind(Name name, Object object)
void bind(String name, Object object)
…
Context createSubContext(Name name)
Context createSubContext(String name)
…
Object lookup(Name name)
Object lookup(String name)
void rebind(Name name, Object object)
void rebind(String name, Object object)
…
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Wie bekomme ich nochmal einen Root-Kontext?
Context ctx = new InitialContext()
// falls INITIAL_CONTEXT_FACTORY und PROVIDER_URL bereits definiert
// z.B. durch Setzen von java.naming.* Properties
// oder
Hashtable env=new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.cosnaming.CNCtxFactory");
env.put(Context.PROVIDER_URL, "iiop://localhost:1050");
Context ctx=new InitialContext(env)
• Factory-Klasse definiert "Art des Namensdienstes",
auf den zugegriffen werden soll
• PROVIDER_URL die URL zum Zugriff
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Und wie frage ich eine Resource ab?
•
JNDI-Verzeichnisse können (je nach Art) eine Vielzahl von
Resourcen zurückliefern
•
Datenbanken stellen solche Resourcen da
•
Man kann den Zugriff auf eine Datenbank durch DataSourceObjekte kapseln (Verbindungsdetails)
•
Und diese in Verzeichnissen bereitstellen
Context ctx = new InitialContext();
DataSource ds= (DataSource)ctx.lookup("jdbc/mondialDB");
Connection con = ds.getConnection();
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Und wie war das nochmal mit Entfernten
Objekten?
• EJB (Enterprise Java Beans) können RMI-IIOP
basierte entfernte Schnittstelle anbieten
• Zugriff von Clientseite erfolgt dabei typischer Weise
über JNDI
Context ctx = new InitialContext();
CalculatorRemote rechner=
(CalculatorRemote)ctx.lookup(" Calculator/remote ");
System.out.println("2 + 5 =" + rechner.add(2,5));
Clemens Düpmeier, 16.05.2016
Forschungszentrum Karlsruhe
Technik und Umwelt
Zusammenfassung
•
Namensdienste eignen sich herorragend dazu, um Resourcen von
ihren Clients zu entkoppeln
– Resourcen können logisch benannt werden
– Applikationen werden dadurch ortstransparent
– Mit Namensdiensten kann man Lastverteilung / Skalierbarkeit
erreichen
– Client muss Adressdetails nicht kennen und diese können
konfigurierbar gehalten werden
– Der Client wird von Implementierungsdetails entkoppelt
– Durch Anwendung des Proxy-Design-Patterns kann man Serverseitige Resourcemanagement Funktionalitäten integrieren und
rekonfigurieren, ohne die Clients neu übersetzen zu müssen
Clemens Düpmeier, 16.05.2016
Herunterladen