Uniwersytet dzki Wydzia Matematyki i Informatyki Katedra Analizy

  • Slides: 30
Download presentation
Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej Programowanie sieciowe w Javie RMI

Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej Programowanie sieciowe w Javie RMI Wykład 11 mgr inż. Michał Misiak

Remote Method Invocation n n n RMI jest to API, które pozwala na zdalne

Remote Method Invocation n n n RMI jest to API, które pozwala na zdalne wywoływanie procedur RPC (Remote Procedure Calls) w ramach JVM mogą być rozmieszczone na różnych maszynach Aplikacje RMI składają się z dwóch elementów serwera i klienta Aplikacje nazywane są distributed object application RMI pozwala na dynamiczne ładowanie definicji klas (stan + zachowanie) – możliwość zdalnego rozszerzenia funkcjonalności rozproszonych aplikacji Początkowo RMI API zostało zaprojektowane do wspierania różnych rodzajów transportu np. HTTP. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Serwer i Klient RMI n Serwer: ¨ tworzy zdalne obiekty i udostępnia na nie

Serwer i Klient RMI n Serwer: ¨ tworzy zdalne obiekty i udostępnia na nie referencje ¨ oczekuje na wywołanie metod na tych obiektach przez klienta n Klient: ¨ uzyskuje referencje na jeden bądź więcej obiektów zdalnych umieszczonych na serwerze ¨ woła metody na zdalnych obiektach Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Funkcje Distributed Object Apps n Lokalizacja zdalnych obiektów. ¨ n Komunikacja ze zdalnymi obiektami

Funkcje Distributed Object Apps n Lokalizacja zdalnych obiektów. ¨ n Komunikacja ze zdalnymi obiektami ¨ n Wiele sposobów na uzyskanie referencji np. obiekty mogą zostać zarejestrowane w usłudze nazw RMI-Registry lub referencja może zostać przekazana podczas wywoływania innej zdalnej metody. Komunikacja ze zdalnymi obiektami obsługiwana jest bezpośrednio przez RMI. Dla programisty komunikacja RMI wygląda identycznie jak wołanie metod. Załadowanie definicji klas ¨ Możliwość załadowania definicji klasy lub przesłania jej po przez sieć. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Komunikacja RMI JVM 2 JVM 1 RMI, 2 rmiregistry Klient RMI, 1 RMI, 3

Komunikacja RMI JVM 2 JVM 1 RMI, 2 rmiregistry Klient RMI, 1 RMI, 3 Serwer RMI 1 – zarejestrowanie zdalnego obiektu w usłudze nazw 2 – uzyskanie referencji do Obiektu o żądanej nazwie 3 – wywołanie metody na zdalnym obiekcie Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Zdalne interfejsy obiekty i metody n n n Rozproszone aplikacje RMI składają się z

Zdalne interfejsy obiekty i metody n n n Rozproszone aplikacje RMI składają się z interfejsów i klas. Klasy implementują metody z interfejsów oraz ew. dodatkowe Obiekty, których metody mogą być wołane po przez zewnętrzną JVM nazywają się zdalnymi obiektami (remote object) Obiekt staje się obiektem zdalnym w wyniku implementacji zdalnego interfejsu, a interfejs ten ma następujące cechy: rozszerza java. rmi. Remote ¨ każda z metod interfejsu deklaruje java. rmi. Remote. Exception ¨ Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Zdalne wołanie metod Remote JVM Local JVM SIEĆ Klient STUB RMI Runtime wypłac_pieniadze(instancja pieniadza)

Zdalne wołanie metod Remote JVM Local JVM SIEĆ Klient STUB RMI Runtime wypłac_pieniadze(instancja pieniadza) Serwer Rozliczeniowy SKELETON RMI Runtime Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Stub i Skeleton n n Klient woła zdalną metodę, wywołanie przekazywane jest do STUB’a

Stub i Skeleton n n Klient woła zdalną metodę, wywołanie przekazywane jest do STUB’a STUB jest odpowiedzialny za przesłanie zdalnego wywołania do leżącego po stronie serwera SKELETON’a STUB otwiera gniazdo dla zdalnego serwera, serializuje parametry obiektu i przekazuje strumień danych do SKELETON’u SKELETON zawiera metodę, która odbiera zdalne wywołanie, odtwarza zserializowane parametry i wywołuje rzeczywistą zdalną implementację obiektu. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Kroki przy tworzeniu aplikacji RMI Projekt i implementacja komponentów rozproszonej aplikacji RMI n Kompilacja

Kroki przy tworzeniu aplikacji RMI Projekt i implementacja komponentów rozproszonej aplikacji RMI n Kompilacja źródeł n Generacja Stub i Skeleton n Uczynienie klas dostępnych po przez sieć n Uruchomienie rmiregistry n Uruchomienie aplikacji n Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Projektowanie i implementacja komponentów n n Określenie, które komponenty są lokalne, a które zdalne

Projektowanie i implementacja komponentów n n Określenie, które komponenty są lokalne, a które zdalne Definicja zdalnych interfejsów. Określają metody, które będą mogły być wołane zdalnie przez klienta. Implementacja zdalnych obiektów. Zdalny obiekt musi implementować jeden bądź, więcej zdalnych interfejsów. Jeśli jakaś lokalna klasa jest przekazywana jako parametr bądź zwracana jako wartość musi zostać zaimplementowana jako zdalna. Implementacja klienta. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Uczynienie klas dostępnych przez sieć n Jednym ze sposobów jest umieszczenie skompilowanych klas na

Uczynienie klas dostępnych przez sieć n Jednym ze sposobów jest umieszczenie skompilowanych klas na web serwerze. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Przykładowy projekt aplikacji RMI n n n Nazwa projektu Compute Engine (CE), Java Sun

Przykładowy projekt aplikacji RMI n n n Nazwa projektu Compute Engine (CE), Java Sun Tutorial CE jest obiektem na serwerze, który otrzymuje od klienta różnego rodzaju zdania, dokonuje ich przeliczenia i zwraca wynik CE charakteryzuje się dużą elastycznością realizowanych zdań i może być wykorzystywany przez wielu klientów Oczywiście zbiór zdań nie musi być predefiniowany w momencie uruchamiania, czy też pisania silnika Wymaganie! Klasa reprezentująca zadanie musi implementować predefiniowane interfejsy. Aplikacja CE nie musi mieć świadomości zawartości zadania, klasy ładowane są dynamicznie – takie aplikacje nazywają się behaviorbased application Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Projekt zdalnego interfejsu n n n Głównym element służącym komunikacji pomiędzy klientem, a serwerem

Projekt zdalnego interfejsu n n n Głównym element służącym komunikacji pomiędzy klientem, a serwerem jest protokół, który reprezentowany jest przez zdalny interfejs Compute Interfece pozwala na wykonywanie metod przez CE. Implementując interfejsu java. rmi. Remote wskazuje na to, że jest zdalny. Task Interface mówi o tym jak powinno zostać dane zadanie wykonane. Jest parametrem, który jest umieszczany w metodzie execute. Task(Task) Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Compute & Task interface Compute Interface Implementacja tego interfejsu mówi, że dany komponent jest

Compute & Task interface Compute Interface Implementacja tego interfejsu mówi, że dany komponent jest zdalny. package compute; import java. rmi. Remote. Exception ; public interface Compute extends Remote { <T> T execute. Task(Task<T> t) throws Remote. Exception; } wyjątek rzucany przez RMI, w np. przypadku utraty komunikacji Task Interface package compute; public interface Task<T> { T execute(); } Generyczny typ zwracany po wykonaniu zdania. Uwaga! Obiekty przenoszone są po przez wartość. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Implementacja zdalnych interfejsów n Klasa reprezentująca zdalny obiekt powinna: ¨ Deklarować zdalne interfejsy ¨

Implementacja zdalnych interfejsów n Klasa reprezentująca zdalny obiekt powinna: ¨ Deklarować zdalne interfejsy ¨ Definiować konstruktor dla każdego zdalnego ¨ Implementować metody zdalnego interfejsu n obiektu Inicjalizacja zdalnego obiektu i eksport do RMI runtime w ramach RMI serwera ¨ utworzenie i instalacja security manager ¨ utworzenie i eksport zdalnych obiektów ¨ Rejestracja przynajmniej jednego obiektu w rmiregistry lub innej usłudze nazw np. JNDI Compute. Engine. java Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Deklaracja zdalnego interfejsu i jego implementacja n Deklaracja implementacji zdalnego interfejsu: ¨ public n

Deklaracja zdalnego interfejsu i jego implementacja n Deklaracja implementacji zdalnego interfejsu: ¨ public n n n class Compute. Engine implements Compute Konstruktor Compute. Engine oraz metoda main mogą być wołane jedynie lokalnie. Metoda main tworzy instancje Compute. Engine i czyni ją dostępną dla klienta Konstruktor woła bezparametrowo konstruktor klasy bazowej Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Implementacja zdalnych metod public <T> T execute. Task(Task<T> t) { return t. execute(); }

Implementacja zdalnych metod public <T> T execute. Task(Task<T> t) { return t. execute(); } Implementacja metody execute. Task tworzy swego rodzaj protokół pomiędzy klientem a serwerem. Parametr typu Task musi implementować interfejs, który posiada metodę execute. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Umieszczanie obiektów w RMI n n Każdy typ argumentu lub wartości zwracanej może być

Umieszczanie obiektów w RMI n n Każdy typ argumentu lub wartości zwracanej może być przekazywany w sytuacji, gdy jest: prymitywnym typem, zdalnym obiektem, typem, który może być zserializowany Obiekty typów takich jak: wątki, deskryptory pliku – nie mogą być serializowane Dana klasa jest serializowana, wówczas, gdy implementuje interfejs Serializable Obiekty zdalne przekazywane są przez referencje. Referencja na zdalny obiekt to STUB. ¨ n Obiekty lokalne przekazywane są jako kopie, wykorzystując serializację. ¨ n STUB – proxy po stronie klienta, który implementuje pełen zbiór interfejsów zdalnych, implementowanych przez obiekt zdalny Wszystkie pola są kopiowane z wyjątek transient i static. W przypadku przekazywania obiektu zdalnego, dostępne są wyłącznie interfejsy zdalne dla zdalnego JVM. Metody w ramach interfejsów nie-zdalnych nie będą widoczne dla zdalnego JVM. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Implementacja metody main n Wykorzystywana do uruchomienia Compute. Engine – musi zainicjalizować wybrane komponenty:

Implementacja metody main n Wykorzystywana do uruchomienia Compute. Engine – musi zainicjalizować wybrane komponenty: ¨ Utworzenie i instalacja Security Manager ¨ Uczynienie obiektów zdalnych widocznych dla klienta Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Utworzenie i instalacja Security Manager n n n Chroni system przez niezaufanymi źródłami Określa

Utworzenie i instalacja Security Manager n n n Chroni system przez niezaufanymi źródłami Określa prawa dostępu do zasobów: wykonywanie określonych poleceń, korzystanie z lokalnego systemu plików Niezainstalowanie SM uniemożliwi ściągnięcie klas dla parametrów przekazywanych w zdalnym wywołaniu lub zwracanych Tworzenie i instalowanie SM if (System. get. Security. Manager() == null) { System. set. Security. Manager(new Security. Manager()); } Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Udostępnianie zdalnych obiektów klientowi Compute engine = new Compute. Engine(); Compute stub = (Compute)

Udostępnianie zdalnych obiektów klientowi Compute engine = new Compute. Engine(); Compute stub = (Compute) Unicast. Remote. Object. export. Object(engine, 0); n Unicast. Remote. Object. export. Object – ¨ ¨ ¨ metoda eksportuje dostarczone zdalne obiekty, tutaj jest to engine drugi parametr to port TCP. Wartość 0 oznacza port anonimowy – port jest wybierany przez system, bądź przy starcie RMI poprawne wykonanie metody export. Object pozwala na wykonywanie zdalnych wywołań przez Compute. Engine typ na który jest rzutowanie to Compute, gdyż Compute jest interfejsem zdalnym metoda export. Object może rzucić wyjątkiem Remote. Exception Wyjątek Remote. Exception jest rzucany w przypadku braku zadeklarowanych zasobów, np. wybrany port jest już wykorzystywany. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

rmiregistry n n n Jest to szczególny typ obiektu zdalnego, który służy do znajdowywania

rmiregistry n n n Jest to szczególny typ obiektu zdalnego, który służy do znajdowywania referencji na inne zdalne obiekty po przez nazwę rmiregistry służy przeważnie do znajdowania pierwszego zdalnego obiektu, za pomocą którego będą uzyskane referencje na inne zdalne obiekty Wywołanie metody get. Registry bez parametrów powoduje założenie rejestru na lokalnej maszynie na porcie 1099 Utworzony obiekt Compute. Engine nie jest nigdy przekazywany. Następuje przekazanie wyłączenie STUB w wyniku wyszukania danego obiektu zdalnego w rejestrze nazw Nie jest konieczne utrzymywanie przy życiu obiektu Compute. Engine. Dopóki istnieje referencja na Compute. Engine w innej JVM dopóty serwer nie zostanie wyłączony. Registry registry = Locate. Registry. get. Registry(); registry. rebind(name, stub); Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Program klienta Na kliencie wymagana jest definicja zadania, które zostanie wykonane zdalnie n Klasa

Program klienta Na kliencie wymagana jest definicja zadania, które zostanie wykonane zdalnie n Klasa Compute. Pi wyszukuje i wywołuje obiekt Compute n Klasa Pi implementuje interfejs zadania (Task Interface) oraz definiuje pracę, która powinna zostać wykonana przez Compute. Engine public interface Task<T> { n T execute(); } Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Interfejs Task i klasa Compute. Pi public interface Task<T> { T execute(); } Nazwa

Interfejs Task i klasa Compute. Pi public interface Task<T> { T execute(); } Nazwa hostu, na którym Compute jest uruchomione public class Compute. Pi { public static void main(String args[]) { if (System. get. Security. Manager () == null) { System. set. Security. Manager(new Security. Manager()); } try { String name = "Compute"; Registry registry = Locate. Registry. get. Registry(args[0]); Compute comp = (Compute) registry. lookup(name); Pi task = new Pi(Integer. parse. Int(args[1])); Big. Decimal pi = comp. execute. Task(task); System. out. println(pi); } catch (Exception e) { System. err. println("Compute. Pi exception: "); e. print. Stack. Trace(); } } } Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Mechanizm działania Compute. Engine Registry. lookup rmiregistry Uwaga! • Każda zseralizowana klasa musi deklarować

Mechanizm działania Compute. Engine Registry. lookup rmiregistry Uwaga! • Każda zseralizowana klasa musi deklarować zmienną statyczną serial. Version. UID w celu zapewnienia kontroli wersji serializacji Compute. Pi Registry. rebind Compute. execute. Task Compute. Engine Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Kompilacja interfejsów n Projekt został podzielony na 3 pakiety: compute – zawiera interfejsy Compute

Kompilacja interfejsów n Projekt został podzielony na 3 pakiety: compute – zawiera interfejsy Compute and Task ¨ engine – implementacja klasy Compute. Engine ¨ client – zawiera kod klienta Compute. Pi oraz implementacje zadania Pi ¨ n Stworzenie JAR z interfejsów javac computeCompute. java ¨ computeTask. java jar cvf compute. jar compute*. class ¨ n Umieszczenie plików w ogólnie dostępnym z sieci miejscu Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Kompilacja serwera n Kompilacja: ¨ javac -cp c: homeannpublic_htmlclassesco mpute. jar engineCompute. Engine. java

Kompilacja serwera n Kompilacja: ¨ javac -cp c: homeannpublic_htmlclassesco mpute. jar engineCompute. Engine. java Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Kompilacja klienta n Kompilacja: ¨ javac -cp c: homejonespublic_htmlclasses compute. jar clientCompute. Pi. java

Kompilacja klienta n Kompilacja: ¨ javac -cp c: homejonespublic_htmlclasses compute. jar clientCompute. Pi. java clientPi. java n Klasę Pi należy ponownie skompilować ponieważ ma być dostępna dla serwera. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Specyfikacja Security Manager Dla serwera: grant code. Base "file: /home/ann/src/" { permission java. security.

Specyfikacja Security Manager Dla serwera: grant code. Base "file: /home/ann/src/" { permission java. security. All. Permission; }; Wszelkie przyzwolenia dla kodu znajdującego się w katalogu źródłowym Dla klienta: grant code. Base "file: /home/jones/src/" { permission java. security. All. Permission; }; Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Uruchomienie serwera i klienta n Uruchomienie rejsteru RMI ¨ start/javaw rmiregistry Uruchomienie serwera java

Uruchomienie serwera i klienta n Uruchomienie rejsteru RMI ¨ start/javaw rmiregistry Uruchomienie serwera java -cp c: homeannsrc; c: homeannpublic_htmlclassescompute. jar -Djava. rmi. server. codebase=file: /c: /home/ann/public_html/classes/compute. jar -Djava. rmi. server. hostname=zaphod. east. sun. com -Djava. security. policy=server. policy engine. Compute. Engine Uruchomienie klienta java -cp c: homejonessrc; c: homejonespublic_htmlclassescompute. jar Djava. rmi. server. codebase=file: /c: /home/jones/public_html/classes/ -Djava. security. policy=client. policy client. Compute. Pi zaphod. east. sun. com 45 Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007