Realisierung verteilter Anwendungen: Teil 4
Beim vorigen Mal: RMI und Grundlagen von CORBA
Inhalt heute Verteilung und Objektorientierung (Voyager) Spontane Vernetzung (Jini)
Lernziele: Verständnis der Probleme und Lösungsansätze bei
Objektmigration und spontaner Vernetzung
Ralf Möller, FH-Wedel
Voyager
Zu Java kompatible Laufzeitumgebung und Bibliothek, die auf eine umfassende Lösung für sehr viele Bereiche und Probleme der Programmierung verteilter Systeme zielt
Funktions- und Leistungsumfang wächst mit jeder neuen Version
In dieser Vorlesung nur grundlegende Techniken
Basistechniken (1)
Entfernte Objekte Erzeugung eines entfernten Objekts aus einem
lokalen Objekt zur Laufzeit und zu jeder Java-KlasseEntfernte Referenzierung
Transparente Referenzierung entfernter Objekte Typ: gemeinsames Interface
Entfernte Erzeugung Erzeugung von Objekten in einer anderen VM
(statt nur Erzeugung lokaler Objekte) Automatische Erzeugung von lokalen Stellvertretern
Basistechniken (2)
Verteilte Garbage Collection Löschung erst, wenn weder lokale noch entfernte
Referenz auf Objekte existierenAusnahmebehandlung
Weiterleitung von Ausnahmen, die bei einem entfernten Objekt auftreten, an ein lokales Objekt
Namensdienst Bekanntmachung von entfernten Objekten über
Namen
Ergänzende Techniken
ObjektmigrationMobile AgentenApplet-zu-Applet-KommunikationGruppenkommunikation (Multicast)Aktivierung von Objekten aus DBDatenbankunabhängige verteilte Persistenz
Voyager-Laufzeitumgebung
Laufzeitumgebung starten:Voyager.startup(String port) auch: sun> voyager <port>
Quellcode nachladen: VoyagerClassLoader.addResourceLoader(String URL) auch: sun> voyager 8000 -c file://usr/local/www/classes/ lin> voyager 7000 -c http://www.fh-wedel.de/classes/
Integrierter HTTP-Server: ClassManager.enableResourceServer() auch: sun> voyager 8000 -r
win> voyager 9000 -c http://sun.fh-wedel.de:8000/
Entfernte Objekte
Erzeugung von Proxies zur Laufzeit nicht wie bei RMI zur Übersetzungszeit vorbereitet ähnlich wie bei RMI über lokalen Stellvertreter
(Proxy)
reference invocationproxy local
localinvocation
Proxy.of("B") B
reference invocationproxy local
localinvocation
Proxy.of("B") B
Beispiel: Baseball mit Voyager
public class Ball { public void hit() {
System.out.println("Ball has been hit") }}public interface IBall {
public void hit(); }public class Ball implements IBall,
Serializable { ... }
Tool zur Erzeugung von Interfaces: igen
Typkompatibles Proxy zu Interface erzeugenLokale Erzeugung
Proxy.of(Object obj)Namensdienst
Namespace.bind("8000/Ball", iball)Entfernte Erzeugung
Factory.create(String classname, String url)Beispiel:
Ball ball = new Ball(); IBall iball = (IBall) Proxy.of(ball) IBall iball = (IBall) Factory.create("Ball", "sun:8000")
Fortsetzung des Beispielsimport com.objectspace.voyager.*;public class Bat {
public void play(IBall ball) { ball.hit() } public static void main(String args[]) {
try { Voyager.startup(); Bat bat = new Bat; IBall ball = (IBall) Factory.create("Ball","sun:8000"); bat.play(ball); } catch ( ... ) { ... } Voyager.shutdown(); } }
Konstruktor ohne Argument
Entfernte Konstruktoren mit Argumenten
Object[] arguments = new Object[]{new Integer(5)};
IBall ball = (IBall) Factory.create("Ball", arguments, "sun:8000");
Konstruktor mit Argumente
Objektmigration (1)
Anwendungsgebiete: Zeitaufwand minimieren Lastbalancierung Besitz- oder Verantwortungswechsel Mobile Geräte (bzw. nicht-permanent verfügbare
Geräte)
Objektmigration (2)
Entfernter Zugriff vs. Migration
Objektmigration (3)
Protokoll für die Migration try { IMobility mobileObj = MobilityOf(a); mobileObj.moveTo("vodka.fh-wedel.de:8000"); } catch (MobilityException e) { ... }
Probleme bei der Migration (1)
Migration durch Kopie simulieren?Durch Migration muß Identität erhalten
bleibenLaufzeitumgebung stellt Korrektheit von
"alten" Referenzen auf migrierte Objekte sicher
D d A a
IC cA a C c
sun lin mac
Probleme bei der Migration (1)
Migration durch Kopie simulieren?Durch Migration muß Identität erhalten
bleibenLaufzeitumgebung stellt Korrektheit von alten
Referenzen auf migrierte Objekte sicher
D d A a
IC cA a C c
sun lin mac
A aC c
Probleme bei der Migration (2)
Was passiert mit referenzierten Objekten?KopiersemantikEventuell problematisch für "normale" ObjekteUnproblematisch für referenzierte Proxies
D d A a
IC cA a C c
sun lin mac
Probleme bei der Migration (2)
Was passiert mit referenzierten Objekten?KopiersemantikEventuell problematisch für "normale" ObjekteUnproblematisch für referenzierte Proxies
D d
IC cA a C c
sun lin mac
A a
IC cA a
Behandlung laufender Aufrufe
import java.io.*;public class Ball implements IBall, Serializable
{ synchronized public void hit() {
System.out.println("Ball has been hit") }
}
Gruppenkommunikation
Multicast oder Publish-Subscribe-MechanismusVoyager spaces and subspaces
Subspace localSubspace = new Subspace()Entfernter Zugriff über Namensraum
Isubspace remoteSubspace = (Isubspace) Namespace.lookup("//sun:9000/Subspace");localSubspace.connect(remoteSubspace);
localSubspace.add(client);
Räume und Unterräume
Space Rechner Subspace
sun lin
win mac nt
Verknüpfung
Verteilung von Nachrichten im Unterraum
Object[] parameter = new Object[]{param}; Multicast.invoke(subspace, "message", parameter,
"Class"); oder: IClass mcastProxy =
localSubspace.getMulticastProxy("Class"); mcastProxy.message(param);
sun
Nachricht Rechner
Objekt
Subspace
Mobile Agenten: Kommunikationsschema
Ohne Agenten vs. mit Agenten
Bewegung und Aktion von Agenten
Vorher: Explizite Migration von Objeken (Unterstützung der Methode moveTo)
Aus welcher Motivation heraus werden Agenten bewegt?
"Eigeninitiative!"BDI-Architektur
Beliefs Desires Intentions
Wie kann man denndas hinkriegen???
Mobile Agenten: Einsatzgebiete
Verteilte InformationssucheBörsenbeobachterElektronischer PreisvergleichMehrwertleistungenJust-in-Time-Produktion
Mobile Agenten: Bewertung
Vorteile: Reduktion der Netzwerklast Möglichkeiten zum Offline-Gehen des
Auftraggebers während der Agent aktiv ist Flexiblere Reaktion auf Umgebung möglich als z.B.
RMINachteile:
Komplexität der Programmierung/Erstellung Infrastruktur erforderlich Sicherheitsprobleme
(für Agenten und für jeweilige Wirtsumgebung)
Dienste in einer Umgebung
Internet
gateway
PDA
service
Music service
serviceDiscovery
Alarm
Camera
Guestsdevices
LaptopTV/PC
Hotel wirelessnetwork
Diensterbringung durch Server
Konfigurierungsproblematik
Spontane Vernetzung
Eintreten in eine Gruppe Dienste anbieten / anmelden für Gruppe Nachfrage nach Diensten einer Gruppe Mit einem Dienstinteressenten in Kontakt treten Konkreten Dienst für bestimmte Zeit zusagen Kein Fehler: sich einfach entfernen, wenn gerade
keiner auf eine konkrete Diensterbringung wartet
kein Fehler: sich einfach entfernen, wenn die Zeit für zugesagte Dienste abgelaufen ist
Fehler: zugesagten Dienst nicht erbringen
Jini: Registrierung
Jini: Lookup und Leasing
Was ist eine Gruppe / Föderation?
intranet
ISP
desktop computer:
backbone
satellite link
server:
network link:
Was ist eine Gruppe / Föderation?
the rest of
email server
Web server
Desktopcomputers
File server
router/firewall
print and other servers
other servers
Local areanetwork
email server
the Internet
Multicast Request: Service Announcement
Datagramm-Paket auf 224.0.1.85 und Port 4160
Client
LookupService
ServiceProvider
Service ObjektService Attributes
Nicht überRoutergeleitet
Multicast Request: Service Announcement
Datagramm-Paket auf 224.0.1.85 und Port 4160
Client
LookupService
ServiceProvider
Service ObjektService Attribute
Service ProxyService Attribute
Multicast Request: Service Discovery
Datagramm-Paket auf 224.0.1.85 und Port 4160
Client
LookupService
ServiceProvider
Service ObjektService AttributesService Attributes
Service ProxyService Attributes
Multicast Request: Service Discovery
Datagramm-Paket auf 224.0.1.85 und Port 4160
Client
LookupService
ServiceProvider
Service ObjektService AttributesService Attributes
Service ProxyService Attributes
Service Proxy
Multicast Request: Lookup Announcement
Datagramm-Paket auf 224.0.1.84 und Port 4160
LookupService
Nicht überRoutergeleitet
Softwarepakete in Java
import java.rmi.*;import java.rmi.server.*;import net.jini.core.lookup.*;import sun.com.jini.lookup.*;import sun.com.jini.lease.*;
siehe:Java in verteilten SystemenMarko Boger
Dienste: Beispiel Baseball
public class Ball extends UnicastRemoteObject implements RemoteBall ServiceIDListener { public Ball throws RemoteException { super(); } public void serviceIdNotify(ServiceID id) {
System.out.println("ServiceId is " + id); }
public hit() { System.out.println("Ball has been hit.")}
}
Das Interface RemoteBall
import java.rmi.*public interface RemoteBall extends Remote
{ public void hit() throws RemoteException;
}
Das Anmelden von Diensten (1)
Klasse JoinManager und entspr. KonstruktorÜbergabe des als Service angebotenen
Objekts, dessen Beschreibung, eines Callback-Objektes und eines Leasing Managers:
Das Anmelden von Diensten (2)public class BallStarter {
public static void main(String[] args) {try {
System.setSecurityManager(new RMISecurityManager ()); RemoteBall ball = (RemoteBall) new Ball();LeaseRenewalManager renewal = new LeaseRenewalManager();Entry[] attributes = new Entry[]{ new Name("Jini enabled ball") }; JoinManager join = new JoinManager(ball, attributes, (Ball) ball,
renewal); System.out.println("Ball started and registered at Lookup-Server");
} catch (Exception e) { e.printStackTrace(); } }
}
Lookup von Diensten: Suche durch Muster
Klasse ServiceTemplate und entspr. Konstruktor
Übergabe an Konstruktor entweder eines ServiceID-Objekts oder einer Service-Beschreibung:
einer Menge von Klassen oder einer Menge von Attribut-Wert-Paaren
Beispiel mit Service-Beschreibung als Klasse: Class[] classes = new Class[] { RemoteBall.class };ServiceTemplate template =
new ServiceTemplate(null, classes, null);
Zugriff auf den Dienstvermittler
Repräsentation des Dienstvermittlers als Objekt
Dienstvermittler enthält RegistraturSuchmuster wird an Registratur übergebenBeispiel:
LookupLocator l = new LookupLocator("jini://sun");
ServiceRegistrar r = l.getRegistrar(); RemoteBall = b = (RemoteBall)
r.lookup(template);
Aufruf eines Dienstes (1)
import java.rmi.*import net.jini.core.discovery.*;import net.jini.core.lookup.*;public class Bat {
public void play(RemoteBall ball) { try { ball.hit(); System.out.println("I hit the ball"); } catch (RemoteException e) { System.out.println(e) }}
Aufruf eines Dienstes (2)
public static void main(String[] args) { Bat bat = new Bat(); try { System.setSecurityManager(new RMI SecurityManager ()); LookupLocator locator = new LookupLocator("jini://sun"); ServiceRegistrar registrar = locator.getRegistrar(); Class[] classes = new Class { RemoteBall.class }; ServiceTemplate template = new ServiceTemplate(null,
classes, null); RemoteBall remoteBall = (RemoteBall) registrar.lookup(template); bat.play(remoteBall); } catch (Exception e) { e.printStackTrace(); }
}}
Starten und Aufrufen eines Dienstes
HTTP-Server, RMI-Daemon und Jini Lookup-Server starten java -cp /usr/remote/java/jini1_0/lib/jini-examples.jar
com.sun.jini.example.service.StartService Server:
sun> java -Djava.rmi.server.codebase=http://localhost:8000/batBall/ -Djava.security.policy=/jini1_0/batball/policy.all BallStarter
sun| Ball started an registered at Lookup-Server sun| ServiceId is f7a17bde-e40b-42cb-94d4-bb6d37a999b8
Client: lin> java -Djava.security.policy=/jini1_0/batball/policy.all Bat sun| Ball has been hit lin| I hit the ball
Leasing
public interface Lease { long getExpiration(); void renew (long duration) throws LeaseDeniedException,
UnknownLeaseException, RemoteException;
void cancel() throws UnknownLeaseException, RemoteException;
}Vorher verwendete Klasse LeaseRenewalManager
erneuert Leasing-Verträge automatisch
Auch beim nächsten Mal ...
... gibt's wieder Neues in der Diskussion über Middleware Datenbankanschluß (JDBC) Komponentenorientierte Softwarekonstruktion
(Beans) Multitier-Architekturen (J2EE)
Enterprise Java Beans Servlets, Java Server Pages XML