Przetwarzanie rozproszone Domeny Aplikacji App Domain App Domain

  • Slides: 37
Download presentation
Przetwarzanie rozproszone Domeny Aplikacji ( App. Domain ) App. Domain A App. Domain B

Przetwarzanie rozproszone Domeny Aplikacji ( App. Domain ) App. Domain A App. Domain B Pakiet A 1 Pakiet B 1 . . . Pakiet An Pakiet Bm

 • tworzenie nowej domeny aplikacji // Ustawienie Application. Base na bieżący katalog App.

• tworzenie nowej domeny aplikacji // Ustawienie Application. Base na bieżący katalog App. Domain. Setup info = new App. Domain. Setup(); info. Application. Base = @"file: \" + System. Environment. Current. Directory; // Utworzenie domeny aplikacji App. Domain dom = App. Domain. Create. Domain("Remote. Domain", null, info);

// Załadowanie pakietu Display // i utworzenie egzemplarza typu Display Binding. Flags flags =

// Załadowanie pakietu Display // i utworzenie egzemplarza typu Display Binding. Flags flags = (Binding. Flags. Public | Binding. Flags. Instance | Binding. Flags. Create. Instance); Object. Handle objh = dom. Create. Instance ("Display", "Display. Disp", // plik, klasa false, flags, 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

 • Aplikacja rozproszona App. Domain A App. Domain B Dane wspólne Wątek AP

• Aplikacja rozproszona App. Domain A App. Domain B Dane wspólne Wątek AP 1 Wątek AP 2 Wątek BP 1 Stos lokalny Pamięć lokalna

 • Technologie wymiany danych pomiędzy aplikacjami § IPC ( Inter Process Communication, Named

• Technologie wymiany danych pomiędzy aplikacjami § IPC ( Inter Process Communication, Named Pipes ) § DCOM, COM+ ( Distributed Common Object Model ) WCF Windows Communication Foundation § MSMQ ( Microsoft Message Queuing ) § NET. Remoting § XML Web Services § NET. Networking (gniazda, klasy: transportowe, protokółów) § Peer – to – Peer

W C F : Windows Communication Foundation • udostępnianie usług (operacji), kolekcji danych, •

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) § App. Fabric (Windows Server) Juval Löwy, Programowanie usług WCF, Helion – O'Reilly, 2012

Single. Call, Singleton, Client. Activated NET. Remoting Obiekt zdalny Klient F 1(x) Przeźroczysty zastępca

Single. Call, Singleton, Client. Activated NET. Remoting Obiekt zdalny Klient F 1(x) Przeźroczysty zastępca Rzeczywisty zastępca Kanał : HTTP, TCP Serwer { BIN, SOAP } pliki konfiguracyjne, konfiguracja programowa

W C F : Windows Communication Foundation Klient (client) Nosiciel (host) Zastępca Kontrakt (proxy)

W C F : Windows Communication Foundation Klient (client) Nosiciel (host) Zastępca Kontrakt (proxy) (contract) Plik konfiguracyjny (configuration file)

ABC technologii WCF § A : adres ( address ) - lokalizacja usługi, kolekcji

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 )

Adresy ( lokalizacja kontraktu ) • składnia adresu [ adres_bazowy ] / [ opcjonalny

Adresy ( lokalizacja kontraktu ) • składnia adresu [ adres_bazowy ] / [ opcjonalny URI ] • adres bazowy [ rodzaj_transportu ] [ komputer lub domena ] [ : opcjonalny numer portu ]

Rodzaje adresów • adresy TCP net. tcp//localhost: 8004/Nowa. Usługa net. tcp//150. 254. 3. 2:

Rodzaje adresów • adresy TCP net. tcp//localhost: 8004/Nowa. Usługa net. tcp//150. 254. 3. 2: 7000/Daleka. Usługa • adresy HTTP http: //localhost // port domyślny 80 http: //libra: 500/Matematyka • adresy IPC net. pipe: //localhost/Duża. Rura • adresy MSMQ net. msmq: //localhost/Kol_A // publiczna net. msmq: //localhost/private/Kol_B // prywatna

Powiązania ( protokół transportowy / kodowanie ) • powiązanie podstawowe ( interoperacyjne ) HTTP,

Powiązania ( protokół transportowy / kodowanie ) • powiązanie podstawowe ( interoperacyjne ) HTTP, HTTPS / tekstowe, MTOM ( SOAP Message Transmission Optimization Mechanism ) basic. Http. Binding • powiązanie TCP ( intranet, tylko WCF ) TCP / binarne ( Microsoft specific ) net. Tcp. Binding

 • powiązanie IPC ( ten sam komputer ) IPC / binarne ( Microsoft

• powiązanie IPC ( ten sam komputer ) IPC / binarne ( Microsoft specific ) net. Named. Pipe. Binding • powiązanie WS ( interoperacyjne WS-*) HTTP, HTTPS / tekstowe, MTOM ws. Http. Binding • powiązanie MSMQ / binarne ( Microsoft specific ) net. Msmq. Binding

Rodzaje kontraktów • kontrakt usług • kontrakt danych • kontrakt komunikatów • kontrakt błędów

Rodzaje kontraktów • kontrakt usług • kontrakt danych • kontrakt komunikatów • kontrakt błędów

Kontrakt usług § biblioteka. dll udostępniająca : • interfejsy realizowane przez dedykowane klasy •

Kontrakt usług § biblioteka. dll udostępniająca : • interfejsy realizowane przez dedykowane klasy • metody definiowane w klasach

// kontrakt - udostępnianie interfejsu using System. Service. Model; namespace Wyrocznia { [Service. Contract]

// kontrakt - udostępnianie interfejsu using System. Service. Model; namespace Wyrocznia { [Service. Contract] // ew. nazwa usługi, domena public interface IPorada { [Operation. Contract] string Odpowiedz (string pytanie); } public class Babka : IPorada { public string Odpowiedz (string pytanie) { } } return // . dll " Tak! "; }

// udostępnianie metod [Service. Contract] public class Where. When { [Operation. Contract] public string

// udostępnianie metod [Service. Contract] public class Where. When { [Operation. Contract] public string Where ( ) { return " Miami "; } [Operation. Contract] public string When ( ) { } return " Tomorrow "; }

using System. Service. Model; // nosiciel using Wyrocznia; //. dll w katalogu domyślnym namespace

using System. Service. Model; // nosiciel using Wyrocznia; //. dll w katalogu domyślnym namespace Nosiciel. Wyroczni { class Nosiciel { static void Main(string [ ] args) { using (Service. Host s. Host = new Service. Host ( typeof ( Babka ))) { s. Host. Open(); Console. Write. Line("Nosiciel jest czynny. "); Console. Write. Line("Naciśnij Enter aby zakończyć. . . "); Console. Read. Line( ); } } } // aplikacja konsolowa

// klient // uruchomić nosiciela // Add. Service. Reference Wróżka, Porada. Client ( usługa,

// klient // uruchomić nosiciela // Add. Service. Reference Wróżka, Porada. Client ( usługa, obiekt interfejsu ) // dodać referencję usługi Wróżka using Klient. Wyroczni. Wróżka; namespace Klient. Wyroczni { class Program { static void Main ( string [ ] args ) { using ( Porada. Client babka = new Porada. Client ( )) { string odp = babka. Odpowiedz ( " Jak żyć ? " ); Console. Write. Line( "Wyrocznia powiedziała : " + odp ); } } } // można użyć svcutil. exe (NET. SDK)

Plik konfiguracyjny nosiciela <? xml version="1. 0"? > <configuration> <system. service. Model> <services> <service

Plik konfiguracyjny nosiciela <? xml version="1. 0"? > <configuration> <system. service. Model> <services> <service name="Wyrocznia. Babka" behavior. Configuration="Wyrocznia. MEXBehavior"> <endpoint address="" binding="basic. Http. Binding" contract="Wyrocznia. IPorada"/> <!-- Enable the MEX endpoint --> <endpoint address="mex" binding="mex. Http. Binding" contract="IMetadata. Exchange"/>

<!-- Add this so MEX knows the address of service --> <host> <base. Addresses>

<!-- Add this so MEX knows the address of service --> <host> <base. Addresses> <add base. Address="http: //localhost: 8090/Babka"/> </base. Addresses> </host> </service></services> <!-- A behavior definition for MEX --> <behaviors> <service. Behaviors> <behavior name="Wyrocznia. MEXBehavior"> <service. Metadata http. Get. Enabled="true"/> </behavior> Wyrocznia HTTP </service. Behaviors></behaviors></system. service. Model> </configuration>

 • Powiązanie TCP // plik konfiguracyjny nosiciela <service name="Wyrocznia. Babka" behavior. Configuration="Wyrocznia. MEXBehavior">

• Powiązanie TCP // plik konfiguracyjny nosiciela <service name="Wyrocznia. Babka" behavior. Configuration="Wyrocznia. MEXBehavior"> <endpoint address="" binding="net. Tcp. Binding" contract="Wyrocznia. IPorada"/> <!-- Enable the MEX endpoint --> <endpoint address="mex" binding="mex. Tcp. Binding" contract="IMetadata. Exchange"/> <!-- Enable the MEX endpoint --> <host> <base. Addresses> Wyrocznia TCP <add base. Address="net. tcp: //localhost: 8090/Babka"/> <add base. Address="http: //localhost: 8080/Babka"/> </base. Addresses> </host> </service>

 • Powiązanie IPC // plik konfiguracyjny nosiciela <service name="Wyrocznia. Babka" behavior. Configuration="Wyrocznia. MEXBehavior">

• Powiązanie IPC // plik konfiguracyjny nosiciela <service name="Wyrocznia. Babka" behavior. Configuration="Wyrocznia. MEXBehavior"> <endpoint address="" binding="net. Named. Pipe. Binding" contract="Wyrocznia. IPorada"/> <!-- Enable the MEX endpoint --> <endpoint address="mex" binding="mex. Tcp. Binding" contract="IMetadata. Exchange"/> <!-- Enable the MEX endpoint --> <host> <base. Addresses> Wyrocznia IPC <add base. Address="net. pipe: //localhost"/> <add base. Address="http: //localhost: 8080/Babka"/> </base. Addresses> </host> </service>

Asynchroniczne wywołanie usługi • kontrakt usługi, nosiciel : bez zmian • uruchomić nosiciela •

Asynchroniczne wywołanie usługi • kontrakt usługi, nosiciel : bez zmian • uruchomić nosiciela • po dokonaniu połączenia z nosicielem w oknie Add. Service Reference wybrać Advanced i zaznaczyć Generate asynchronous operations • w programie klienta:

using (Porada. Client proxy = new Porada. Client()) { proxy. Open(); IAsync. Result result

using (Porada. Client proxy = new Porada. Client()) { proxy. Open(); IAsync. Result result = proxy. Begin. Odpowiedz( pytanie, // argument funkcji Odpowiedz // funkcja zwrotna ar => { Console. Write. Line("Wróżka odpowiedziała : " + proxy. End. Odpowiedz(ar)); }, null); // async. State while (!result. Is. Completed) { Thread. Sleep(100); } } Wyrocznia ASY

Kontrakty danych // w programie usługi. dll [Service. Contract] public interface IUniversity { [Operation.

Kontrakty danych // w programie usługi. dll [Service. Contract] public interface IUniversity { [Operation. Contract] Student Get. Student ( int album ); }

[Data. Contract] public class Student { [Data. Member] public string Fore. Name; [Data. Member]

[Data. Contract] public class Student { [Data. Member] public string Fore. Name; [Data. Member] public string Last. Name; [Data. Member] public int Album; public double Score; }

// nosiciel bez zmian (. cs i. config ) // // klient dodawanie referencji

// nosiciel bez zmian (. cs i. config ) // // klient dodawanie referencji serwisu bez zmian // program : // using Univ. Client. University; // University. Client szukacz = new University. Client(); string pytanie; Univ. Client. University. Student st; // pytanie = Console. Read. Line(); st = szukacz. Get. Student( int. Parse ( pyt )); Data. Contract

ABC definiowane programowo • kontrakt. dll bez zmian • nosiciel using System. Service. Model;

ABC definiowane programowo • kontrakt. dll bez zmian • nosiciel using System. Service. Model; using Wyrocznia; namespace Nosiciel { class Program { static void Main(string[] args) { Service. Host service. Host = new Service. Host(typeof(Babka)); Basic. Http. Binding basic. Binding = new Basic. Http. Binding(); service. Host. Add. Service. Endpoint(typeof(IPorada), basic. Binding, "http: //localhost: 8091/Babka"); service. Host. Open(); }}}

 • klient // Add. Service. Reference jak poprzednio using System. Service. Model; using

• klient // Add. Service. Reference jak poprzednio using System. Service. Model; using Klient. Wróżka; namespace Klient { class Program { static void Main(string[] args) { Basic. Http. Binding basic. Binding = new Basic. Http. Binding(); Endpoint. Address address = new Endpoint. Address("http: //localhost: 8091/Babka"); Porada. Client pytia = new Porada. Client(basic. Binding, address); . . . } } } Prog

Usługi współużytkowane • kontrakt. dll namespace Liczarka { [Service. Contract] public interface IDodawanie {

Usługi współużytkowane • kontrakt. dll namespace Liczarka { [Service. Contract] public interface IDodawanie { [Operation. Contract] int Dodaj(int start); }

[Service. Behavior(Instance. Context. Mode = Instance. Context. Mode. Single)] public class Licznik : IDodawanie

[Service. Behavior(Instance. Context. Mode = Instance. Context. Mode. 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;

 • nosiciel static void Main(string[] args) { Console. Write. Line("***** Nosiciel Single *****");

• nosiciel static void Main(string[] args) { Console. Write. Line("***** Nosiciel Single *****"); Licznik lili = new Licznik(); Service. Host service. Host = new Service. Host(lili); // Open the host and start listening. service. Host. Open(); }

 • klient Dodawanie. Client licz = new Dodawanie. Client(); int odp, start =

• klient Dodawanie. Client licz = new Dodawanie. Client(); int odp, start = 3; Console. Write. Line("Dodaj 1. . . "); Console. Read. Line(); odp = licz. Dodaj(kto); Console. Write. Line("Kto = {0}, Licznik = {1}, Obiekty = {2}", (odp % 10). To. String(), (odp % 1000 / 10). To. String(), (odp / 1000). To. String() ); Single

Wydajność kanałów

Wydajność kanałów

Time. Perf

Time. Perf