Przetwarzanie rozproszone Domeny Aplikacji ( AppDomain )

36
Przetwarzanie rozproszone Domeny Aplikacji ( AppDomain ) AppDomain A Pakiet A1 Pakiet An . . . AppDomain B Pakiet B1 Pakiet Bm . . .

description

Przetwarzanie rozproszone Domeny Aplikacji ( AppDomain ). AppDomain A. AppDomain B. Pakiet B1. Pakiet A1. Pakiet Bm. Pakiet An. tworzenie nowej domeny aplikacji // Ustawienie ApplicationBase na bi eżą cy katalog AppDomainSetup info = new AppDomainSetup(); - PowerPoint PPT Presentation

Transcript of Przetwarzanie rozproszone Domeny Aplikacji ( AppDomain )

Page 1: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

Przetwarzanie rozproszone

Domeny Aplikacji ( AppDomain )

AppDomain A

Pakiet A1

Pakiet An

.

.

.

AppDomain B

Pakiet B1

Pakiet Bm

.

.

.

Page 2: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

• tworzenie nowej domeny aplikacji

// Ustawienie ApplicationBase na bieżący katalog

AppDomainSetup info = new AppDomainSetup();

info.ApplicationBase = @"file:\\" + System.Environment.CurrentDirectory;

// Utworzenie domeny aplikacji

AppDomain dom = AppDomain.CreateDomain("RemoteDomain", null, info);

Page 3: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

// Załadowanie pakietu Display

// i utworzenie egzemplarza typu Display

BindingFlags flags = (BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance);

ObjectHandle objh = dom.CreateInstance("Display", "Display.Disp", // plik, klasa false, flags, null, null, null, null, null);

// Rozpakowanie obiektu

Object obj = objh.Unwrap();

// Rzutowanie do aktualnego typu

Disp h = (Disp)obj;

// Wywołanie metody

h.Show("Dobry wieczór!");Domain

Page 4: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

• Aplikacja rozproszona

AppDomain A AppDomain B

Wątek AP1

Stos lokalny

Pamięć lokalna

Wątek AP2

Stos lokalny

Pamięć lokalna

Wątek BP1

Stos lokalny

Pamięć lokalna

Dane wspólne Dane wspólne

Page 5: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

• Technologie wymiany danych pomiędzy aplikacjami

IPC ( Inter Process Communication, Named Pipes )

DCOM, COM+ ( Distributed Common Object Model )

MSMQ ( Microsoft Message Queuing )

NET . Remoting

XML Web Services

NET.Networking (gniazda, klasy: transportowe, protokółów)

Peer – to – Peer

WCFWindows Communication Foundation

Page 6: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

W C F : Windows Communication Foundation

• udostępnianie usług (operacji), kolekcji danych,

• komputer lokalny, sieć lokalna, internet

• zarządzanie usługodawcą:

system Windows

IIS : Internet Information Services

WAS : Windows Activation Service (Win 7, WS)

AppFabric (Windows Server)

Juval Löwy, Programowanie usług WCF, Helion – O'Reilly, 2012

Page 7: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

Przeźroczysty zastępca

F1(x)

Rzeczywisty zastępca

Kanał : HTTP, TCP { BIN, SOAP }

Serwer

Klient Obiekt zdalny

F1(x)

NET . RemotingSingleCall, Singleton, ClientActivated

pliki konfiguracyjne, konfiguracja programowa

Page 8: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

W C F : Windows Communication Foundation

Klient (client)

Zastępca

(proxy)

Nosiciel (host)

Kontrakt

(contract)

Plik konfiguracyjny

(configuration file)

Plik konfiguracyjny

(configuration file)

Page 9: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

ABC technologii WCF

A : adres ( address ) - lokalizacja usługi, kolekcji danych

B : powiązanie ( binding ) - protokóły, kodowanie, transport

C : kontrakt ( contract ) - definicje udostępnianych metod,

kolekcji danych

A + B + C punkt końcowy ( endpoint )

Page 10: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

Adresy ( lokalizacja kontraktu )

• składnia adresu

[ adres_bazowy ] / [ opcjonalny URI ]

• adres bazowy

[ rodzaj_transportu ]

[ komputer lub domena ]

[ : opcjonalny numer portu ]

Page 11: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

Rodzaje adresów

• adresy TCP

net.tcp//localhost:8004/NowaUsługa

net.tcp//150.254.3.2:7000/DalekaUsługa

• adresy HTTP

http://localhost // port domyślny 80

http://libra:500/Matematyka

• adresy IPC

net.pipe://localhost/DużaRura

• adresy MSMQ

net.msmq://localhost/Kol_A // publiczna

net.msmq://localhost/private/Kol_B // prywatna

Page 12: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

Powiązania ( protokół transportowy / kodowanie )

• powiązanie podstawowe ( interoperacyjne )

HTTP, HTTPS / tekstowe, MTOM ( SOAP Message Transmission Optimization Mechanism )

basicHttpBinding

• powiązanie TCP ( intranet, tylko WCF )

TCP / binarne ( Microsoft specific )

netTcpBinding

Page 13: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

•powiązanie IPC ( ten sam komputer )

IPC / binarne ( Microsoft specific )

netNamedPipeBinding

• powiązanie WS ( interoperacyjne WS-*)

HTTP, HTTPS / tekstowe, MTOM

wsHttpBinding

• powiązanie MSMQ

MSMQ / binarne ( Microsoft specific )

netMsmqBinding

Page 14: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

Rodzaje kontraktów

• kontrakt usług

• kontrakt danych

• kontrakt komunikatów

• kontrakt błędów

Page 15: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

Kontrakt usług

biblioteka .dll udostępniająca :

• interfejsy realizowane przez dedykowane klasy

• metody definiowane w klasach

Page 16: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

// kontrakt - udostępnianie interfejsu

using System.ServiceModel;

namespace Wyrocznia

{

[ServiceContract] // ew. nazwa usługi, domena

public interface IPorada

{

[OperationContract]

string Odpowiedz (string pytanie);

}

public class Babka : IPorada

{ public string Odpowiedz (string pytanie)

{ return " Tak! "; }

} } // .dll

Page 17: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

// udostępnianie metod

[ServiceContract]

public class WhereWhen

{

[OperationContract]

public string Where ( )

{ return " Miami "; }

[OperationContract]

public string When ( )

{ return " Tomorrow "; }

}

Page 18: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

using System.ServiceModel; // nosiciel

using Wyrocznia; // .dll w katalogu domyślnym

namespace NosicielWyroczni

{

class Nosiciel

{

static void Main(string [ ] args)

{ using (ServiceHost sHost =

new ServiceHost ( typeof ( Babka )))

{ sHost.Open();

Console.WriteLine("Nosiciel jest czynny.");

Console.WriteLine("Naciśnij Enter aby zakończyć...");

Console.ReadLine( );

} } } // aplikacja konsolowa

Page 19: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

// klient

// uruchomić nosiciela// AddServiceReference Wróżka, PoradaClient ( usługa, obiekt interfejsu )

// dodać referencję usługi Wróżka

using KlientWyroczni.Wróżka;

namespace KlientWyroczni

{ class Program

{ static void Main ( string [ ] args )

{

using ( PoradaClient babka = new PoradaClient ( ))

{

string odp = babka.Odpowiedz ( " Jak żyć ? " );

Console.WriteLine( "Wyrocznia powiedziała : " + odp );

} } } // można użyć svcutil.exe (NET.SDK)

Page 20: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

Plik konfiguracyjny nosiciela

<?xml version="1.0"?>

<configuration>

<system.serviceModel>

<services>

<service name="Wyrocznia.Babka"

behaviorConfiguration="WyroczniaMEXBehavior">

<endpoint address="" binding="basicHttpBinding"

contract="Wyrocznia.IPorada"/>

<!-- Enable the MEX endpoint -->

<endpoint address="mex" binding="mexHttpBinding"

contract="IMetadataExchange"/>

Page 21: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

<!-- Add this so MEX knows the address of service -->

<host>

<baseAddresses>

<add baseAddress="http://localhost:8090/Babka"/>

</baseAddresses>

</host>

</service></services>

<!-- A behavior definition for MEX -->

<behaviors>

<serviceBehaviors>

<behavior name="WyroczniaMEXBehavior">

<serviceMetadata httpGetEnabled="true"/>

</behavior>

</serviceBehaviors></behaviors></system.serviceModel>

</configuration>

Wyrocznia HTTP

Page 22: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

• Powiązanie TCP

// plik konfiguracyjny nosiciela

<service name="Wyrocznia.Babka" behaviorConfiguration="WyroczniaMEXBehavior">

<endpoint address="" binding="netTcpBinding" contract="Wyrocznia.IPorada"/>

<!-- Enable the MEX endpoint -->

<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>

<!-- Enable the MEX endpoint -->

<host>

<baseAddresses>

<add baseAddress="net.tcp://localhost:8090/Babka"/>

<add baseAddress="http://localhost:8080/Babka"/>

</baseAddresses> </host> </service>

Wyrocznia TCP

Page 23: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

• Powiązanie IPC

// plik konfiguracyjny nosiciela

<service name="Wyrocznia.Babka" behaviorConfiguration="WyroczniaMEXBehavior">

<endpoint address="" binding="netNamedPipeBinding" contract="Wyrocznia.IPorada"/>

<!-- Enable the MEX endpoint -->

<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>

<!-- Enable the MEX endpoint -->

<host>

<baseAddresses>

<add baseAddress="net.pipe://localhost"/>

<add baseAddress="http://localhost:8080/Babka"/>

</baseAddresses> </host> </service>

Wyrocznia IPC

Page 24: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

Asynchroniczne wywołanie usługi

• kontrakt usługi, nosiciel : bez zmian

• uruchomić nosiciela

• po dokonaniu połączenia z nosicielem w oknie

AddService Reference wybrać Advanced i zaznaczyć

Generate asynchronous operations

• w programie klienta:

Page 25: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

using (PoradaClient proxy = new PoradaClient())

{

proxy.Open();

IAsyncResult result = proxy.BeginOdpowiedz(

pytanie, // argument funkcji Odpowiedz

// funkcja zwrotna

ar => { Console.WriteLine("Wróżka odpowiedziała : "

+ proxy.EndOdpowiedz(ar)); },

null); // asyncState

while (!result.IsCompleted)

{

Thread.Sleep(100);

}

}

Wyrocznia ASY

Page 26: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

Kontrakty danych

// w programie usługi .dll

[ServiceContract]

public interface IUniversity

{

[OperationContract]

Student GetStudent ( int album );

}

Page 27: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

[DataContract]

public class Student

{

[DataMember]

public string ForeName;

[DataMember]

public string LastName;

[DataMember]

public int Album;

public double Score;

}

Page 28: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

// nosiciel bez zmian ( .cs i .config )

//

// klient dodawanie referencji serwisu bez zmian

// program :

//

using UnivClient.University;

//

UniversityClient szukacz = new UniversityClient();

string pytanie;

UnivClient.University.Student st;

//

pytanie = Console.ReadLine();

st = szukacz.GetStudent( int.Parse ( pyt ));

DataContract

Page 29: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

ABC definiowane programowo

• kontrakt .dll bez zmian

• nosicielusing System.ServiceModel;

using Wyrocznia;

namespace Nosiciel

{ class Program

{ static void Main(string[] args)

{ ServiceHost serviceHost = new ServiceHost(typeof(Babka));

BasicHttpBinding basicBinding = new BasicHttpBinding();

serviceHost.AddServiceEndpoint(typeof(IPorada), basicBinding, "http://localhost:8091/Babka");

serviceHost.Open();

}}}

Page 30: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

• klient

// AddServiceReference jak poprzednio

using System.ServiceModel;

using Klient.Wróżka;

namespace Klient

{ class Program

{ static void Main(string[] args)

{ BasicHttpBinding basicBinding =

new BasicHttpBinding();

EndpointAddress address =

new EndpointAddress("http://localhost:8091/Babka");

PoradaClient pytia =

new PoradaClient(basicBinding, address);

...... } } } Prog

Page 31: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

Usługi współużytkowane

• kontrakt .dll

namespace Liczarka

{

[ServiceContract]

public interface IDodawanie

{

[OperationContract]

int Dodaj(int start);

}

Page 32: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

[ServiceBehavior(InstanceContextMode =

InstanceContextMode.Single)]

public class Licznik : IDodawanie

{ static int Obiekty = 0;

int Ile = 0;

public Licznik()

{

++Obiekty;

}

public int Dodaj(int kto)

{

return kto + ++Ile * 10 + Obiekty * 1000;

}

}}

Page 33: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

• nosiciel

static void Main(string[] args)

{

Console.WriteLine("***** Nosiciel Single *****");

Licznik lili = new Licznik();

ServiceHost serviceHost = new ServiceHost(lili);

// Open the host and start listening.

serviceHost.Open();

}

Page 34: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

• klient

DodawanieClient licz = new DodawanieClient();

int odp, start = 3;

Console.WriteLine("Dodaj 1 ... ");

Console.ReadLine();

odp = licz.Dodaj(kto);

Console.WriteLine("Kto = {0}, Licznik = {1},

Obiekty = {2}",

(odp % 10).ToString(),

(odp % 1000 / 10).ToString(),

(odp / 1000).ToString() );

Single

Page 35: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

Wydajność kanałów

Page 36: Przetwarzanie rozproszone Domeny Aplikacji  (  AppDomain  )

TimePerf