Wykład 5 - Instytut Informatyki Teoretycznej i Stosowanej
Transkrypt
Wykład 5 - Instytut Informatyki Teoretycznej i Stosowanej
Programowanie aplikacji równoległych i rozproszonych Wykład 5 Dr inż. Tomasz Olas [email protected] Instytut Informatyki Teoretycznej i Stosowanej Politechnika Cz˛estochowska Wykład 5 – p. 1/54 Architektura typu klient - serwer Klient - Serwer to asymetryczna architektura, w której pewna funkcjonalność została rozdzielona i wyodbrebnione ˛ zostały dwa elementy: klient - potrzebujacy ˛ pewnej usługi, zlecajacy ˛ ja˛ serwerowi, serwer - dostarczajacy ˛ usługi zlecanej przez klienta. Wykład 5 – p. 2/54 Cechy architektury klient - serwer Cechy charakterystyczne serwera: pasywny, czeka na żadania ˛ od klientów, w momencie otrzymania żadania, ˛ przetwarza je, a nastepnie ˛ wysyła odpowiedź. Cechy charakterystyczne klienta: aktywny, wysyła żadanie ˛ do serwera, oczekuje na odpowiedź od serwera. Wykład 5 – p. 3/54 Architektury klient - serwer Podział ze wzgledu ˛ na sposób obsługi żada ˛ ń od klientów: serwer iteracyjny (sekwencyjne) (iterative server ), serwer współbieżny (concurrent server ). Podział ze wzgledu ˛ na obsługe˛ stanów serwera: serwer bezstanowy (stateless server ), serwer stanowy (stateful server ). Podział ze wzgledu ˛ na „rozdzielenie pracy”: cienki klient (thin client), gruby (bogaty) klient (fat/rich client). Podział ze wzgledu ˛ na liczbe˛ warstw (modułów), Podział ze wzgledu ˛ na sposób komunikacji (przy użyciu protokołu połaczeniowego ˛ lub bezpołaczeniowego). ˛ Wykład 5 – p. 4/54 Serwer bezstanowy - stanowy Serwer bezstanowy nie przechowuje żadnych informacji dotyczacych ˛ klienta, klient za każdym razem, gdy wywołuje usługe˛ serwera musi podać wszystkie dane niezbedne ˛ do wykonania usługi. Serwer stanowy przechowuje informacje dotyczace ˛ klienta. Można tutaj wyróżnić dwa typy tych informacji: informacja globalna - przechowywana przez cały czas działania serwera (np. stan licznika), informacja o stanie sesji (session state) - informacje o stanie połaczenia ˛ z klientem sa˛ przechowywane przez cały czas trwania sesji. Wykład 5 – p. 5/54 Podział pracy klienta i serwera Wykład 5 – p. 6/54 Architektura trójwarstwowa Wykład 5 – p. 7/54 Warstwy aplikacji - model MVC MVC (ang. Model-View-Controller) - Model-Widok-Kontroler składa sie˛ z trzech poziomów (warstw): 1. Poziom interfejsu użytkownika np. dokument w przegladarce ˛ 2. Poziom przetwarzania (logiki sterowania) np. przetworzenie zapytania w przegladarce ˛ internetowej 3. Poziom danych (modelu danych) np. informacje znajdujace ˛ sie˛ w bazie danych Wykład 5 – p. 8/54 Zdalne wywołanie procedur - koncepcja Zadaniem mechanizmu zdalnego wywołania procedur (Remote Procedure Call) jest zachowanie w możliwie maksymalnym stopniu semantyki zwykłych wywołań procedur w środowisku sieciowym. Wykład 5 – p. 9/54 System Sun RPC (I) Produkt Sun RPC został wprowadzony i wypromowany przez firme˛ Sun Microsystems jednocześnie z systemem NFS. RPC umożliwia konstruowanie aplikacji rozproszonych według modelu klient–serwer. Aplikacje oparte na systemie RPC najcz˛eściej sa˛ tworzone przy wykorzystaniu kompilatora protokołów, takiego jak rpcgen firmy Sun Microsystems. Wykład 5 – p. 10/54 System Sun RPC (II) W skład Sun RPC wchodza: ˛ biblioteka funkcji, narz˛edzie rpcgen służace ˛ do generowania dla aplikacji kodu obsługi sieci na podstawie opisu interfejsu procedur. Parametry wywołania funkcji i zwracane wyniki przesyłane sa˛ w formacie XDR (eXternal Data Representation - zewnetrzna ˛ reprezentacja danych). Z mechanizmu Sun RPC można korzystać przy użyciu protokołu transportu TCP lub UDP. Serwer może udostepniać ˛ dla wywołań RPC wiele podprogramów. Wykład 5 – p. 11/54 RPC - zasada działania Działanie RPC jest synchroniczne: aplikacja klient wysyła do serwera polecenie wykonania podprogramu wraz z argumentami wywołania. Nastepnie ˛ klient przechodzi w stan oczekiwania na zakończenie wykonania podprogramu, aby odebrać zwracane przez podprogram wyniki. Wykład 5 – p. 12/54 Usługi RPC Usługa˛ w RPC nazywa sie˛ zbiór funkcji przyjmujacych ˛ określone argumenty i zwracajacych ˛ określone wyniki. Deklaracje argumentów i wyników to interfejs usługi. Z punktu widzenia programisty usługa jest identyfikowana przez numer programu i numer wersji. Wykład 5 – p. 13/54 Program rpcbind rpcbind jest serwerem dokonujacym ˛ konwersji numerów programów RPC na numer portu tzw. portmapper (port 111) 1. serwer rejestruje sie˛ u demona portmap, 2. klient żada ˛ numeru portu serwera, 3. demon portmap odsyła klientowi numer portu serwera, 4. klient wysyła żadanie ˛ do serwera, 5. serwer wysyła odpowiedź do klienta. Wykład 5 – p. 14/54 Pieniek klienta i pieniek serwera W RPC stosowane sa˛ pojecia ˛ pieńka klienta (interfejsu klienta) i pieńka serwera (interfejsu serwera). Pieniek klienta symuluje w aplikacji klienta lokalne działanie procedury. Pieniek serwera czeka na żadanie ˛ nadchodzace ˛ od klienta. Wykład 5 – p. 15/54 Specyfikacja usług RPC W RPC odległe usługi sa˛ zorganizowane i identyfikowane według hierarchii jeden serwer zawiera jeden program jeden program ma jedna˛ lub kilka wersji każda z wersji zawiera jedna˛ lub kilka procedur Wykład 5 – p. 16/54 Specyfikacje programów Numer programu - liczba 32-bitowa 0000 0000 – 1fff ffff - SunRPC 2000 0000 – 3fff ffff - definiowane przez użytkownika 4000 0000 – 5fff ffff - tymczasowe 6000 0000 – ffff ffff - zarezerwowane Numer wersji - liczba 32-bitowa Numer procedury - liczba 32-bitowa Wykład 5 – p. 17/54 Polecenie rpcinfo Zwraca informacje dotyczace ˛ usług zarejestrowanych w rpcbind Wyświetlenie wszystkich usług na wskazanym serwerze: rpcinfo -p [ host ] Przykład: program wer. proto 100000 2 tcp 100000 2 udp 391002 2 tcp 100024 1 udp 100024 1 tcp port 111 111 901 757 760 portmapper portmapper sgi_fam status status Wykład 5 – p. 18/54 Program rpcgen Program rpcgen jako wejście pobiera plik specyfikacji usług w formacie jezyka ˛ RPC IDL („C” z dodatkiem typów program i version). Zostanie wygenerowany żadany ˛ kod jezyka ˛ C z implementacja˛ zdefiniowanego wywołania zdalnej procedury. Wykład 5 – p. 19/54 Jezyk ˛ RPC Plik z definicja˛ protokołu może zawierać nastepuj ˛ ace ˛ elementy: obowiazkowa ˛ deklaracja programu serwera i przynajmniej jednej dostarczonej przez niego funkcji, deklaracje złożonych typów danych wykorzystywanych w protokole, deklaracje stałych, komentarze. Wykład 5 – p. 20/54 Przekazywanie argumentów Standardowo RPC dopuszcza tylko jeden argument wywołania odległej procedury i jeden zwracany wynik, podawane w formie wskaźników. Jeśli wystepuje ˛ kilka argumentów należy je umieścić w strukturze. Wykład 5 – p. 21/54 XDR - External Data Representation XDR jest zdefiniowanym na potrzeby RPC formatem danych, zapewniajacym ˛ ich pełna˛ przenośność w środowisku heterogenicznym. Konwersja danych znajdujacych ˛ sie˛ w pamieci ˛ do formatu XDR (szeregowanie) i odwrotnie (deszeregowanie) odbywa sie˛ przy użyciu specjalnych procedur zwanych filtrami. Dla typów podstawowych zostały zdefiniowane odpowiednie filtry, natomiast dla typów złożonych programista musi je utworzyć samodzielnie. XDR może być używany również poza RPC, np. do tworzenia w pełni przenośnych plików binarnych. Wykład 5 – p. 22/54 Przykład - plik kalkulator.x struct liczby{ int x1; int x2; }; program KALKULATOR { version WERSJA { int dodaj(liczby) = 1; } = 1; } = 0x21000000; Wykład 5 – p. 23/54 Przykład - kod klienta (I) #include <iostream> #include <rpc/rpc.h> #include "ser.h" int dodaj(int a, int b) { CLIENT *c1; integers arg; int *ret; char* host = "localhost"; c1 = clnt_create(host, KALKULATOR, WERSJA, "tcp"); if (c1 == NULL) { clnt_pcreateerror(host); return -1; } Wykład 5 – p. 24/54 Przykład - kod klienta (II) arg.x1 = a; arg.x2 = b; ret = (int*)dodaj_1(&arg, c1); if (ret == NULL) { clnt_perror(c1, "blad wywolania odleglej procedury"); return -1; } clnt_destroy(c1); return (*ret); } int main() { int a = 1, b = 1; std::cout << dodaj(a,b); } Wykład 5 – p. 25/54 Przykład - kod serwera #include <rpc/rpc.h> #include "ser.h" int dodaj(int x1, int x2) { return x1 + x2; } int *dodaj_1_svc(intargs* arg, svc_req *) { int* result = new int; *result = dodaj(arg->x1, arg->x2); return result; } Wykład 5 – p. 26/54 Zdalne wywołanie metod RMI to podstawowy mechanizm typu RPC dostepny ˛ w jezyku ˛ Java. W przeciwieństwie do Sun RPC jest mechanizmem w pełni obiektowym. Nie wprowadza żadnych nowych elementów wykraczajacych ˛ poza sam jezyk ˛ - jezykiem ˛ specyfikacji interfejsu jest sama Java. RMI zostało właczone ˛ do JDK w wersji 1.1. Wykład 5 – p. 27/54 Model przepływu danych Wykład 5 – p. 28/54 Definicja interfejsu w RMI Intefejs zdalny w RMI jest po prostu interfejsem jezyka ˛ Java. Każdy interfejs zdalny musi spełniać nastepuj ˛ ace ˛ warunki: musi rozszrzać interfejs java.rmi.Remote, wszystkie jego metody musza˛ deklarować klauzula˛ throws możliwość rzucenia wyjatku ˛ java.rmi.RemoteException. Wykład 5 – p. 29/54 Komunikacja pomiedzy ˛ klientem i serwerem Wykład 5 – p. 30/54 rmiregistry Do nawiazania ˛ łaczności ˛ pomiedzy ˛ klientem a serwerem służy rejestr serwerów (rmiregistry). Realizuje on wyszukiwanie obiektów na podstawie ich nazwy. Nazwa obiektu przyjmuje format URL //host:port/nazwa, gdzie: host - nazwa lub adres komputera gdzie uruchomiony jest rejestr, port - numer portu (domyślnie 1099), nazwa - nazwa przyjeta ˛ dla obiektu zdalnego w rejestrze. Wykład 5 – p. 31/54 Obsługa obiektów - klasa Naming Do obsługi rejestracji w rmiregistry służa˛ statyczne metody klasy java.rmi.Naming: lookup() - zwraca obiekt zdalny zwiazany ˛ z podana˛ nazwa, ˛ bind() - wiaże ˛ obiekt zdalny z podana˛ nazwa˛ - jeśli podana nazwa już wystepuje ˛ zwracany jest wyjatek ˛ klasy AlreadyBoundException, rebind() - wiaże ˛ obiekt zdalny z podana˛ nazwa˛ - jeśli podana nazwa już wystepuje ˛ przypisany do niej obiekty jest zastepowany ˛ nowym, unbind() - usuwa powiazane ˛ nazwy z obiektem zdalnym w rejestrze, list() - zwraca liste˛ nazw obiektów wystepuj ˛ acych ˛ w rejestrze (lista obiektów typu String). Wykład 5 – p. 32/54 Implementacja klasy serwera Aby metody obiektu mogły być zdalnie dostepne, ˛ musi on spełniać dwa warunki: implementować jakiś interfejs zdalny, być wyeksportowany. Eksport obiektu oznacza otwarcie odpowiedniego portu i rozpocz˛ecie nasłuchu. Najprościej uzyskać ten efekt dziedziczac ˛ z którejś z podklas klasy java.rmi.server.RemoteServer, np java.rmi.server.UnicastRemoteObject. Wykład 5 – p. 33/54 Przykład - Definicja interfejsu import java.rmi.*; public interface MojInterfejs extends Remote { public Double zdalnaMetoda(int i) throws RemoteException; // inne zdalne funkcje ... } Wykład 5 – p. 34/54 Przykład - klasa serwera import java.rmi.*; import java.rmi.server.*; import java.net.*; public class MojSerwer extends UnicastRemoteObject implements MojInterfejs { public MojSerwer() throws RemoteException { ... } public Double zdalnaMetoda(int i) throws RemoteException { ... } public static void main(String []t) { try { MojSerwer ob = new MojSerwer(); Naming.rebind("MojInterfejs", ob); } catch (RemoteException re) { ... } catch (MalformedURLException ue){ ... } } Wykład 5 – p. 35/54 Przykład - klasa klienta import java.rmi.*; public class MojKlient { public static void main(String args[]) { if (System.getSecurityManager() == null) System.setSecurityManager(new RMISecurityManager()); try { MojInterfejs s =(MojInterfejs)Naming.lookup("rmi://localhost/MojInterfejs"); ... } catch (Exception e){ ... } } } Wykład 5 – p. 36/54 Standard CORBA CORBA (Common Object Request Broker Architecture) jest standardem przeznaczonym do kompleksowego tworzenia obiektowych aplikacji rozproszonych. Specyfikacja technologii CORBA została opracowana przez konsorcjum OMG (Object Management Group) utworzone w 1989 r. Zajmuje sie˛ ono rozwojem, adaptacja˛ i promowaniem standardów dla rozwijania i rozpowszechniania aplikacji heterogenicznych i rozproszonych. OMA (Object Management Architecture) - Architektura zarzadzania ˛ obiektami w sieci komputerowej, CORBA. Skupia ponad 800 czołowych firm rozwojowych, producentów sprz˛etu komputerowego oraz dostawców oprogramowania a także użytkowników (m. in. takie firmy jak: Apple, AT&T Digital, HP, Intel, Inprise, IBM, Novell, Oracle, Software AG, Sybase, Symantec, Xerox itd). Wykład 5 – p. 37/54 Model komunikacji Centralnym elementem architektury CORBA jest ORB (Object Request Broker) jest odpowiedzialny za wszystkie operacje, jakie sa˛ dokonywane pomiedzy ˛ klientem a programem implementujacym ˛ usługi, czyli serwerem. Wykład 5 – p. 38/54 Zalety (I) Otwartość - CORBA opiera sie˛ na opublikowanej i dostepnej ˛ dla wszystkich specyfikacji. Uniwersalność - jest niezależna od sprz˛etu i systemu operacyjnego. Komponenty, które ze soba˛ współpracuja˛ moga˛ działać na różnych architekturach sprz˛etowych i pod kontrola˛ różnych systemów operacyjnych. Elastyczność - obiekty CORBY posiadaja˛ ściśle zdefiniowany interfejs, poprzez który odbywa sie˛ komunikacja. Zmiany w implementacji obiektu nie maja˛ wpływu na inne obiekty, o ile nie zostanie zmieniony interfejs. Wykład 5 – p. 39/54 Zalety (II) Przenośność - obiekty CORBY sa˛ przenośne. Oznacza to, że obiekty zbudowane na jednej platformie moga˛ być wykorzystane na innej platformie CORBA. Obiektowość - budowa aplikacji odbywa sie˛ zgodnie z technika˛ obiektowa. ˛ Przeźroczystość dost˛epu - punktu widzenia użytkownika (programisty) dostep ˛ do obiektów zdalnych może być realizowany w taki sam sposób, jak do lokalnych. Przeźroczystość położenia - jest możliwy dostep ˛ do obiektów bez konieczności dokładnego określania ich położenia. Wykład 5 – p. 40/54 Usługi CORBA usługa nazewnictwa (naming service) - pozwala obiektom na wzajemna˛ lokalizacje˛ poprzez wykorzystanie ich nazw, usługa zdarzeń (event service) - umożliwia obiektom odbieranie zdarzeń, usługa transakcji (transaction service) - definiuje reguły transakcyjności, koordynuje dwufazowe zatwierdzanie operacji pomiedzy ˛ obiektami, usługa bezpieczeństwa (security service) - zapewnia funkcje˛ autentyfikacji, autoryzacji i szyfrowania. Dzieki ˛ temu możliwa jest ochrona danych i kontrola dostepu ˛ użytkowników do aplikacji i usług. Wykład 5 – p. 41/54 Schemat architektury aplikacji w Corbie Wykład 5 – p. 42/54 Struktura mechanizmu ORB Warstwa ORB stanowi centralny obiekt Corby. Dlatego sposób jego budowy decyduje o tym, że Corba to technologia niezależna od platformy sprz˛etowo–programowej. W architekturze ORG zdefiniowano pojecie ˛ mostu, który odpowiada za dostep ˛ do implementacji obiektu oraz komunikacje˛ z klientem. Most jest odpowiedzialny za unifikacje˛ danych przekazywanych w warstwie ORB. Pozwala on również na tworzenie domen, które odpowiedzialne sa˛ za poszczególne obiekty Corby (umożliwia to np. ograniczenie dostepności ˛ pewnych obiektów, do których maja˛ dostep ˛ tylko klienci z wybranej dziedziny. Wykład 5 – p. 43/54 Komunikacja miedzy ˛ domenami ORB Za komunikacje˛ wewnatrz ˛ domeny odpowiada protokół o nazwie GIOP (The General Inter-ORB Protocol). Główne jego zadanie to zapewnienie komunikacji poszczególnym obiektom ORB. Do komunikacji pomiedzy ˛ domenami ORB została utworzona specyfikacja protokołu IIOP (Internet Inter-ORB Protocol). IIOP wykorzystuje stos TCP/IP do komunikacji. Dzieki ˛ protokołom GIOP i IIOP możliwy jest dostep ˛ do Corby z poziomu różnych, nawet bardzo odmiennych od siebie, jezyków ˛ programowania. Wykład 5 – p. 44/54 Adapter obiektu Realizacja wywołania zdalnej metody w Corbie wymaga, aby po stronie serwera znajdował sie˛ mechanizm, który jest odpowiedzialny za bezpieczeństwo tej operacji, utworzenia referencji do obiektu oraz za aktywacje˛ implementacji. Taki mechanizm nazywa sie˛ adapterem obiektu. W chwili obecnej CORBA zawiera dwa podstawowe typy adapterów: Adapter BOA (Basic Object Adapter) charakteryzuje sie˛ niskim poziomem skomplikowania w implementacji. Jego wada˛ jest ograniczenie tylko do podstawowych operacji. Z tego powodu wielu producentów serwerów Corby dodaje do niego własne rozwiazania, ˛ co powoduje brak zgodności pomiedzy ˛ różnymi implementacjami. Adapter POA (Portable Object Adapter) zastepuje ˛ adapter BOA i zawiera brakujace ˛ operacje, które nie wystepuj ˛ a˛ w adapterze BOA. Wykład 5 – p. 45/54 Wywołanie zdalnych operacji Dostep ˛ do zdalnych obiektów może odbywać sie˛ w sposób statyczny lub dynamiczny: Statyczne wywołanie operacji nastepuje ˛ poprzez pieniek IDL (ang. IDL stub). Programista specyfikuje pieniek wykorzystujac ˛ jezyk ˛ IDL. Pieniek jest funkcja˛ klienta, która pozwala statycznie wywoływać zdalne operacje poprzez wywołanie „zwykłej” lokalnej funkcji (badź ˛ metody w przypadku jezyka ˛ obiektowego np. C++). Dynamiczne wywołanie operacji. Aplikacja może w trakcie działania może dokonać specyfikacji usługi, która jest wymagana. Niezbedna ˛ jest przy tym informacja o interfejsie i o niezbednych ˛ typach. Taka˛ informacje˛ można otrzymać od programisty lub programowo z interfejsu repozytorium. Wykład 5 – p. 46/54 Repozytorium Interfejsu Repozytorium Interfejsu umożliwia uzyskanie dostepu ˛ do interfejsów obiektów, operacji jakie sa˛ przez nie udostepnione ˛ oraz parametrów i typów jakie sa˛ w nich wykorzystywane. Można je traktować jako baz˛e danych zawierajac ˛ a˛ definicje˛ obiektów. Repozytorium interfejsu zawiera te same informacje, które znajduja˛ sie˛ w plikach IDL. Wykład 5 – p. 47/54 Repozytorium Implementacji Repozytorium Implementacji zawiera informacje o klasach serwera, instancjach obiektów i ich identyfikatorach. Wykorzystywane jest do zarzadzania ˛ obiektami. Używane jest również do lokalizacji i aktywacji zaimplementowanych obiektów. Obiekt po zarejestrowaniu w Repozytorium Implementacji uruchamiany jest automatycznie w momencie wystapienia ˛ żadania ˛ od klienta. Wykład 5 – p. 48/54