rmi i rmi-iiop

22
RMI I RMI-IIOP Wprowadzenie Co to jest RMI? RMI (Remote Method Invocation) jest metodą programowania rozproszonego wprowadzoną w JDK 1.1. RMI dostarcza zestaw narzędzi umożliwiających pisanie programów rozproszonych przy użyciu takiej samej syntaktyki i semantyki jak dla programów pracujących na jednym komputerze (jednej maszynie javy, JVM).

Upload: odele

Post on 09-Jan-2016

98 views

Category:

Documents


3 download

DESCRIPTION

RMI I RMI-IIOP. Wprowadzenie Co to jest RMI? - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: RMI I RMI-IIOP

RMI I RMI-IIOP

Wprowadzenie

Co to jest RMI?

RMI (Remote Method Invocation) jest metodą programowania rozproszonego wprowadzoną w JDK 1.1. RMI dostarcza zestaw narzędzi umożliwiających pisanie programów rozproszonych przy użyciu takiej samej syntaktyki i semantyki jak dla programów pracujących na jednym komputerze (jednej maszynie javy, JVM).

 

Page 2: RMI I RMI-IIOP

Zalety RMI

Podstawową zaletą RMI jest prostota jego używania. W porównaniu z np. CORBĄ, RMI jest proste i mało skomplikowane. Zapewnia niezależność programów od procesora (wystarczy działająca maszyna Javy - Java VM). Troszczy się o szczegóły przesyłania obiektów, ich serializację i deserializację.

 

Page 3: RMI I RMI-IIOP

Ograniczenia RMI

Podstawowym ograniczeniem i wadą RMI jest wsparcie tylko dla programów napisanych w Javie. Zarówno klient jak i serwer muszą być aplikacjami lub apletami Javy i nie można komunikować się z programami napisanymi w żadnym innym języku programowania za pomocą tego mechanizmu. To bardzo ogranicza zastosowanie RMI, ponieważ o ile po stronie klienta prędkość (lub raczej powolność) programów napisanych w Javie może być akceptowana, o tyle w przypadku serwera użycie Javy często jest niemożliwe.

 

Page 4: RMI I RMI-IIOP

Jak działa RMI

RMI oddziela definicję zachowania (interfejs) od jego implementacji i pozwala na uruchamianie implementacji na oddzielnej maszynie Javy. Odpowiada to programowaniu typu klient-serwer, gdzie klient wykorzystuje zdefiniowany interfejs, a serwer dostarcza jego implementację. RMI dba o szczegóły dotyczące protokołu, przekazywania parametrów zwracania wyników.

 

Page 5: RMI I RMI-IIOP

Jak działa RMI cd.

Interfejs Javy nie zawiera wykonywalnego kodu, więc RMI używa dwóch klas implementujących ten sam interfejs. Pierwsza klasa implementuje działanie (service implementation) i jest uruchamiana na serwerze. Druga klasa funkcjonuje jako pośrednik (service proxy) dla wywołań klienta. Program klienta wywołuje metody w klasie pośredniczącej, a ta przekazuje je do zdalnego serwera oraz pobiera zawracane wyniki.

 

Page 6: RMI I RMI-IIOP

Schemat działania RMI

Klient Rejestr

Serwer

Web serwer

RMI

RMI RMI

Serwer odwołuje się do rejestru w celu uzyskania referencji do „zdalnego obiektu poprzez skojarzenie z nim nazwy.Klient wykorzystując tę nazwę lokalizuje obiekt w rejestrze serwera poczym wywołuje jedną z metod obiektu.

Page 7: RMI I RMI-IIOP

Warstwy RMI

Implementacja RMI oparta jest na trzech warstwach abstrakcji.

Pierwsza to warstwa szkieletów i trzonów (stubs and skeletons). Warstwa ta jest bezpośrednio używana przez programistę. Przyjmuje ona wywołania metod skierowane do interfejsu i przekazuje do zdalnych wywołań RMI.

Kolejną warstwą jest warstwa referencji (remote reference layer). Warstwa ta odpowiada za interpretację i zarządzanie referencjami do obiektów przekazywanych między klientem, a serwerem. Dokonuje automatycznej serializalizacji oraz deserializacji obiektów lub przekazuje zdalne referencje do nich.  

Page 8: RMI I RMI-IIOP

Warstwy RMI cd.

Warstwa transportowa (transport layer) bazuje na protokole TCP/IP i dostarcza podstawowego połączenia między systemami. Może być zastąpiona implementacją bazującą np. na protokole UDP.

Page 9: RMI I RMI-IIOP

Warstwa szkieletów i trzonków

Szkielet jest klasą pomocniczą generowaną przez RMI, która potrafi komunikować się z trzonem poprzez łącze RMI. Szkielet jest klasą działającą na serwerze. Odbiera parametry z połączenia RMI, przekazuje je do wywoływanej klasy serwera. Otrzymany wynik przekazuje z powrotem do klienta poprzez łącze RMI. Od wersji 2 JDK klasy szkieletów nie są wymagane. Trzon łączy się bezpośrednio z obiektami na zdalnym serwerze. Trzon jest klasą generowaną przez RMI, służy jako pośrednik między programem klienta, a RMI. Przekazuje parametry wywołania do łącza RMI, odbiera wynik i zwraca do programu klienta

Page 10: RMI I RMI-IIOP

Warstwa zdalnych referencji

Warstwa ta dostarcza obiekt klasy RemoteRef, który reprezentuje łącze do zdalnej implementacji. Trzon wykorzystuje metodę invoke() do przekazywania wywołań do serwera.

W wersji JDK 1.1 znajduje się tylko jedna metoda zdalnego wywoływania: unicast. Zanim klient wywoła zdalną metodę, zdalna usługa musi zostać utworzona na serwerze i wyeksportowana do mechanizmu RMI.

Page 11: RMI I RMI-IIOP

Warstwa zdalnych referencji

JDK 1.2 dostarcza nowa metodę zdalnego wywoływania: za pomocą aktywowania. RMI samo zajmuje się tworzeniem zdalnych obiektów oraz odtwarzaniem ich stanu z dysku.

Możliwe jest dodawanie nowych rodzajów wywołań, np. skierowanych do wielu redundantnych serwerów usług.

 

Page 12: RMI I RMI-IIOP

Warstwa transportowa

Tworzy połączenia między wirtualnymi maszynami Javy. Wszystkie połączenia są oparte na strumieniach i używają TCP/IP, nawet jeśli obie JVM są uruchomione na tej samej maszynie.

RMI używa protokołu JRMP (Java Remote Method Protocol) opartego na bazie TCP/IP. Jest to strumieniowy protokół występujący w dwóch wersjach. Pierwsza wersja użyta w JDK 1.1 wymaga klas szkieletów na serwerze. Druga wersja pojawiła się wraz z JDK 2, zastała zoptymalizowana oraz nie wymaga klas szkieletów.  

Page 13: RMI I RMI-IIOP

RMI - IIOP

Jest to następna wersja RMI, nad którą wspólnie prowadzą prace Sun oraz IBM. RMI-IIOP zamiast JRMP ma używać IIOP (Internet Inter-ORB Protocol) do komunikacji między klientem a serwerem. IIOP jest fragmentem standardu CORBA. RMI-IIOP ma implementować obecne działanie RMI za wyjątkiem:

Java.rmi.server.RMISocketFactory java.rmi.server.RMISocketFactory UnicastRemoteObject Unreferenced

 

Page 14: RMI I RMI-IIOP

Dostęp do zdalnych obiektów

Klient odnajduje zdalne usługi za pomocą usługi nazywania (naming or directory service). Usługa ta działać musi na znanym hoście oraz porcie. Do jej uruchomienia używany jest program rmiregistry. Domyślnie nasłuchuje on na porcie 1099 na wywołania klientów. Program klienta wykorzystuje statyczną klasę Naming. Dostarcza ona metodę lookup() służącą do odnajdowania zdalnych usług. Do nazywania serwerów używa się nazw podobnych jak przy http:

rmi://<nazwa_hosta>[:<port>]/nazwa_usługi

 

Page 15: RMI I RMI-IIOP

Jak używać RMI

Pierwszym krokiem jest zdefiniowanie interfejsu, który będzie udostępniał serwer. Tylko metody tego interfejsu będą dostępne dla klienta. Jeden serwer może udostępniać kilka interfejsów. Może mieć też metody, nie używane przez te interfejsy. Interfejs nie może zawierać konstruktora. Serwer konstruowany jest nie przez klienta, tylko przez program na zadalnej maszynie. Wszystkie metody muszą deklarować zgłaszanie wyjątku java.rmi.RemoteException (jest on zgłaszany np. przy błędach sieci), a interfejs musi dziedziczyć po java.rmi.Remote.

 

Page 16: RMI I RMI-IIOP

Interface zdalnych obiektów

import java.rmi;

public interface Product extends Remote{

String getDescription() throws RemoteException

}

Page 17: RMI I RMI-IIOP

Implementacja usługi

import java.rmi.*;

import java.rmi.server.*;

public class ProductImpl extends UnicastRemoterObject

implements Produkt{

private String name;

public ProductImpl(String n) throws RemoteException{

name = n;

}

public String getDescription() throws RemoteException{

return „Produkt + „name”;

}

}

Page 18: RMI I RMI-IIOP

Utworzenie serweraimport java.rmi.*;

import java.rmi.server.*;

public class ProductServer{

public static void main(String[] args){

try{

System.out.println(„Konstrułowanie servera”);

ProductImpl p1 = new ProductImpl(„Drukarka HP”);

System.out.println(„Wiazanie servera do rejestru”);

Naming.rebind(„Drukarka”, p1);

System.out.println(„Czekanie na żadania klientów’);

} catch(Exception e){

e.printStackTrace();

}}}

Page 19: RMI I RMI-IIOP

Utworzenie klienta

Klienta programuje się prawie jak zwykłą aplikację w javie. Należy jedynie pobrać referencję do zdalnej usługi przez Naming.lookup() i pamietać o możliwych wyjątkach.

 

Page 20: RMI I RMI-IIOP

Klientimport java.rmi.*;

import java.rmi.server.*;

public class ProductClient{

public static void main(String[] args){

System.setSecuritymanager(new RMISecurityManager());

String url = rmi://localhost/”;

try{

Product c1 = (Product).Naming.lookup(url + „Drukarka”);

System.out.println(c1.getDescription());

}

catch(Exception e){

e.printStackTrace();

}

}}

Page 21: RMI I RMI-IIOP

Uruchomienie

Aby uruchomić całość należy na serwerze uruchomić program rmiregistry:

> Rmiregistry <port> (domyslny port to 1099)

 

następnie serwer:

> java ProductServer

 

Page 22: RMI I RMI-IIOP

CORBA a RMI

RMI jest technologią firmy SUN; CORBA jest technologią konsorcjum OMG,

RMI czyni dostępnymi wywołania RPC(Remote Procedure Call) pomiędzy obiektami Javy; CORBA umożliwia je pomiędzy obiektami zaimplementowanymi w więcej niż jednym języku.

RMI może również być wykorzystane do wywoływanie usług nie zapisanych w Javie. Wtedy potrzebny jest obiekt opakowujący kod nie-Javy po stronie serwera.Obiekt taki łączy się zewnętrznie z klientami Javy poprzez RMI i wewnętrznie z kodem nie-Javy stosując jedną z technik JNI lub J/Direct. Sposób ten wymaga napisania warstwy integrującej, czyli czegoś, co dokładnie robi za nas CORBA, ale wtedy nie jest potrzebny ORB od innego dostawcy,

Usługi obiektowe dostęne tylko dla CORBY.