360 likes | 543 Views
Adam Ptaszek Krystian Formiński. Mechanizm RMI . Co to jest RMI ?.
E N D
Adam Ptaszek Krystian Formiński Mechanizm RMI
Co to jest RMI ? Najkrócej ujmując, pakiet RMI (ang. Remote Method Invocation – zdalne wywołanie metod) pozwala on aplikacji klienta wywoływać metody zdalnych obiektów języka Java, czyli obiektów z innej przestrzeni adresowej, mogącej znajdować się na tej samej lub innej maszynie.
RMI pozwala danej aplikacji • wywoływać metody obiektów zdalnych oraz • uzyskać dostęp do obiektów zdalnych (np. w celu przypisania ich do zmiennych, przekazania w liście parametrów do metod) innych aplikacji umieszczonych na innych komputerach w sieciach, pracujących pod innymi systemami operacyjnymi i znajdujących się w różnych środowiskach Java tak, jak obiektów lokalnych.
RMI realizuje to za pomocą • przesyłania całych obiektów lub ich fragmentów przez odwołanie lub przez wartość za pomocą mechanizmu serializacji • za pośrednictwem ściśle zdefiniowanego protokołu z użyciem gniazd bez bezpośredniego uwidaczniania w programie tych mechanizmów.
RMI obejmuje trzy procesy • proces klienta, wywołującego metody zdalnych obiektów, • proces serwera, dostarczającego zdalnych obiektów, • proces rejestru, wiążącego obiekty z ich nazwami. Obiekty są zgłaszane do rejestru przez serwer. Aplikacja klienta może uzyskać dostęp do zarejestrowanego obiektu pod warunkiem, że najpierw używając wcześniej poznanej nazwy obiektu, skorzysta z rejestru, by otrzymać referencję do obiektu odpowiadającą tej nazwie.
Architektura trójwarstwowa RMI • warstwa pośrednia po stronie klienta i warstwa szkieletowa po stronie serwera – ukrywają zdalne wywołania metod przed klasami i obiektami zdefiniowanymi lokalnie. Obiekt z warstwy pośredniej stanowi odpowiednik lokalny obiektu zdalnego
Architektura trójwarstwowa RMI • warstwa odwołań zdalnych – „pakuje” wywołania metod, parametrów i zwracanych rezultatów w sposób umożliwiający transport w sieci • warstwa transportowa – właściwe połączenie sieciowe systemów za pomocą TCP, UDP, GCP w połączeniu z SSL
Komunikacja RMI Do komunikacji RMI wykorzystuje przeważnie dwa rodzaje protokołów. Pierwszy z nich to JRMP (Java Remote Method Protocol) – do wersji 1.2. Począwszy od wersji 1.3 używa się IIOP (Internet Inter-ORB Protocol). Warstwa transportowa RMI ma zapewniać odpowiednią obsługę połączeń. Przykładowo, jeśli aplikacja chce korzystać z kilku równoczesnych połączeń natomiast konfiguracja sieci dopuszcza tylko jedno połączenie, warstwa transportowa RMI udostępnia kilka wirtualnych połączeń w ramach jednego połączenia TCP/IP.
Obiekt zdalny • mechanizm RMI umożliwia tworzenie obiektów zdalnych • jedyna forma zdalnego dostępu polega na wywoływaniu metod wyspecyfikowanych w interfejsie wywiedzionym (dziedziczącym) java.rmi.Remote • ten sam interfejs może być implementowany przez wiele obiektów • interfejs traktowany jest jak typ danych
Dostępność obiektu • informacja o typie obiektu (czyli o zdalnym interfejsie) dostępna jest w czasie kompilacji • wiązanie obiektu jest jawne i odbywa się w czasie wykonania
Trwałość obiektu • obiekt udostępniany przez UnicastRemoteObject ma charakter przejściowy (istnieje tylko w czasie działania serwera) • dostępny jest mechanizm obiektów aktywowalnych, ale brak bezpośredniego wsparcia dla utrwalania stanu obiektu
Lokalizacja obiektów zdalnych Istnieją dwa mechanizmy, dzięki którym aplikacja może zlokalizować obiekty zdalne, tj. uzyskać do nich referencję: • aplikacja może zarejestrować swoje obiekty z metodami wykonywanymi zdalnie w serwisie nazw, np. w rmiregistry • aplikacja może zwrócić i przekazać referencję do obiektu zdalnego w trybie normalnej swojej pracy
Komunikacja z obiektami zdalnymi Szczegóły komunikacji z obiektami zdalnymi ukryte są przed użytkownikiem. Wszystkie niezbędne metody i operacje dostarcza RMI. Programista korzysta z metod obiektów zdalnych tak, jakby były to wywołania metod obiektów lokalnych.
Ładowanie kodu bajtowego klas obiektów przekazywanych zdalnie RMI pozwala wywoływać metody zdalne, którym można przekazać obiekty jako parametry. Jest to możliwe, gdyż RMI dostarcza mechanizmu ładowania kodu bajtowego obiektów, jak również przesyłanie ich poprzez sieć.
Ładowanie kodu bajtowego klas obiektów przekazywanych zdalnie
Zalety dynamicznego ładowania kodu • RMI pozwala na ładowanie (ściąganie) kodów bajtowych klas danego obiektu, jeśli klasa ta nie jest zdefiniowana na wirtualnej maszynie odbiorcy. • typy oraz własności obiektu, wcześniej dostępnego tylko na pojedynczej wirtualnej maszynie, mogą być transmitowane do innej, być może zdalnej, wirtualnej maszyny. RMI przesyła obiekty z ich prawdziwym typem, stąd własności obiektu nie ulegają zmianie podczas przesyłania. Pozwala to na wprowadzanie nowych typów na zdalną maszynę wirtualną, dynamicznie rozszerzając własności aplikacji.
Zdalne interfejsy, obiekty i metody • podobnie do innych rozwiązań, rozproszone aplikacje bazujące na RMI używają klas i interfejsów. Interfejsy definiują metody, zaś klasy implementują metody tych interfejsów (obok innych metod, którymi dysponują). • w aplikacjach rozproszonych korzysta się z metod obiektów znajdujących się na różnych maszynach wirtualnych. Takie obiekty nazywane są wtedy obiektami zdalnymi. Obiekt staje się obiektem zdalnym, kiedy implementuje zdalny interfejs.
Zdalne interfejsy, obiekty i metody Interfejs zdalny charakteryzujący się tym, że: • rozszerza interfejs java.rmi.Remote. • każda metoda interfejsu zgłasza wyjątek java.rmi.RemoteException (obok własnych wyjątków)
Zdalne interfejsy, obiekty i metody RMI traktuje obiekty zdalne inaczej niż inne obiekty, gdy przekazywane są one z jednej maszyny wirtualnej na drugą. Zamiast robić kopię po stronie odbiorcy, RMI przekazuje zdalną namiastkę zdalnego obiektu. Namiastka pracuje jako lokalny przedstawiciel, lub pełnomocnik (proxy) obiektu zdalnego, i jest dla użytkownika (wywołującego metody zdalnego obiektu) zdalną referencją. Użytkownik wywołuje właściwie metodę namiastki, która jest odpowiedzialna za przekazanie tego wywołania do obiektu zdalnego.
Zdalne interfejsy, obiekty i metody Namiastka obiektu zdalnego implementuje te same metody interfejsu zdalnego, co sam obiekt zdalny. Dlatego pełnić rolę interfejsu, którym dysponuje zdalny obiekt. Jednak namiastka udostępnia tylko metody interfejsu zdalnego, które są dostępne na zdalnej maszynie wirtualnej.
Bezpieczeństwo Zarządca bezpieczeństwa to obiekt klasy java.lang.SecurityManager lub jej podklasy (aktualnie tylko RMISecurityManager). Jego zadaniem jest zezwalanie lub nie na wykonywanie przez aplikację potencjalnie niebezpiecznych czynności. Zarządca bezpieczeństwa ma możliwość sprawdzenia niektórych skutków wykonywanej operacji przed jej wykonaniem i może ją anulować jeśli uzna, że jej wykonanie jest niebezpieczne dla systemu - zgłosi wtedy wyjątek SecurityException. W przypadku RMI niebezpieczne może być wykonywanie kodu pobranego z sieci.
Bezpieczeństwo Przykładami operacji, które mogą znaleźć się w takim kodzie, a na które może nie zezwolić zarządca są: • zakończenie maszyny wirtualnej • zapis na dysk lokalny • drukowanie.
Bezpieczeństwo • Zarządcę bezpieczeństwa musi instalować klient, który pobiera z sieci odniesienie do obiektu zdalnego, którego klasa nie jest znana lokalnie (nie ma jej na ścieżce poszukiwań klas). Musi zostać wtedy przesłana i wprowadzona do maszyny wirtualnej klienta klasa namiastki zdalnego obiektu. W przypadku serwera nie zawsze jest to konieczne. Jeśli klient przekazuje jako argumenty metod obiekty klas, których definicji nie ma po stronie serwera (bo są to własne klasy klienta), to serwer również musi zainstalować zarządcę i odpowiednio skonfigurowany plik polityki. Jeśli tego nie zrobi - nie będzie mógł załadować klasy argumentu (na skutek wyjątku zgłoszonego przez maszynę wirtualną)
Pliki polityki • Zachowanie zarządcy definiują pliki polityki. Są to pliki tekstowe, w których opisuje się zakres pozwoleń udzielanych aplikacji (np. umożliwienie dostępu do określonego katalogu na dysku, bądź obiór danych z określonego komputera w sieci).
Pliki polityki Składnia tych plików jest opisana w dokumentacji klasy • java.lang.SecurityManager oraz w dokumentach • docs/guide/security/permissions.html • docs/guide/security/PolicyFiles.html dostarczanych wraz z dokumentacją SDK Javy.
Pliki polityki Oto zawartość pliku polityki, zezwalającego na wszystko grant { permissionjava.security.AllPermission; };
Tworzenie rozproszonych aplikacji w RMI Podstawowe kroki przy tworzeniu aplikacji rozproszonej: • projektowanie i implementacja komponentów aplikacji rozproszonej • kompilacja źródeł i generacja namiastek • udostępnienie klas w sieci • uruchomienie aplikacji
Projektowanie i implementacja komponentów aplikacji rozproszonej Polega na określeniu architektury aplikacji i zdefiniowaniu obiektów, które powinny być zdalnie dostępne. Na krok ten składa się: 1. definicja zdalnych interfejsów, zawierających metody do zdalnego wywoływania przez klientów (programy klientów będą korzystać z tych interfejsów, a nie z ich implementacji).
2. implementacja zdalnych obiektów (obiekty zdalne muszą implementować jeden lub więcej zdalnych interfejsów. Klasy takich obiektów mogą zawierać implementacje innych interfejsów (lokalnych lub zdalnych) oraz inne metody (dostępnie lokalnie). Jeśli klasy lokalne mają być użyte jako parametry lub wartości zwracane tych metod, to muszą one być również zaimplementowane.
3. Implementacja aplikacji serwerów i klientów (klienci używający zdalnych obiektów mogą być zaimplementowani w dowolnej chwili po zdefiniowaniu zdalnych interfejsów oraz po utworzeniu obiektów zdalnych w aplikacjach serwerów)
Kompilacja źródeł i generacja namiastek • Na początek kompilowane są (javac) pliki źródłowe zawierające: interfejsy zdalne, ich implementacje, klasy serwerów i klasy klientów. • Następnie uruchamiany jest kompilator rmic, aby utworzyć namiastki obiektów zdalnych. RMI wykorzystuje namiastki zdalnych obiektów jako pośredników w klientach Namiastki tworzą na maszynie klienta blok informacji przesyłanych do serwera, składający się z: • identyfikator obiektu zdalnego • opis metody, która ma zostać wywołana • szeregowane parametry Odbiorca po stronie serwera dla każdego zdalnego wywołania metody • rozszeregowuje parametry • lokalizuje obiekt, którego metoda ma być wywołana • wywołuje metodę i jej wynik (lub wyjątek) szereguje • wysyła szeregowane dane jako informację zwrotną na stronę klienta
Przygotowanie wdrożenia W kroku tym pliki klas związanych ze zdalnym interfejsem, namiastki oraz inne potrzebne klasy udostępniane są w sieci (np. przez Web serwer).
Uruchomienie aplikacji Przy umieszczeniu serwera i klienta na jednym komputerze: 1. Uruchomieniu rejestru RMI na tej samej maszynie, co serwer. Podczas uruchamiania rejestru RMI w ścieżce klas nie powinno być widać żadnych klas należących do aplikacji start rmiregistry 2. Uruchomieniu aplikacji serwera (zakładamy, że działa serwer http) java –Djava.rmi.server.codebase=http://localhost/download/ MyServer Jeśli chcemy korzystać z lokalnego katalogu (nie przez serwer http): java –Djava.rmi.server.codebase=file:/F:\RMItest/ -classpath "F:\RMItest" MyServer 3. Uruchomieniu aplikacji klienta. java –Djava.security.policy=client.policyMyClient
Przy umieszczeniu serwera zdalnie można skorzystać z adresów URL plików. Konfiguracja i uruchomienia są wtedy następujące: client.policy (dla połączeń RMI oraz HTTP) grant { permissionjava.net.SocketPermission "*:1024-65535", "connect" permissionjava.net.SocketPermission "*:80", "connect" permissionjava.io.FilePermission "downloadDirectory", "read" } gdzie zamiast * można umieścić nazwę komputera uruchomienie rejestru RMI • uruchomienie serwera java –Djava.rmi.server.codebase=file://home/test/download/ MyServer& lub start java –Djava.rmi.server.codebase=file://c:\home\test\download/ MyServer można też podać dodatkowe opcje: -Djava.rmi.server.hostname=jakishost.com -Djava.security.policy=java.policy • uruchomienie klienta