Client/Server-Programmierung WS 2013/2014 Roland Wismüller Betriebssysteme / verteilte Systeme .d [email protected] e rolanda Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 8. November 2013 Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) i Client/Server-Programmierung WS 2013/2014 1 Grundlagen: Wiederholung Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) 18 1 Grundlagen: Wiederholung ... Inhalt ➥ Architekturmodelle ➥ Zeit und Zustand in verteilten Systemen ➥ Middleware ➥ Java RMI Roland Wismüller Betriebssysteme / verteilte Systeme 19 Client/Server-Programmierung (1/13) 1.1 Architekturmodelle Client/Server-Modell ➥ Asymmetrisches Modell: Server stellen Dienste bereit, die von (mehreren) Clients genutzt werden können ➥ Server verwalten i.a. Ressourcen (zentralisiert) Client Aufruf Ergebnis Client Aufruf Server Server Ergebnis Prozeß Rechner Server kann selbst wieder als Client agieren ➥ Häufigstes Modell für verteilte Anwendungen (ca. 80 %) Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) 20 1.1 Architekturmodelle ... Client/Server-Modell ... ➥ I.A. nebenläufige Anfragen mehrerer Client-Prozesse an den Server-Prozeß Start Client Anfrage (request) Ende Antwort (reply) Zeit Server Client ➥ Beispiele: Dateiserver, WWW-Server, DB-Server, DNS-Server, ... Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) 21 1.1 Architekturmodelle ... n-Tier-Architekturen ➥ Verfeinerungen der Client/Server-Architektur ➥ Modelle zur Verteilung einer Anwendung auf die Knoten einer verteilten Systems ➥ Vor allem bei Informationssystemen verwendet ➥ Tier (engl. Schicht / Stufe) kennzeichnet einen unabhängigen Prozeßraum innerhalb einer verteilten Anwendung ➥ Prozeßraum kann, muß aber nicht physischem Rechner entsprechen ➥ mehrere Prozeßräume auf einem Rechner möglich Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) 22 1.1 Architekturmodelle ... 2-Tier-Architektur ➥ Client- und Server-Tier ➥ Keine eigene Tier für die Anwendungslogik Präsentation Client−Tier Anwendungslogik (Verteilung auf Client− und Server−Tier variiert) Server−Tier Datenhaltung ➥ Vorteil: einfach, performant ➥ Nachteil: schwer wartbar, schlecht skalierbar Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) 23 1.1 Architekturmodelle ... 3-Tier-Architektur Client−Tier Präsentation Middle−Tier Anwendungslogik Server−Tier Datenhaltung ➥ Standard-Verteilungsmodell für einfache Web-Anwendungen: ➥ Client-Tier : Web-Browser zur Anzeige ➥ Middle-Tier : Web-Server mit Servlets / JSP / ASP ➥ Server-Tier : Datenbank-Server ➥ Vorteile: Anwendungslogik zentral administrierbar, skalierbar Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) 24 1.1 Architekturmodelle ... (Animierte Folie) Beispiel: typische Internet-Anwendung DMZ Internet 1 0 Web− Client Firewall 1 0 0 1 00 11 00 11 00 1 11 00 11 0 11 1 0 00 00 11 0 1 0 1 00 11 00 11 000 111 000 111 0111 1 0000 1 000 000 111 111 000 111 Firewall Web− Client Intranet 11 00 00 11 00 11 00 11 000 111 000 111 000 000 111 111 000 111 000 111 Web− Server Tier 1 Roland Wismüller Betriebssysteme / verteilte Systeme 11 00 00 11 00 11 00 11 000 111 000 111 000 111 000 111 Web− Server Anwen− dungs− Server Daten− bank− Server Tier 2 Tier 3 Tier 4 Client/Server-Programmierung (1/13) 25 1.2 Zeit und Zustand in verteilten Systemen Was ist der Unterschied zwischen einem verteilten System und einem Ein-/Mehrprozessorsystem? ➥ Ein- bzw. Mehrprozessorsystem: ➥ nebenläufige Prozesse: pseudo-parallel durch time sharing bzw. echt parallel ➥ globale Zeit: alle Ereignisse in den Prozessen lassen sich zeitlich eindeutig ordnen ➥ globaler Zustand: zur jeder Zeit kann ein eindeutiger Zustand des Systems angegeben werden ➥ Verteiltes System ➥ echte Parallelität ➥ keine globale Zeit ➥ kein eindeutiger globaler Zustand Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) 26 1.2 Zeit und Zustand in verteilten Systemen ... Globale Zeit ➥ Auf Ein-/Mehrprozessorsystem ➥ jedem Ereignis kann (zumindest theoretisch) ein eindeutiger Zeitstempel derselben lokalen Uhr zugeordnet werden ➥ bei Mehrprozessorsystemen: Synchronisation am gemeinsamen Speicher ➥ In verteilten Systemen: ➥ viele lokale Uhren (eine pro Knoten) ➥ exakte Synchronisation der Uhren (prinzipiell!) nicht möglich ➥ ⇒ Reihenfolge von Ereignissen auf verschiedenen Knoten nicht (immer) eindeutig zu ermitteln ➥ (vgl. spezielle Relativitätstheorie) Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) 27 1.2 Zeit und Zustand in verteilten Systemen ... Eine Auswirkung der Verteiltheit ➥ Szenario: zwei Prozesse beobachten zwei andere Prozesse x Beobachter A Prozess 1 x Prozess 2 Beobachter B y z y z z x y ➥ Die Beobachter sehen die Ereignisse ggf. in unterschiedlicher Reihenfolge! ➥ Problem z.B., falls die Beobachter replizierte Datenbanken und die Ereignisse Datenbank-Updates sind ➥ Replikate sind nicht mehr konsistent! Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) 28 1.2 Zeit und Zustand in verteilten Systemen ... Die Lamport’sche Kausalitätsrelation ➥ In zwei Fällen kann die Reihenfolge von Ereignissen auch ohne globale Uhr bestimmt werden: ➥ falls die Ereignisse im selben Prozeß sind, reicht lokale Uhr ➥ das Senden einer Nachricht ist immer vor deren Empfang ➥ Definition der Kausalitätsrelation → (happened before) ➥ falls Ereignisse a, b im selben Prozeß i sind und ti (a) < ti (b) (ti : Zeitstempel mit Uhr von i), so gilt a → b ➥ falls a das Senden einer Nachricht und b deren Empfang ist, so gilt a → b ➥ falls a → b und b → c, so gilt auch a → c (Transitivität) ➥ a → b bedeutet, daß b kausal von a abhängen kann Roland Wismüller Betriebssysteme / verteilte Systeme 29 Client/Server-Programmierung (1/13) 1.2 Zeit und Zustand in verteilten Systemen ... Beispiele a Prozeß 4 k g c Prozeß 2 Prozeß 3 i b Prozeß 1 d f h j e l ➥ Hier gilt u.a.: ➥ b → i und a → h (Ereignisse im selben Prozeß) ➥ c → d und e → f (Senden / Empfang einer Nachricht) ➥ c → k und a → i (Transitivität) ➥ g 6→ l und l 6→ g: l und g sind nebenläufig (concurrent) Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) 30 1.2 Zeit und Zustand in verteilten Systemen ... Globaler Zustand: Ein Beispiel zur Motivation ➥ Szenario: Peer-to-Peer -Anwendung, Prozesse senden sich gegenseitig Aufträge ➥ Frage: wann kann die Anwendung terminieren? ➥ Falsche Antwort: wenn kein Prozeß mehr einen Auftrag bearbeitet ➥ Grund: Aufträge können noch in Nachrichten unterwegs sein! Prozeß 1 Prozeß 2 Auftrag idle idle ➥ Weitere Anwendungen: verteilte Garbage-Collection, verteilte Deadlock -Erkennung, ... Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) 31 1.2 Zeit und Zustand in verteilten Systemen ... ➥ Wie bestimmt sich der Gesamtzustand eines verteilten Prozeßsystems? ➥ naiv: Summe der Zustände aller Prozesse (falsch!) ➥ Zwei Aspekte müssen beachtet werden: ➥ Nachrichten, die noch in Übertragung sind ➥ müssen mit in den Zustand aufgenommen werden ➥ Fehlen einer globalen Zeit ➥ ein Globalzustand zur Zeit t kann nicht definiert werden! ➥ Zustände der Prozesse beziehen sich immer auf lokale (und damit unterschiedliche) Zeiten ➥ Frage: Bedingung an die lokalen Zeiten? ⇒ konsistente Schnitte Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) 32 1.2 Zeit und Zustand in verteilten Systemen ... (Animierte Folie) Konsistente Schnitte ➥ Ziel: bilde aus (nicht zeitgleich ermittelten) lokalen Zuständen einen sinnvollen globalen Zustand ➥ Prozesse modelliert durch Folgen von Ereignissen: Prozeß 1 Prozeß 2 Prozeß 3 konsistente Schnitte inkonsistenter Schnitt ➥ Schnitt: betrachte in jedem Prozeß ein Präfix der Ereignisfolge ➥ Konsistenter Schnitt: ➥ falls der Schnitt den Empfang einer Nachricht beinhaltet, so beinhaltet er auch das Senden dieser Nachricht Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) 33 1.3 Middleware Verteilte Anwendung (VA) VA− Komponente VS−Knoten VA− Komponente Netz VS−Knoten Verteiltes System (VS) Verteilte Anwendung (VA) VA− VA− Komponente Komponente Middleware Netz Middleware VS−Knoten VS−Knoten Verteiltes System (VS) ➥ VA nutzt VS für Kommunikation zwischen ihren Komponenten ➥ VSe bieten i.a. nur einfache Kommunikationsdienste an ➥ direkte Nutzung: Netzwerkprogrammierung ➥ Middleware bietet intelligentere Schnittstellen ➥ verbirgt Details der Netzwerkprogrammierung Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) 34 1.3 Middleware ... ➥ Middleware ist Schnittstelle zwischen verteilter Anwendung und verteiltem System ➥ Ziel: Verbergen der Verteilungsaspekte vor der Anwendung ➥ u.a. Zugriffs- und Orts-Transparenz ➥ Middleware kann auch Zusatzdienste für Anwendungen bieten ➥ starke Unterschiede bei existierender Middleware ➥ Unterscheidung: ➥ kommunikationsorientierte Middleware ➥ (nur) Abstraktion von der Netzwerkprogrammierung ➥ anwendungsorientierte Middleware ➥ neben Kommunikation steht Unterstützung verteilter Anwendungen im Mittelpunkt Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) 35 1.3.1 Kommunikationsorientierte Middleware ➥ Fokus: Bereitstellung einer Kommunikationsinfrastruktur für verteilte Anwendungen ➥ Aufgaben: ➥ Kommunikation ➥ Behandlung der Heterogenität ➥ Fehlerbehandlung Anwendung Kommunikationsorientierte Middleware Betriebssystem / verteiltes System Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) 36 1.3.1 Kommunikationsorientierte Middleware ... Entfernter Prozeduraufruf (RPC, Remote Procedure Call) ➥ Ermöglicht einem Client den Aufruf einer Prozedur in einem entfernten Server-Prozeß Client− Prozeß y = P(x); Eingabeparameter Resultate P(a) { Server− ... return b; Prozeß } ➥ Kommunikation nach Anfrage / Antwort-Prinzip Entfernter Methodenaufruf (RMI, Remote Method Invocation) ➥ Ermöglicht einem Objekt, Methoden eines entfernten Objekts aufzurufen ➥ Prinzipiell sehr ähnlich zu RPC Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) 37 1.3.1 Kommunikationsorientierte Middleware ... Gemeinsame Grundkonzepte entfernter Aufrufe ➥ Client und Server werden durch Schnittstellendefinition entkoppelt ➥ legt Namen der Aufrufe, Parameter und Rückgabewerte fest ➥ Einführung von Client-Stubs und Server-Stubs (Skeletons) als Zugriffsschnittstelle ➥ werden automatisch aus Schnittstellendefinition generiert ➥ IDL-Compiler, Interface Definition Language ➥ sind verantwortlich für Marshalling / Unmarshalling sowie für die eigentliche Kommunikation ➥ realisieren Zugriffs- und Ortstransparenz Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/13) 38 1.3.1 Kommunikationsorientierte Middleware ... Funktionsweise der Client- und Server-Stubs (RPC) Server−Prozeß Client−Prozeß Client−Stub y=P(x) Server−Skeleton P(a) { Argumente a in Nachricht m1 packen send(Server, m1); receive(Server, m2) ; Ergebnis b aus Nach− richt m2 auspacken } return b; Roland Wismüller Betriebssysteme / verteilte Systeme while (true) { receive(m1); client=sender(m1); Argumente x aus Nach− richt m1 auspacken y = P(x) ; Ergebnis y in Nach− richt m2 packen send(client, m2); } P(a) { ... return b; } Client/Server-Programmierung (1/13) 39 Client/Server-Programmierung WS 2013/2014 25.10.2013 Roland Wismüller Betriebssysteme / verteilte Systeme .d [email protected] e rolanda Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 8. November 2013 Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/13) i 1.3.1 Kommunikationsorientierte Middleware ... Basis von RMI: Das Proxy-Pattern ➥ Client arbeitet mit Stellvertreterobjekt (Proxy) des eigentlichen Serverobjekts ➥ Proxy und Serverobjekt implementieren dieselbe Schnittstelle ➥ Client kennt / nutzt lediglich diese Schnittstelle <<interface>> Schnittstelle Client Proxy Roland Wismüller Betriebssysteme / verteilte Systeme Objekt 40 Client/Server-Programmierung (2/13) 1.3.1 Kommunikationsorientierte Middleware ... Ablauf eines entfernten Methodenaufrufs Client−Rechner Server−Rechner Client Server Selbe Schnitt− stelle wie beim Objekt Client ruft eine Methode auf Proxy Client−BS Netzwerk Roland Wismüller Betriebssysteme / verteilte Systeme Skeleton ruft dieselbe Methode für das Objekt auf Objekt Status Methode Skeleton Schnitt− stelle Server−BS Verpackter Aufruf wird über das Netzwerk weitergegeben (Objekt−ID, Methodenname, Parameter) Client/Server-Programmierung (2/13) 41 1.3.1 Kommunikationsorientierte Middleware ... Erstellung eines Client/Server-Programms Server− Prozeduren Compiler Server Server−Skel. Schnittstellen− beschreibung RPC/RMI Laufzeit− Bibliothek IDL− Compiler Client−Stubs Client− Programm Compiler Client ➥ Gilt prinzipiell für alle Realisierungen entfernten Aufrufe Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/13) 42 1.3.2 Anwendungsorientierte Middleware ➥ Setzt auf kommunikationsorientierter Middleware auf ➥ Erweitert diese um: ➥ Laufzeitumgebung ➥ Dienste ➥ Komponentenmodell Anwendungs− Anwendungs− Anwendungs− komponente komponente komponente Komponentenmodell Dienste Laufzeitumgebung Dienste Kommunikationsinfrastruktur Betriebssystem / verteiltes System Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/13) 43 1.3.2 Anwendungsorientierte Middleware ... Laufzeitumgebung ➥ Ressourcenverwaltung ➥ Pooling von Prozessen, Threads, Verbindungen ➥ Steuerung der Nebenläufigkeit ➥ Verbindungsverwaltung ➥ Verbesserung der Verfügbarkeit ➥ Replikation, Clustering ➥ Sicherheitsmechanismen ➥ Authentifizierung und Autorisierung ➥ Vertraulichkeit und Integrität Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/13) 44 1.3.2 Anwendungsorientierte Middleware ... Dienste ➥ Namensdienst (Verzeichnisdienst) ➥ Zuordnung von Namen zu Referenzen (Adressen) ➥ Sitzungsverwaltung ➥ Transaktionsverwaltung ➥ Persistenzdienst ➥ z.B. objektrelationaler Mapper (OR-Mapper) Komponentenmodell ➥ Komponentenbegriff, Schnittstellenverträge, Laufzeitumgebung Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/13) 45 1.4 Java RMI ➥ Java RMI ist fester Bestandteil von Java ➥ erlaubt Nutzung entfernter Objekte ➥ Stub- und Skeleton-Klassen werden automatisch aus Schnittstellendefinition (Java Interface) generiert ➥ ab JDK 1.5 dynamisch zur Laufzeit ➥ Namensdienst: RMI Registry ➥ Verteilte Garbage-Collection Roland Wismüller Betriebssysteme / verteilte Systeme 46 Client/Server-Programmierung (2/13) 1.4 Java RMI ... Beispiel: Hello World Client−JVM Interface interface Hello { String sayHello(); } Client−Klasse class HelloClient { ... Hello h; ... s = h.sayHello(); ... Roland Wismüller Betriebssysteme / verteilte Systeme Server−JVM Server−Klasse class HelloServer implements Hello { String sayHello() { return "Hello World"; } ... Client/Server-Programmierung (2/13) 47 1.4 Java RMI ... Hello-World Interface import java.rmi.Remote; import java.rmi.RemoteException; public interface Hello extends Remote { String sayHello() throws RemoteException; } Marker−Schnittstelle , enthält keine Methoden, markiert Interface als RMI−Schnittstelle Roland Wismüller Betriebssysteme / verteilte Systeme RemoteException zeigt Fehler im entfernten Objekt bzw. bei Kommu− nikation an Client/Server-Programmierung (2/13) 48 1.4 Java RMI ... Hello-World Server import java.rmi.*; import java.rmi.server.UnicastRemoteObject; public class HelloServer extends UnicastRemoteObject implements Hello { public HelloServer() throws RemoteException { super(); } public String sayHello() { return "Hello World!"; Remote Methode } Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/13) 49 1.4 Java RMI ... Hello-World Server ... public static void main(String args[]) { try { HelloServer obj = new HelloServer(); Naming.rebind("rmi://localhost/Hello−Server", obj); } catch (Exception e) { System.out.println("Error: " + e.getMessage()); e.printStackTrace(); } } } Erzeugen des Server−Objekts Registrieren des Server−Objekts unter dem Namen "Hello−Server" beim Name−Server (RMI−Registry, lokaler Rechner, Port 1099) Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/13) 50 1.4 Java RMI ... Hello-World Client import java.rmi.*; public class HelloClient { public static void main(String args[]) { Objektreferenz vom try { Name−Server holen Hello obj = (Hello)Naming.lookup("rmi://bspc02/Hello−Server"); String message = obj.sayHello(); System.out.println(message); } Aufruf der Methode catch (Exception e) { des entfernten Objekts ... } } } Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/13) 51 1.4 Java RMI ... Übersetzen und Starten des Systems HelloClient.java Hello.java javac javac Hello.class Hello.class bis JDK 1.4 HelloClient.class Client−Seite Roland Wismüller Betriebssysteme / verteilte Systeme HelloServer.java HelloServer.class rmic Server−Seite HelloServer_Stub.class Client/Server-Programmierung (2/13) 52 1.4 Java RMI ... Parameterübergabe ➥ Übergabe von Parametern an Remote-Methoden erfolgt ➥ entweder über call-by-value ➥ für Werttypen und serialisierbare Objekte ➥ oder über call-by-reference ➥ für Objekte, die Remote implementieren ➥ Entscheidung wird z.T. erst zur Laufzeit getroffen! ➥ Rückgabe des Ergebnisses folgt selben Regeln wie Parameterübergabe Roland Wismüller Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/13) 53