Wykład 7 - Instytut Informatyki Teoretycznej i Stosowanej
Transkrypt
Wykład 7 - Instytut Informatyki Teoretycznej i Stosowanej
Oprogramowanie systemów równoległych i rozproszonych Wykład 7 Dr inż. Tomasz Olas [email protected] Instytut Informatyki Teoretycznej i Stosowanej Politechnika Cz˛estochowska Wykład 7 – p. 1/2 Zdalne wywołanie metod - koncepcja RMI (Remote Method Invocation) - obiektowe RPC, dostarcza klientowi interfejs do obiektu, implementacja obiektu jest ukryta przed klientem (implementacja obiektu może ulec zmianie pod warunkiem, że interfejs obiektu pozostaje bez zmian). Wykład 7 – p. 2/2 Odniesienie do obiektu Odniesienie obiektowe (ang. object reference) - globalny w skali systemu adres obiektu, odniesienie może być przekazywane pomiedzy ˛ procesami pracujacymi ˛ na różnych maszynach, wnetrze ˛ odniesienia jest zazwyczaj ukryte przed procesem, problemy implementacyjne: jak zabezpieczyć odniesienie przed unieważnieniem z powodu awarii serwera? jaka informacja powinna być „zaszyta” w odniesieniu. rozwiazania: ˛ rejestr obiektów, serwer lokalizacji. Wykład 7 – p. 3/2 Rodzaje obiektów Implementacja obiektu: obiektowa - realizowana przez obiekty jezyka ˛ programowania, nieobiektowa - jest wymagany adapter obiektu. Trwałość obiektów: obiekty trwałe (ang. persistemt) - sa˛ niezależne od serwera i moga˛ przetrwać jego awarie, ˛ obiekty nietrwałe (ang. transient) - istnieja˛ tak długo jak działa serwer. Wykład 7 – p. 4/2 Wywołania statyczne i dynamiczne Wywołania statyczne: z pomoca˛ statycznego pieńka. Wywołania dynamiczne: bez statycznej wiedzy o obiekcie, przykładowe zastosowanie - przegladarka ˛ obiektów. Ogólna postać wywołania dynamicznego: invoke(obiekt, metoda, argumenty_wejściowe, argumenty_wyjściowe) np. dla wywołania MojObiekt.MojaMetoda(i): invoke(MojObiekt, ID(MojaMetoda), i, NULL) Wykład 7 – p. 5/2 Java - RMI RMI to podstawowy mechanizm typu RPC dostepny ˛ w jezyku ˛ Java. W przeciwieństwie do Sun RPC jest mechanizmem w pełni obiektowym i nowoczesnym. W przeciwieństwie do RPC 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. Zdalny obiekt w całości znajduje sie˛ na jednej maszynie. Wykład 7 – p. 6/2 Model przepływu danych Wykład 7 – p. 7/2 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 7 – p. 8/2 Komunikacja pomiedzy ˛ klientem i serwerem Wykład 7 – p. 9/2 RMI - przekazywanie parametrów (I) public class MojSerwer extends UnicastRemoteObject implements Remote { public Double zdalnaMetoda(Object p) throws RemoteException { p.innaMetoda(); } } W jaki sposób jest przekazywany parametr p bed ˛ acy ˛ obiektem? Wykład 7 – p. 10/2 RMI - prezkazywanie parametrów (II) Przekazywanie przez wartość/kopie˛ (ang. pass-by-value/copy) Wykład 7 – p. 11/2 RMI - prezkazywanie parametrów (III) Przekazywanie przez odniesienie (ang. pass-by-reference) Wykład 7 – p. 12/2 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 7 – p. 13/2 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 7 – p. 14/2 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 - dla niezwielokrotnionych nietrwałych obiektów, java.rmi.server.Activatable - dla obiektów trwałych. Wykład 7 – p. 15/2 Bezpieczeństwo RMI Niektóre operacje wymagaja˛ jawnego wskazania, że moga˛ zostać wykonane, np ładowanie kodu z zewnatrz. ˛ Program Java może utworzyć zarzadce ˛ bezpieczeństwa (ang. Security manager ), który ustala polityk˛e bezpieczeństwa (ang. Security policy). W jezyku ˛ Java można w tym celu użyć specjalnej klasy RMISecurityManager. Do zdefiniowania zasad bezpieczeństwa można użyć obiektu klasy Policy lub pliku konfiguracyjnego security.policy, np: grant { permission java.security.AllPermission; }; Wykład 7 – p. 16/2 Przykład - Definicja interfejsu import java.rmi.*; public interface MojInterfejs extends Remote { public Double zdalnaMetoda(int i) throws RemoteException; // inne zdalne funkcje ... } Wykład 7 – p. 17/2 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 7 – p. 18/2 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 7 – p. 19/2 Przyklad - kompilacja javac MojInterfejs.java wynik: MojInterfejs.class javac MojSerwer.java wynik: MojSerwer.class javac MojKlient.java wynik: MojKlient.class rmic MojSerwer wynik: MojSerwer_Stub.class, MojSerwer_Skel.class Wykład 7 – p. 20/2 Przykład - uruchomienie Uruchomienie rejestru serwerów: rmiregistry Uruchomienie serwera: java MojSerwer Uruchomienie klienta: java -Djava.security.policy=dostep.policy MojKlient Wykład 7 – p. 21/2