45
RUGGERO RUSSO 1 Java Remote Method Invocation Java Remote Method Invocation (RMI) (RMI)

Tutorial su Java RMI

Embed Size (px)

DESCRIPTION

Tutorial su Java RMI

Citation preview

Page 1: Tutorial su Java RMI

RUGGERO RUSSO 1

Java Remote Method Invocation Java Remote Method Invocation (RMI) (RMI)

Page 2: Tutorial su Java RMI

RUGGERO RUSSO 2

IntroduzioneIntroduzionePer implementare un sistema distribuito è necessariodisporre di un sistema di comunicazione tra macchinediverse basato su standard e protocolli prestabiliti

� Socket:� consentono di realizzare una connessione remota� non definiscono le modalità di invocazione di

oggetti remoti e i protocolli di comunicazione� Remote Procedure Call – RPC (inizi anni 80)

� Consentono l’esecuzione di codice (procedure) remoto rispetto al chiamante

Page 3: Tutorial su Java RMI

RUGGERO RUSSO 3

RPCRPCIntroducono le nozioni di:

� Client: programma che chiama una proceduraremota

� Server: programma che implementa la chiamata diprocedura remota invocata

� Interface Definition Language IDL: linguaggio didefinizione delle interfacce con cui il server espone i metodi invocabili remotamente. Fornisceuna rappresentazione astratta della procedura in termini di parametri di input/output; può essereconsiderata come la specifica dei servizi offerti dalclient

Page 4: Tutorial su Java RMI

RUGGERO RUSSO 4

VantaggiVantaggiMiglioramento delle prestazioni complessiveMaggiore semplicità nella gestione dellerisorse distribuiteMaggiore scalabilità del sistema complessivo

e.g. è possibile suddividere un processo pesante dalpunto di vista computazionale in sottoprocessi che giranosu macchine diversee.g. l’approccio RPC veniva utilizzato per la gestione deisistemi Legacy, incapsulati all’interno di un wrapper la cui interfaccia consentiva l’invocazione remota di procedure

Page 5: Tutorial su Java RMI

RUGGERO RUSSO 5

SviluppoSviluppo ApplicazioneApplicazione con con RPCRPC

Obiettivo: sviluppo di un’applicazioneutilizzata in remoto da un singolo clientMetodologia:

Definizione della interfaccia IDL dellaprocedura, è la specifica dei servizi offertidal server Compilazione dell’interfaccia che produce:

Il Client StubIl Server Stub

Page 6: Tutorial su Java RMI

RUGGERO RUSSO 6

SviluppoSviluppo ApplicazioneApplicazione con con RPC (2)RPC (2)

Page 7: Tutorial su Java RMI

RUGGERO RUSSO 7

GliGli StubStubClient Stub

Quando un client chiama la procedura remota in realtàfa una chiamata locale ad una procedura dello stubLo stub:

Individua il server Formatta i dati in modo opportuno (operazione diordinamento e serializzazione)Comunica con il serverOttiene una rispostaInoltra la risposta come parametro di ritorno dellaprocedura invocata dal client

Page 8: Tutorial su Java RMI

RUGGERO RUSSO 8

GliGli Stub (2)Stub (2)Server Stub

Come il client stub ma implementa il lato server dell’invocazioneLo stub:

Riceve l’invocazione dal client stub Formatta i dati in modo opportuno (operazione diunmarshalling e deserializzazione)Invoca la reale procedura implementata nel serverInoltra i valori di ritorno dalla procedura al client stub

Page 9: Tutorial su Java RMI

RUGGERO RUSSO 9

SviluppoSviluppo ApplicazioneApplicazione con con RPC (3)RPC (3)

Page 10: Tutorial su Java RMI

RUGGERO RUSSO 10

RPC a RMIRPC a RMI

RPC è una tecnologia interamente orientata allagestione delle procedure

RMI viene introdotta per implementare le stessefunzionalità in contesto di programmazioneobject-oriented

Invocazione remota di metodi NON di procedure

Page 11: Tutorial su Java RMI

11

RMIRMIRMI è la libreria di Java che consente di interagire con oggetti che girano sulla Java Virtual Machine di host remotisulla rete

java.rmijava.rmi.server

Con RMI:è possibile invocare metodi su oggetti che competono a processi remoti come se fossero oggetti localiviceversa è possibile esportare un oggetto come remotoin modo che processi remoti possano avere accessodiretto ad esso senza dover definire un protocollo e un formato di trasmissione delle informazioni

Page 12: Tutorial su Java RMI

RUGGERO RUSSO 12

RMI in RMI in sistemisistemi eterogeneieterogenei

RMI si presta molto bene ad essere usato trasistemi omogenei (full-Java)Per la comunicazione remota tra sistemi eterogenei:

Utilizzare RMI facendo wrapping degli oggetti non-Java (utilizzando la Java Native Interface)Utilizzare un altro schema per gestire oggettidistribuiti language-indipendent e.g., CORBAUtilizzare RMI/IIOP che consente agli oggetti RMI di comunicare direttamente con oggetti remotiCORBA su IIOP (Internet inter-ORB protocol)

Page 13: Tutorial su Java RMI

13

ArchitetturaArchitettura RMIRMIRMI CLIENT RMI SERVER

STUB SKELETON

Remote Reference Layer Remote Reference Layer

Trasport Layer Trasport Layer

Connessione virtuale

Connessione fisica

Page 14: Tutorial su Java RMI

RUGGERO RUSSO 14

ArchitetturaArchitettura RMI (2)RMI (2)E’ organizzata su tre strati:

Stub/skeleton layer: fornisce le interfacce usateda client e server per le loro interazioniRemote reference layer:

Fornisce un oggetto RemoteRef cherappresenta il link all’oggetto remoto cherealizza il servizioinstaura un collegamento virtuale tra i due latiCodifica le richieste del client e le invia al serverDecodifica le richieste e le inoltra allo skeleton

Page 15: Tutorial su Java RMI

RUGGERO RUSSO 15

ArchitetturaArchitettura RMI (3)RMI (3)Transport layer: strato sul quale è realizzato ilcollegamento fisico; si perde la concezione dioggetto remoto/locale. I dati sono sequenze di byte

Collegamento di tipo sequenziale. Per questo sirichiede la serializzazione dei parametri dapassare ai metodiGestisce:

Il protocollo di conversione delle invocazioniremote dei metodiL’impacchettamento dei riferimenti ai vari oggetti

Page 16: Tutorial su Java RMI

RUGGERO RUSSO 16

Stub/SkeletonStub/SkeletonForniscono una duplice rappresentazione dell’oggettoremoto:Lo stub:

rappresenta una simulazione locale sul client dell’oggetto remoto che vive e viene eseguito sul serverLo stub è un proxy per il reale oggetto remoto del serverLo stub fa apparire il metodo come locale Non implementa il metodo ma tutti i meccanismi necessariper consentire al client di interagire con il server, al fine dieseguire il metodo (in modo trasparente)

Page 17: Tutorial su Java RMI

RUGGERO RUSSO 17

Stub/Skeleton (2)Stub/Skeleton (2)

Lo skeleton:Speculare dello stub lato server Implementa il lato server dell’invocazione, contiene il codice per ricevere e gestirel’invocazione dallo stub del client e invocarel’oggetto corretto residente sul server

Page 18: Tutorial su Java RMI

RUGGERO RUSSO 18

Protocollo RMI

Il client riceve un riferimento (reference) dell’oggetto remoto (lo stub dell’oggetto)Inizia l’invocazione di un metodo remotochiamando un metodo su un oggetto stub (esegue i metodi messi a disposizione per l’invocazione remota su un oggetto come se fosse locale)

Page 19: Tutorial su Java RMI

RUGGERO RUSSO 19

Protocollo RMI (2)Realizza la serializzazione e marshalling degliargomenti dei metodi passati al server in mododa produrre dati gestibili dal TL e utilizzabili dallooggetto remotoChiede al RRL di instradare la richiesta (metodoe argomenti) verso l’oggetto remoto invocatoLato server: il remote reference layer riceve la richiesta dal TL e la converte in una richiesta per lo skeleton del server compatibile con l’oggettoriferito

Page 20: Tutorial su Java RMI

RUGGERO RUSSO 20

Protocollo RMI (3)Lo skeleton converte la richiesta remota nellaappropriata chiamata ad un metodo sul oggettoreale residente sul server (la conversioneconsiste nell’unmarshalling degli argomentidella chiamata in un formato adatto allecaratteristiche dell’oggetto che gira sul serverse l’esecuzione del metodo richiede la comunicazione indietro con il client, lo skeleton si occupa di serializzare i dati di ritorno e direinviarli

Page 21: Tutorial su Java RMI

RUGGERO RUSSO 21

Servizi RMIRMI fornisce alcuni servizi base per la gestione delle applicazioni distribuite

Naming/Registry serviceRemote Object Activation serviceDistributed Garbage collection

Page 22: Tutorial su Java RMI

22

Naming Registry ServiceQuando un processo server-side esporta un serviziobasato su RMI deve registrare uno o più oggetti RMI con il suo Registry locale (rappresentato da una interfaccia specifica: la Registry Interface)Ciascun oggetto è registrato con il suo nome logico cheun client può utilizzare come riferimentoLa gestione della coppia oggetto remoto/ nome logico ègestita tramite un’interfaccia specifica: la Naming interface

e.g.: un client può ottenere un riferimento stub all’oggetto remoto invocando l’oggetto per nomeattraverso di essa

Page 23: Tutorial su Java RMI

23

Naming Registry Service(2)

Il metodo Naming.lookup() prende il nome dell’oggettoremoto e lo localizza nella reteQuando il metodo lookup() individua l’host dell’oggettodesiderato, consulta il registry RMI dell’host, richiedel’oggetto per nome.Se il registry trova l’oggetto, genera un riferimento remotoall’oggetto e lo fornisce al processo clientIl riferimento viene convertito dal processo client in un riferimento stub che è restituito al chiamanteUna volta ricevuto il riferimento il client può iniziare la conversazione con il server

Page 24: Tutorial su Java RMI

24

Remote Object Activation Service

Il servizio di attivazione di un oggetto remoto:Fornisce un modo per consentire l’attivazione di un oggetto sul server sulla base delle necessità del client chelo invocaUn server object è registrato con un RMI registry service all’interno di una JVM attiva ed è disponibile per il tempo in cui la JVM è in vita, se si ferma non si ha più modo diinvocare l’oggetto remoto, i riferimenti diventanoinutilizzabiliCrea il server object dinamicamente all’interno di un virtual machine esistente o nuovaOttiene un nuovo riferimento all’oggetto creato che verràpassato al client che ne ha richiesto l’attivazione

Page 25: Tutorial su Java RMI

25

Distributed Garbage Collection

Meccanismo di garbage collection specifica per RMIRealizza la ripulitura delle aree di memoria non piùutilizzatePer ogni oggetto remoto RMI, il server reference layer mantiene la lista di riferimenti remotiregistrati dai client, ottenuti esplicitamente tramitelookup() o implicitamente a seguito di unainvocazione di metodo remoto

Page 26: Tutorial su Java RMI

26

Distributed Garbage Collection(2)

Quando la VM del client si accorge che l’oggettoremoto non è più referenziato localmente, inviauna notifica al server RMIIl server aggiorna la lista dei riferimentiQuando un oggetto non è più referenziato daalcun client ne’ da oggetti locali, viene eliminatoattraverso un’operazione di garbage collection

Page 27: Tutorial su Java RMI

27

Distributed Garbage Collection (3)

Inoltre DGC prevede l’uso di un timeout per l’invocazione di un riferimento remotoQuando il timeout scade il riferimento vieneeliminato dalla lista e viene data notifica ai client che avevano quel riferimentoSe il client è ancora attivo richiederà al server dimantenere attivo nella lista il riferimento remoto

Il meccanismo evita di occupare memoria con riferimenti inutilizzati da client non più esistenti

Page 28: Tutorial su Java RMI

RUGGERO RUSSO 28

Uso di RMIPasso1: definire e creare oggetti remoti:

oggetto remoto:implementa l’interfaccia Remote e ha metodiche sono eseguibili da un applicazione client non residente sulla stessa macchina virtualeinterfaccia remota:rende disponibili dei metodi utilizzabili per l’invocazione a distanza

Page 29: Tutorial su Java RMI

RUGGERO RUSSO 29

Uso di RMI (2)ESEMPIO:

definizione dell’oggetto non remoto MyServerpublic class MyServer {

public void String concat(String a, String b) {

return a+b;}

}

Trasformazione dell’oggetto nella sua versione remota: definizione della interfaccia remota corrispondente

public inteface MyServerInterfaceextends Remote {

public String concat(String a, String b) throws RemoteException;

}Per creare una interfaccia remota ènecessario estendere java.rmi.Remote

Page 30: Tutorial su Java RMI

RUGGERO RUSSO 30

Uso di RMI (3)Passo 2: Definita l’interfaccia remota si modifica la classe dipartenza in modo che implementi l’interfaccia stessa

public class MyServerImpl Implements MyServerInterfaceextends UnicastRemoteObject {

public MyServerImpl() throws RemoteException {…

}public String concat(String a, String b)throws RemoteException {

return a+b;}

}

Page 31: Tutorial su Java RMI

RUGGERO RUSSO 31

Uso di RMI (3)Definita l’interfaccia remota si modifica la classe di partenza in modo cheimplementi l’interfaccia stessa

public class MyServerImpl Implements MyServerInterfaceextends UnicastRemoteObject {

public MyServerImpl() throws RemoteException {…

}public String concat(String a, String b)throws RemoteException {

return a+b;}

}

Nota: il nome della classe è stato modificato in modo che implementi l’interfaccia

Si deve estendere la classe UnicastRemoteObjectClasse che deriva da RemoteObject (superclasse comune per tutte le implementazioni di oggetti remoti) e RomoteServerridefinisce equals() per consentire il confronto con oggetti remoti

A questo punto l’oggetto è visibile all’esterno ma non ancora utilizzabile da RMI: si creano gli stub e gli skeleton

Page 32: Tutorial su Java RMI

RUGGERO RUSSO 32

Uso di RMI (4)Passo 3: Per rendere utilizzabile l’oggetto creato con RMI ènecessario compilare opportunamente l’interfaccia per la creazione di STUB e SKELETONNella JDK esiste un compilatore apposito: rmicCon un’operazione del tipo:

rmic MyserverImpl

Si ottengono i due file: MyServerImpl_stub.class

MyServerImpl_skel.class

Page 33: Tutorial su Java RMI

RUGGERO RUSSO 33

Uso di RMI (5)

Passo 4: e’ necessario abilitare il collegamento traclient e server per l’invocazione remotaFunzione realizzata da Server RMI che èl’applicazione di servizio necessaria per avviare ilmeccanismo di attivazione remota che instanzia un oggetto remoto e lo registra tramite un bind all’interno del RMI registry

Page 34: Tutorial su Java RMI

34

Registry and Naming Services

Passo 5: sul lato server lo skeleton notifica di possedere un oggetto abilitato all’invocazione remota tramite il metodojava.rmi.Naming.bind()che associa all’istanzadell’oggetto remoto un nome logico che identifica l’oggetto in rete

MyServerImpl server = new MyServerImpl

Naming.bind (“pluto”, server)

Si crea un’istanza dell’oggetto remoto

effettua la registrazione con un

nome simbolico

Page 35: Tutorial su Java RMI

RUGGERO RUSSO 35

Registry and Naming Services

Passo 6: ogni associazione nome logico – oggettoremoto e’ memorizzato nel RMI registry gestito con l’istruzione rmiregistry.

start rmiregistry

Il registry creato si mette in ascolto di processi localiche vogliano registrare nuovi oggetti, o di client chesi connettono per fare il lookup di oggetti RMIPasso 7: quando viene registrato l’oggetto, il client è in grado di ottenere un reference all’oggetto con una ricerca utilizzando il nome logico

Page 36: Tutorial su Java RMI

RUGGERO RUSSO 36

Esempio: MyServerInterface server;

String url =“//” + serverhost + “/MyServer”;

server = (MyServerInterface)Naming.lookup(url);

Lookup identifica il nome della macchina che ospita l’oggetto

remoto e il nome con cui l’oggetto è

registrato

Il metodo list() restituisce la lista di tutti gli oggetti referenziati con il registrylocale

Registry and Naming Services (2)

Page 37: Tutorial su Java RMI

RUGGERO RUSSO 37

Le operazioni di ricerca e registrazione accettano come parametro un URL il cui formato è:

rmi://host:port/namehost: è il nome del server RMIport: è la porta su cui sta in ascolto il registry(default 1099)name: il nome logico

Registry and Naming Services (3)

Page 38: Tutorial su Java RMI

38

Gli argomenti vengono passati ai metodi remoti attraverso un processo di serializzazione e deserializzazioneIn realtà l’oggetto serializzato non viene fisicamente spostato dal client al serverVengono inviate nella rete le info per ricreare una copia dell’oggettoClient e server devono disporre dello stesso bytecoderiferito all’oggetto per poterne ricreare l’istanzaSi ovvia al problema copiando fisicamente i vari file .class sia sul client che sul serverSoluzione scomoda: RMI mette a disposizione un meccanismo di scaricamento dalla rete dei file necessari al client tramite un server HTTP

Argomenti dei metodi remotie valori di ritorno

Page 39: Tutorial su Java RMI

39

ESEMPIESEMPI

Page 40: Tutorial su Java RMI

40

HelloServer Interface

Esempio HelloWorld

import java.rmi.Remote; import java.rmi.RemoteException;

public interface HelloServer extends remote {

String sayHello() throws remoteException; }

Page 41: Tutorial su Java RMI

41

HelloServer Implementation

Esempio HelloWorld

import java.rmi.*;import java.rmi.server.*;

public class HelloServerImpl extends UnicastRemoteObject

implements HelloServer{

public HelloServerImpl() throws RemoteException {

super();}

public String sayHello() throws RemoteException {return "Hello World!";

}}

Page 42: Tutorial su Java RMI

42

HelloReg – crea il registry

Esempio HelloWorld

import java.rmi.*;import java.rmi.server.*;

public class HelloReg{

public static void main(String args[]) { try {

HelloServerImpl obj = new HelloServerImpl();

Naming.rebind("helloRusso", obj); System.out.println("HelloServer bound in the RMI Registry");

} catch (Exception e) { System.out.println("HelloImpl err: " + e.getMessage()); e.printStackTrace();}

}}

Page 43: Tutorial su Java RMI

43

HelloClient implementazione lato client

Esempio HelloWorld

import java.rmi.Naming; import java.rmi.RemoteException;

public class HelloClient{ public static void main(String[] arg){

try {

System.out.println("Getting the remote object reference......");HelloServer obj = (HelloServer) Naming.lookup("rmi://" +arg[0]+

"/helloRusso");System.out.println("Invoking remote method"); String message = obj.sayHello();

System.out.println("Result: "+message);} catch (Exception e){

System.out.println("HelloClient exception: " + e.getMessage()); e.printStackTrace();

} }

}

Page 44: Tutorial su Java RMI

44

Passo 1: mando in esecuzione il registryC:\...\jdk1.5.0_06\bin> start rmiregistryPasso2: compilo le classi javaC:\...\corsoPSII\rmi\E3\RMIExample\Server> javac *.javaPasso 3: compiliamo l’implementazione dell’interfaccia C:\...\corsoPSII\rmi\E3\RMIExample\Server> rmic HelloServerImpl

L’operazione produce lo stub e lo skeleton

Esempio HelloWorld

Page 45: Tutorial su Java RMI

45

Passo 4: Compiliamo le classi java del clientC:\...\corsoPSII\rmi\E3\RMIExample\Client> javac *.javaPasso 5: Registriamo il Remote Server ObjectC:\...\ corsoPSII\rmi\E3\RMIExample\Server> java HelloRegPasso 6: Copio HelloServerImpl_stub.class nella cartella ClientPasso 7: Eseguiamo il ClientC:\...\ corsoPSII\rmi\E3\RMIExample\Client> java HelloClient 10.0.1.57

Esempio HelloWorld

NOTA: è necessario inserire le directory di lavoro \Client e \Server nel classpath!!!