Post on 12-Jan-2016
description
transcript
1
Softwareentwicklung mit .NETTeil 6
.NET Remoting
Dr. Ralph Zeller
2
Verteilte Applikationen Früher waren Applikationen eigenständige Einheiten
mit wenig Integration.
Heute sind Applikationen in Komponenten aufgeteilt, die miteinander kommunizieren.
Applikation
Code und Daten
3
Kommunikation unter Server Applikationen• Manche sind in der Nähe (Intranet)
• Manche weiter weg (Internet)
• Manche hinter Firewalls
• Manche benutzen gleiche Protokolle (HTTP, SOAP), laufen aber auf unterschiedlichen Plattformen
• Manche benutzen gleiche Protokolle und laufen auf derselben Plattform (z.B. .NET)
Verteilte ApplikationenKommunikation im Netzwerk
4
Zwischen .NET und Non-.NET Applikationen• Verwende Web Service Protokolle
• HTTP, SOAP, WSDL
Zwischen .NET Applikationen• Verwende wenn möglich Binärprotokolle
• Binär = High Speed
• Verwende wenn nötig Web Service Protokolle
• HTTP um Firewalls zu überwinden
Verteilte .NET App.
5
Was ist .NET Remoting?
Remoting ist der Zugriff auf Objekte über Grenzen hinweg.
Grenzen können unterschiedliche Maschinen, Prozesse, Application Domains oder Kontexte sein.
Marshaling heißt Objekte für den Transport über Grenzen hinweg aufzubereiten.
6
Appdomains Die CLR abstrahiert OS-Prozesse und
arbeitet mit „virtuellen Prozessen“
Isolierter Ausführungsraum für Anwendungen
Unabhängig vom OS Konzept für Prozesse und Threads
Diese virtuellen Prozesse werden Appdomains genannt
Appdomains dienen als „Ausführungscontainer“ für Assemblies
7
Appdomains • Eine Appdomain existiert in genau einem Prozess
• Ein Prozess kann mehrere AppDomains beinhalten
• Aufrufe über AppDomain-Grenzen hinweg erfordert Marshaling
Prozess 1 Prozess 2
AppDomain 1 AppDomain 3AppDomain 2
Objekt Objekt
Objekt
Objekt
Objekt
Marshaling Marshaling
8
AppDomain erzeugen
using System;
public class MyApp{ public static int Main(string[] args) { AppDomain child = AppDomain.CreateDomain("childapp", null, null); return child.ExecuteAssembly("yourapp.exe", null, args); }}
using System;
public class MyApp{ public static int Main(string[] args) { AppDomain child = AppDomain.CreateDomain("childapp", null, null); return child.ExecuteAssembly("yourapp.exe", null, args); }}
• Erzeuge neue AppDomain im aktuellen Prozess
• Führt Assembly in neuer AppDomain aus
• Aufruf blockiert Main Methode, bis yourapp.exe beendet ist
9
AppDomainBeispiel 1: Fibonacci Zahlen
10
Objekte und AppDomains
using System;using System.Runtime.Remoting;
public class MyApp {
public static int Main(string[] args) { AppDomain child = AppDomain.CreateDomain("sandbox", null,null); ObjectHandle oh = child.CreateInstance("foolib", "Target"); Target t = (Target)oh.Unwrap(); t.DoSomethingInteresting(); }}
using System;using System.Runtime.Remoting;
public class MyApp {
public static int Main(string[] args) { AppDomain child = AppDomain.CreateDomain("sandbox", null,null); ObjectHandle oh = child.CreateInstance("foolib", "Target"); Target t = (Target)oh.Unwrap(); t.DoSomethingInteresting(); }}
• CreateInstance erzeugt ein Objekt „Target“ in der AppDomain „sandbox“
• Rückgabe ist ein Objekthandle
• Unwrap() erzeugt ein Proxy Objekt, über das auf „Target“ zugegriffen wird
11
AppDom. und Marshaling Aufrufe über Domaingrenzen hinweg erfordert
Marshaling
Marshal by value:• Kopie des gesamten Objekts wird ans Ziel gesendet
• Keine Beziehung zum Original
• Klassen müssen mit dem Attribut [serializable] versehen werden
• oder das ISerializable Interface implementieren
Marshal by reference:• Objektreferenz wird ans Ziel gesendet
• Proxy verknüpft Referenz und Original
• Wird durch Ableitung einer Klasse von System.MarshalByRefObject erreicht
12
MarshalingBeispiel 2: Fibonacci Zahlen
13
Remoting Arichtektur Messages: Was wird gesendet
Channels: Wohin wird es gesendet
Formatter: Wie wird es gesendet
Proxy• Erzeugt aus Meth.aufrufen des Clients Messages
Dispatcher• Generiert am Server aus Messages Meth.aufrufe
ServerClient
Channel"Proxy"
Dis-patcher
14
Was: Messages Messages sind Objekte
• implementieren IMessage Interface
• einfache Wertetabellen {Schlüssel, Wert}
.NET Messagetypen:
• Konstruktoraufrufe
• Methodenaufrufe
• Vordefinierte Typen haben vordefinierte Einträge in der Wertetabelle
Aufrufvarianten
• Synchron: Aufruf mit sofortiger Antwort
• Asynchron: Aufruf mit verzögerter oder fehlender Antwort.
15
Wohin: Channels Channels transportieren Messages
TCP Channel• Für schnelle LAN Kommunikation
• Permanente Socket Verbindung
HTTP Channel• Für Kommunikation über Internet
• Keine permanente Verbindung notwendig
Custom Channels• IPX, Pipes
Channels können Sinks implementieren• Zum Überwachen und Logging
• Erweiterte Sicherheitsprüfungen
• Messages komprimieren
16
Wie: Formatter• Formatter serialisieren .NET Objekte in ein spezielles
Wire-Format
• .NET Formatter: SOAP und binärer Formatter
• eigene Formatter: IIOP, RMI, ORPC
• Werden von Channels dynamisch verwendet
• Wahl des Channels und Formatters hängt vom Unternehmensumfeld ab
Channel
Kodieren ins Wire-Format
Dekodieren aus Wire-Format
SOAP, Binary, eigene Formate
17
Zugriff auf Objekte
Remote Objekttypen
Server Konfiguration
Aktivierung und Zugriff
Client Konfiguration
18
Well known Objects (Server activated)• Singleton
• Es gibt eine einzige Objektinstanz für alle Clients
• Objekt wird mit Serverstart erzeugt
• Single-call
• Bei jedem Aufruf wird ein neues Objekt erzeugt und danach zerstört
• Auf Server Farmen kann dadurch die Last verteilt werden
Client-Activated Objects• Jeder Client bekommt sein eigenes Objekt
Remote Objekttypen
19
Server meldet Objekt im System an
Clients verbindet sich mit dem Objekt
Konfiguration über Files oder im Code über Methodenaufrufe
.NET Aktivierungsmodell ist nicht wie COM• .NET ist eher wie CORBA (!)
• ohne aktiven Endpunkt (Serverdienst) gibt es keine Verbindung
• Keine Registry Einträge
• .exe Server kann nicht remote-aktiviert werden
• Vereinfacht Remoting wesentlich
Well Known Objects
20
Server konfigurieren
// Channel mit HTTP als Transportprotokoll erzeugen// und auf Port 61500 anmelden.// Der Default Formatter des HTTP Channels ist SOAP.HttpChannel httpChannel = new HttpChannel(65100);ChannelServices.RegisterChannel(httpChannel);
// Das Well Known Objekt "FinanzServices" wird angemeldet.// Das Objekt wird über den Endpunt "FService" angesprochen.RemotingConfiguration.RegisterWellKnownServiceType (
typeof(FinanzServices),"FService",WellKnownObjectMode.Singleton );
// Channel mit HTTP als Transportprotokoll erzeugen// und auf Port 61500 anmelden.// Der Default Formatter des HTTP Channels ist SOAP.HttpChannel httpChannel = new HttpChannel(65100);ChannelServices.RegisterChannel(httpChannel);
// Das Well Known Objekt "FinanzServices" wird angemeldet.// Das Objekt wird über den Endpunt "FService" angesprochen.RemotingConfiguration.RegisterWellKnownServiceType (
typeof(FinanzServices),"FService",WellKnownObjectMode.Singleton );
Konfiguration im Sourcecode
Konfiguration über .config Datei
RemotingConfiguration.Configure("FService.exe.config");RemotingConfiguration.Configure("FService.exe.config");
21
Server .config Datei<configuration> <system.runtime.remoting> <application> <service> <wellknown mode="Singleton" type="FinazServices, FService" objectUri="FService" /> </service> <channels> <channel port=65100 ref="http"> <serverProviders> <formatter ref="binary" /> </serverProviders> </channel> </channels> </application> </system.runtime.remoting></configuration>
<configuration> <system.runtime.remoting> <application> <service> <wellknown mode="Singleton" type="FinazServices, FService" objectUri="FService" /> </service> <channels> <channel port=65100 ref="http"> <serverProviders> <formatter ref="binary" /> </serverProviders> </channel> </channels> </application> </system.runtime.remoting></configuration>
22
Service & ServerBeispiel 3: FinanzServices
23
Client benötigt Informationen über die Remote Klasse• Methodennamen, Parameter, Rückgabewert
• Werden zur Compile- und Laufzeit benötigt
Interface enthält diese Informationen• Client referenziert Interface
• Remote Klasse implementiert Interface
SoapSuds.exe generiert Interface
Service Interface
Soapsuds.exe –ia:FService –nowp –oa:FSInterface.dllSoapsuds.exe –ia:FService –nowp –oa:FSInterface.dll
24
Client konfigurieren
// Activator.GetObject() liefert einen Proxy des// remote Objekts. FSInterface FS = (FSInterface)Activator.GetObject (
typeof(FSInterface), // Typ des remote Objekts"http://localhost:65100/FService" ); // Endpunkt
// Activator.GetObject() liefert einen Proxy des// remote Objekts. FSInterface FS = (FSInterface)Activator.GetObject (
typeof(FSInterface), // Typ des remote Objekts"http://localhost:65100/FService" ); // Endpunkt
Aufruf über Activator Klasse• Konfiguration im Source
• Konfiguration über .config Datei
RemotingConfiguration.Configure("WinHCalc.exe.config");
Type type = RemotingConfiguration. GetRegisteredWellKnownClientTypes()[0].ObjectType;String url = RemotingConfiguration. GetRegisteredWellKnownClientTypes()[0].ObjectUrl;
FSInterface FS = (FSInterface)Activator.GetObject(type, url);
RemotingConfiguration.Configure("WinHCalc.exe.config");
Type type = RemotingConfiguration. GetRegisteredWellKnownClientTypes()[0].ObjectType;String url = RemotingConfiguration. GetRegisteredWellKnownClientTypes()[0].ObjectUrl;
FSInterface FS = (FSInterface)Activator.GetObject(type, url);
25
ClientBeispiel 4: WinHCalc
26
ClientBeispiel 5: ObjRef via File
27
Fragen?
Uff...