qui - Dipartimento di Ingegneria Informatica e delle Telecomunicazioni

Comunicazione distribuita
Java Remote Method
Invocation
Java VM2
Programmazione in Rete e Laboratorio
Java VM1
Port 2
Port1
Matteo Baldoni
Dipartimento di Informatica
Universita` degli Studi di Torino
C.so Svizzera, 185 I-10149 Torino
Invocazione di metodi
sull’oggetto remoto
[email protected]
http://www.di.unito.it/~baldoni/didattica
2
RMI: goal
■
■
■
■
■
Architettura RMI
Rendere trasparente l’invocazione remota di metodi su
oggetti Java che risiedono su diverse Virtual machines
(evoluzione di Remote Procedure Call, RPC)
offrire un modello distribuito che preservi maggiormente la
semantica degli oggetti Java
rendere il piu’ semplice possibile la scrittura di applicazioni
distribuite
RMI è un ORB (Object Request Broker) ma non un CORBA
(Common Object Request Broker Architecture) come
stabilito dall’OMG (Object Management Group)
analogo a DCOM della Microsoft
3
Architettura RMI
■
■
◆
Livello di riferimento
remoto
Livello di Trasporto
Applicazione Server
Livello stub
Ogni livello
è indipenLivello di riferimento
dente
dall’altro!
remoto
Rete
Livello di Trasporto
Si occupa della effettiva connessione,
della identificazione degli oggetti remoti,
del mezzo, TCP/IP, UDP (nota: RMI usa
per ora solo TCP/IP)
Skeleton per le versioni
precedenti a Java 1.2
4
Simile all’invocazione di metodi locali
■ i parametri dei metodi possono essere oggetti
■ il polimorfismo e` supportato: oggetti diversi possono
rispondere a stessi messaggi
ma
■ i client interagiscono con interfacce di oggetti (stub) non
con la loro implementazione (che sta nella VM remota)
■ parametri passati per copia, non per referenza (passaggio
per referenza solo dentro a una VM)
Ogni livello ha le sue interfacce di comunicazione con
relativi protocolli
◆
Livello stub
Si occupa di preparare (marshalling) la
remote call e gli oggetti per la trasmissione
RMI
Il sistema RMI e` costituito da tre livelli per supportare
flessibilità nella comunicazione
◆
Supporta vari
protocolli di
invocazione:
unicast,
multicast
Applicazione Client
stub (e skeleton) layer: canale di comunicazione tra clients e
server
remote reference layer: supporto di diversi protocolli di
invocazione tipo Unicast e Multicast
transport layer: supporta la comunicazione a basso livello,
tipo TCP/IP
■
5
Distributed Garbage Collector (DGC)
6
1
RMI in pratica
RMI in pratica: Interfaccia
L’oggetto blu sulla JVM Client desidera inviare un messaggio
all’oggetto rosso sulla JVM Server, gli oggetti giallo e azzurro fanno
parte dei parametri del messaggio
L’oggetto rosso sulla JVM Server terminata l’esecuzione restituisce
l’oggetto verde come valore di ritorno oppure solleva un’eccezione
■
■
JVM
Client
Il client deve disporre di un’interfaccia che descriva l’oggetto remoto
È necessario che l’interfaccia estenda java.rmi.Remote
Ogni metodo descritto puo` lanciare un’eccezione di tipo
java.rmi.RemoteException
■
■
■
JVM
Server
messaggio
public interface Distributor extends java.rmi.Remote {
valore di
ritorno o
eccezione
IP Address
Job getNewJob() throws java.rmi.RemoteException;
Job getNewJob(Message msg) throws java.rmi.RemoteException;
IP Address
}
7
RMI in pratica: rmiregistry,
bind (rebind)
RMI in pratica: Implementazione
■
Il Server implementa la classe che esegue praticamente i metodi che
sono descritti nell’interfaccia remota
Questa classe è necessario che estenda la classe
java.rmi.server.UnicastRemoteObject (attualemente l’unica disponibile,
multicast in una futura versione) che rende accessibile le sue istanze
remotamente (puo` creare uno stub per la classe)
■
■
■
Client
9
RMI in pratica: rmiregistry,
bind (rebind)
<IP, port, name>
<IP, port, name>
registry
Naming.rebind
Si registra
l’oggetto
rosso
presso il
servizio di
pagine
gialle
JVM
Lo stub è
necessario
durante il
bind
Server
stub
Non è necessario
registrare
Reference Layer:
l’oggetto
apertura di un
verde
server socket
IP Address
}
■
Gli oggetti remoti sono individuati
tramite un IP, un numero di porta e un
nome (una stringa)
server registry: processo “pagine
gialle”
JVM
public class DistributorImpl
extends java.rmi.server.UnicastRemoteObject
implements Distributor {
[..]
public Job getNewJob() throws java.rmi.RemoteException {
[…]
}
[…]
■
8
IP Address
10
RMI in pratica: rmiregistry,
lookup
■
La classe Naming appartiene al package java.rmi
rmiregistry puo` anche essere attivato indipendentemente dal server
tramite il comando “rmiregistry 2000”
■
public DistributorImpl() throws RemoteException {
porta
[…]
try {
java.rmi.registry.LocateRegistry.createRegistry(2000);
Naming.rebind("rmi://130.192.239.145:2000/distributor",this);
}
catch (Exception e) {
System.err.println("Failed to bind to RMI Registry");
System.exit(1);
oggetto
}
IP address
nome
remoto
}
11
Il client ottiene uno stub (surrogato
dell’oggetto rosso presso il client)
tramite il server registry
Deve conoscerne IP, porta e nome
<IP, port, name>
<IP, port, name>
registry
Naming.lookup
JVM
JVM
Server
Client
stub
IP Address
stub
IP Address
12
2
RMI in pratica: rmiregistry,
lookup
RMI in pratica: stub client
■
■
■
L’oggetto remoto è contattato tramite il server registry
È necessario conoscerne l’indirizzo IP, il numero della porta e il nome
con cui è registrato
public class Client {
Distributor server;
[…]
public Client() {
■
messaggio
JVM
14
RMI in pratica: connessione
public class Client {
[..]
public void process() {
try {
Job myJob = server.getNewJob(new Message("Richiesta Job!"));
myJob.process();
}
catch (Exception e) {
System.out.println("Failed to receive job " + e.getMessage());
}
}
[..]
}
■
RMI in pratica: stub server
Client
stub
IP Address
Attenzione
non
vi è nessun
riferimento
agli oggetti
giallo e
azzurro
sul client
passati
come parametro:
sono copie!
Il livello di trasporto è responsabile per una
connessione, nel server ascolta le richieste in
arrivo
mantiene la tabella degli oggetti remoti nel
particolare address space
Scambia le informazioni con il reference
layer
JVM
<IP, port, name>
registry
JVM
Server
Client
stub
IP Address
stub
Il livello di trasporto
apre un socket per la
connessione
Anche HTTP se c’è
un firewall
15
JVM
IP Address
13
■
■
stub
L’oggetto giallo e
azzurro vengono
serializzati e organizzati per
la spedizione (marshalling)
IP Address
L’oggetto remoto è ora utilizzabile come un qualsiasi oggetto locale
lo stub ne è un surrogato
Lo stub server riorganizza i parametri
(unmarshalling)
individua l’oggetto da chiamare attivando il
metodo desiderato (informazione contenuta
nel pacchetto ricevuto)
JVM
Server
stub
■
■
<IP, port, name>
Client
RMI in pratica: invio messaggio
■
Garbage collector:
mantiene un riferimento
all’oggetto rosso: non
puo` essere eliminato
registry
Tipo definito dall’interfaccia!
try {
server = (Distributor)Naming.lookup(
"rmi://130.192.239.145:2000/distributor”);
}
catch(Exception e) {
System.out.println("Failed to find distributor" +
e.getMessage());
}
}
■
L’oggetto blu invia un messaggio al surrogato
oggetto rosso presso lo stub client
Lo stub client inizializza la chiamata remota
ed organizza i parametri da inviare
TCP/IP
IP Address
Connessione temporanea!
16
RMI in pratica: la risposta
■
<IP, port, name>
■
registry
Lo stub del server cattura e riorganizza il
valore restituito dall’evecuzione del metodo
sull’oggetto rosso
Lo stub server invia allo stub del client un
pacchetto contenente le informazioni raccolte
(l’oggetto verde)
JVM
JVM
Server
IP Address
TCP/IP
registry
JVM
Invia valore
di ritorno o
eccezione
Server
Client
stub
stub
<IP, port, name>
stub
IP Address
IP Address
TCP/IP
17
18
3
RMI in pratica: la risposta
■
RMI in pratica: ricezione
Il server esegue il metodo invocato ed invia il valore di ritorno come se
la chiamata fosse locale
■
■
public DistributorImpl() throws RemoteException {
[…]
public Job getNewJob(Message msg) {
System.out.println(msg);
if( count < jobs.size()) {
return (Job)jobs.elementAt(count++);
}
else {
System.exit(0);
}
return null;
}
[…]
}
<IP, port, name>
registry
JVM
JVM
Server
Client
stub
stub
IP Address
IP Address
TCP/IP
19
RMI in pratica: ricezione
■
Lo stub client riorganizza le informazioni
ricevute o l’eccezione sollevata
La connessione viene quindi disattivata
20
RMI: riassunto
Il valore di ritorno è utilizzato come se fosse ora un oggetto locale ma
non ha nessun riferimento con quello creato sul server (come per i
parametri inviati con la chiamata)
■
Nell’esempio che vedremo:
◆
◆
◆
public class Client {
[..]
public void process() {
try {
Job myJob = server.getNewJob(new Message("Richiesta Job!"));
myJob.process();
}
catch (Exception e) {
System.out.println("Failed to receive job " + e.getMessage());
}
}
[..]
}
◆
◆
javac *.java
rmic -v1.2 DistributorImpl
rmiregistry 2000 &
java DistributorImpl
java Client
Crea il file:
DistributorImpl_Stub.class
Senza l’opzione viene
creato anche il file
DistributorImpl_Skel.class
compatibile sia con
Java 1.1 e 1.2
Attiva il server
registry
Attiva il server
Esegue il client
Dopo in bind è attivo
un thread separato per
gestire le richieste di
connessione, termina con CTRL-C
21
RMI: download dello stub
■
■
java.rmi.server.codebase property
■
<IP, port, name>
Lo stub generato dal server deve
essere disponibile al client ma
questo, in genere, è remoto…
Puo` essere scaricato tramite HTTP
22
■
<IP, port, name>
registry
Web Server
■
La proprieta` codebase indica dove
cercare una classe remotamente
È l’analogo del CLASSPATH
Protocolli: file, ftp, o http
download
HTTP
JVM
JVM
JVM
Server
Client
stub
file di criteri
IP Address
Security Manager
<IP, port, name>
<IP, port, name>
registry
Server
Client
stub
Web Server
L’informazione del
codebase è memorizzata Naming.rebind
nel registry
JVM
stub
IP Address
TCP/IP
23
IP Address
Il server viene avviato specificando
IP Address
la proprieta` codebase
java -Djava.rmi.server.codebase=http://Host/dirctory/
24
4
RMI: security manager
■
■
RMI: security manager
RMISecurityManager con l’associato file di criteri permette di scaricare
mediante il protocollo HTTP
È necessario un file di criteri
public class Client {
Distributor server;
[…]
public Client() {
try {
System.setSecurityManager(new RMISecurityManager());
server = (Distributor)Naming.lookup(
"rmi://130.192.239.145:2000/distributor”);
}
catch(Exception e) {
System.out.println("Failed to find distributor" +
e.getMessage());
}
}
■
■
Per utilizzare il file di criteri nel client:
◆ java -Djava.security.policy=client.policy
Per indicare da dove scaricare il file stub dal server:
◆ java Djava.rmi.server.codebase=http://baldo.di.unito.it/~baldoni/dowload/
rmi1/ DistributorImpl
grant
file client.policy
{
permission java.net.SocketPermission "130.192.239.145:1024-65535",
"connect";
permission java.net.SocketPermission "130.192.239.1:80",
"connect";
};
25
RMI: polimorfismo
■
■
26
RMI: polimorfismo
L’oggetto inviati tramite RMI preservano
il loro vero tipo
<IP, port, name>
Ma se il valore restituito è piu`
specializzato di quello atteso dal client
Web Server
che succede?
registry
Download delle classi per trattare
download
l’oggetto specializzato!
HTTP
■
E se l’oggetto inviato è piu` specializzato di quello atteso
dal server?
<IP, port, name>
■
JVM
■
JVM
Server
Client
■
■
stub
stub
file di criteri
■
Security Manager
IP Address
Download delle classi via HTTP durante l’esecuzione del
metodo sull’oggetto remoto (sul server)
IL server necessita a sua volta di un Security Manager per
il controllo delle classi scaricate
È nececessario un file di criteri per il download anche per il
server
Il client deve specificare dove scaricare le classi
IP Address
TCP/IP
27
RMI: polimorfismo
28
Bibliografia
<IP, port, name>
Web Server
■
<IP, port, name>
registry
HTTP
Web Server
download
download
HTTP
JVM
JVM
■
Server
Client
stub
file di criteri
IP Address
C. S. Horstmann, G. Cornell. Java 2 Tecniche Avanzate,
McGrawHill, 2000. ISBN 88-386-4071-8. Capitolo 5.
M. Risso. Java 2 Programmazione distribuita. Apogeo,
1999. ISBN 88-7303-608-2.
stub
file di criteri
Security Manager
IP Address
TCP/IP
29
30
5