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