wersja do druku - Instytut Informatyki Teoretycznej i Stosowanej
Transkrypt
wersja do druku - Instytut Informatyki Teoretycznej i Stosowanej
Zdalne wywołanie metod - koncepcja RMI (Remote Method Invocation) - obiektowe RPC, Oprogramowanie systemów równoległych i rozproszonych Wykład 7 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). Dr inż. Tomasz Olas [email protected] Instytut Informatyki Teoretycznej i Stosowanej Politechnika Cz˛estochowska Wykład 7 – p. 1/21 Wykład 7 – p Rodzaje obiektów Odniesienie do obiektu Odniesienie obiektowe (ang. object reference) - globalny w skali systemu adres obiektu, Implementacja obiektu: obiektowa - realizowana przez obiekty jezyka ˛ programowania, odniesienie może być przekazywane pomiedzy ˛ procesami pracujacymi ˛ na różnych maszynach, nieobiektowa - jest wymagany adapter obiektu. Trwałość obiektów: wnetrze ˛ odniesienia jest zazwyczaj ukryte przed procesem, obiekty trwałe (ang. persistemt) - sa˛ niezależne od serwera i moga˛ przetrwać jego awarie, ˛ problemy implementacyjne: jak zabezpieczyć odniesienie przed unieważnieniem z powodu awarii serwera? obiekty nietrwałe (ang. transient) - istnieja˛ tak długo jak działa serwer. jaka informacja powinna być „zaszyta” w odniesieniu. rozwiazania: ˛ rejestr obiektów, serwer lokalizacji. Wykład 7 – p. 3/21 Wykład 7 – p Wywołania statyczne i dynamiczne Java - RMI Wywołania statyczne: RMI to podstawowy mechanizm typu RPC dostepny ˛ w jezyku ˛ Java. z pomoca˛ statycznego pieńka. 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. ˛ Wywołania dynamiczne: bez statycznej wiedzy o obiekcie, przykładowe zastosowanie - przegladarka ˛ obiektów. Jezykiem ˛ specyfikacji interfejsu jest sama Java. Ogólna postać wywołania dynamicznego: RMI zostało właczone ˛ do JDK w wersji 1.1. invoke(obiekt, metoda, argumenty_wejściowe, argumenty_wyjściowe) Zdalny obiekt w całości znajduje sie˛ na jednej maszynie. np. dla wywołania MojObiekt.MojaMetoda(i): invoke(MojObiekt, ID(MojaMetoda), i, NULL) Wykład 7 – p. 5/21 Model przepływu danych Wykład 7 – p 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. 7/21 Wykład 7 – p Komunikacja pomiedzy ˛ klientem i serwerem 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. 9/21 RMI - prezkazywanie parametrów (II) Wykład 7 – p. RMI - prezkazywanie parametrów (III) Przekazywanie przez wartość/kopie˛ (ang. pass-by-value/copy) Przekazywanie przez odniesienie (ang. pass-by-reference) Wykład 7 – p. 11/21 Wykład 7 – p. rmiregistry Obsługa obiektów - klasa Naming Do nawiazania ˛ łaczności ˛ pomiedzy ˛ klientem a serwerem służy rejestr serwerów (rmiregistry). 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 Realizuje on wyszukiwanie obiektów na podstawie ich nazwy. Nazwa obiektu przyjmuje format URL //host:port/nazwa, gdzie: nazwa już wystepuje ˛ zwracany jest wyjatek ˛ klasy AlreadyBoundException, host - nazwa lub adres komputera gdzie uruchomiony jest rebind() - wiaże ˛ obiekt zdalny z podana˛ nazwa˛ - jeśli podana nazwa już wystepuje ˛ przypisany do niej obiekty jest zastepowany ˛ nowym, rejestr, port - numer portu (domyślnie 1099), nazwa - nazwa przyjeta ˛ dla obiektu zdalnego w rejestrze. 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. 13/21 Implementacja klasy serwera Wykład 7 – p. Bezpieczeństwo RMI 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 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: niezwielokrotnionych nietrwałych obiektów, java.rmi.server.Activatable - dla obiektów trwałych. grant { permission java.security.AllPermission; }; Wykład 7 – p. 15/21 Wykład 7 – p. Przykład - klasa serwera Przykład - Definicja interfejsu import java.rmi.*; import java.rmi.*; import java.rmi.server.*; import java.net.*; public interface MojInterfejs extends Remote { public Double zdalnaMetoda(int i) throws RemoteException; public class MojSerwer extends UnicastRemoteObject implements MojInterfejs { public MojSerwer() throws RemoteException { ... } // inne zdalne funkcje ... } 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. 17/21 Przykład - klasa klienta Wykład 7 – p. Przyklad - kompilacja 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/21 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. 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/21