Sistemi Distribuiti - Dipartimento di Ingegneria Industriale e dell

09/10/2014
Sistemi Distribuiti
Modelli di interazione e di
comunicazione
i i
interprocesso:
i t
Remote Object Invocation
1
Remote Object Invocation
macchina server
macchina client
Oggetto
server
client
Stato
stessa interfaccia
dell’oggetto
Metodi
Il client invoca
un metodo
Interfaccia
proxy
Client OS
skeleton
Lo skeleton invoca
lo stesso metodo
nell’oggetto
Server OS
marshalled
parameters
• Estensione del concetto di RPC all’invocazione di
oggetti remoti
2
1
09/10/2014
Oggetti distribuiti
• Un oggetto incapsula dati (lo stato
stato)
e definisce operazioni sullo stato
(metodi
metodi)
• I metodi
di sono accessibili
ibili attraverso
un’interfaccia
interfaccia
• Un oggetto distribuito ha
l’interfaccia su una macchina e
l’implementazione su un’altra
Oggetto
Stato
Metodi
Interfaccia
oggetto remoto
– Un oggetto
gg
pproxyy locale al client che
implementa l’interfaccia e si occupa
dell’invio/ricezione e del
marshaling/unmarshaling dei
parametri e del risultato
– Un oggetto skeleton remoto si occupa
della comunicazione locale con
l’oggetto server
3
Binding
• Un oggetto remoto è individuato da un riferimento
valido in tutto il sistema
– Per
e chiamare
c
e metodi
e od dell’oggetto
de ogge o remoto
e o o si
s deve
realizzare il collegamento (binding)
– Il binding è effettuato per mezzo dell’oggetto
oggetto proxy che
implementa la stessa interfaccia dell’oggetto remoto
• Va creato il proxy nello spazio di indirizzi locale
• Va trovato il server che gestisce l’oggetto remoto
– Il binding può avvenire in modo implicito o esplicito
Distr_object *obj_ref;
Distr_object *obj_ref;
obj_ref = <inizializza il riferimento>;
obj_ref->remote_method();
Local_object *obj_ptr;
obj_ref = <inizializza il riferimento>;
obj_ptr = bind(obj_ref);
obj_ptr->remote_method();
binding implicito
binding esplicito
4
2
09/10/2014
Riferimenti agli oggetti
• Il riferimento deve contenere l’informazione
necessaria a identificare l’oggetto sulla rete
– Indirizzo di rete della macchina su cui risiede
– Endpoint (porta) del server che gestisce l’oggetto
– Identificatore dell’oggetto
• Problemi
– Se il server di gestione degli oggetti remoti viene riavviato,
gli endpoint possono variare e i riferimenti divengono non
validi
• Può essere risolto con un approccio tipo “portmap” con endpoint
noti
– Se il riferimento contiene l’indirizzo di rete, non è possibile
trasferire il server su un’altra macchina in modo trasparente
• Si può introdurre un location server che tiene traccia della
macchina su cui si trova il server
5
Static and Dynamic ROI
• Invocazione statica
– Le interfacce degli oggetti sono note quando il client
viene sviluppato
– Se l’interfaccia cambia il client deve essere ricompilato
• Invocazione dinamica
– Si compone la chiamata di metodo durante l’esecuzione
– La chiamata avviene con un metodo del tipo
invoke(object,method,in_parameters,ou
t_parameters)
• method è un riferimento al metodo ottenuto ad
esempio a partire dal suo nome (es. RunTime Type
Identification - RTTI - in Java)
6
3
09/10/2014
Passaggio dei parametri
• Si possono verificare due casi
– se il parametro è il riferimento ad un oggetto,
oggetto si
può usarne il valore in modo consistente
(passaggio
passaggio per riferimento)
riferimento
– se il parametro è un riferimento ad un oggetto
locale (o un tipo primitivo) allora deve essere
copiato per intero nello spazio di memoria
dell’oggetto invocato (passaggio
passaggio per valore)
valore
7
RMI di Java
• Remote Method Invocation
– L’implementazione è mascherata
– Il riferimento all
all’oggetto
oggetto remoto avviene attraverso
un’interfaccia remota che verifica le seguenti proprietà
• è public
• estende l’interfaccia java.rmi.Remote
• ogni metodo deve dichiarare
java.rmi.RemoteException nella sua clausola throws
• gli oggetti remoti passati come argomenti o come valori di
ritorno devono essere dichiarati come interfaccia remota e non
come la loro classe di imlementazione
import java.rmi.*;
public interface RMIInterf extends Remote {
int getValue() throws RemoteException;
}
8
4
09/10/2014
Implementazione dell’interfaccia remota
• Il server contiene una classe che
– estende UnicastRemoteObject
– implementa ll’interfaccia
interfaccia remota
– ha il costruttore implementato che genera
RemoteException
• Solo i metodi nell’interfaccia remota sono
disponibili per il client
import
p
j
java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
public class RMIClass extends UnicastRemoteObject
implements RMIInterf {
public RMIClass() throws RemoteException { super();};
public int getValue() throws RemoteException { return 2;};
}
9
Impostazione del server
• Creazione ed installazione di un gestore della
sicurezza che supporti RMI
– L’unico disponibile nella distribuzione è
RMISecurityManager
System.setSecurityManager(new
RMISecurityManager());
• Creazione di uno o più istanze dell’oggetto remoto
RMIClass rmicls = new RMIClass();
• Registrazione di almeno uno degli oggetti remoti sul
registro degli oggetti remoti RMI
nome del servizio
Naming.bind(“//host:port/RMIClass”,rmicls)
10
5
09/10/2014
Il registro RMI
• Il daemon di gestione del registro RMI è il comando
rmiregistry
– La porta di default su cui si mette in ascolto è la 1099
• Nel metodo static
Naming.bind(“//host:port/Nomeservizio”,obj)
– host e port individuano il servizio rmiregistry
– se il server di registry è sullo stesso host si può non
specificare l’host
– Il nome del servizio è arbitrario e non dipende dal nome
della classe; deve comunque essere univoco
• se il nome è già nel registro si ottiene una
AlreadyBoundException
• Un oggetto registrato resta in vita nel registro
– per eliminarlo occorre riavviare il registro o chiamare
Naming.unbind()
11
Stub e skeleton
• Oltre alla classe server occorre generare gli stub e
gli skeleton
– Gli stub e gli skeleton svolgono le operazioni di
marshalling e unmarshalling dei parametri
• Per generare stub e skeleton si usa il comando rmic
sul codice compilato (.class)
– rmic usa il classpath per trovare l’interfacce di
interesse
– vengono generate le due classi *_Stub.class e *_Skel.class
• È necessario
i garantire
ti che
h i file
fil generati
ti siano:
i
– disponibili sia al processo client che a quello server
– oppure siano accessibili all’ambiente di brokering che
provvederà a trasferirli (via http) ai processi che ne
abbiano necessità
12
6
09/10/2014
Passaggio dei parametri
Client
invocazione
metodo
e invio
parametri
Stub
rete
parametri
originali
Skeleton
Server
serializzazione dei
parametri (marshalling)
marshalling
trasmissione dati serializzati
invio dati
in rete
unmarshalling
decodifica dei parametri
(unmarshalling)
ricezione dei
parametri ed
inizio
elaborazione
copia dei parametri
originali
13
Ritorno dei risultati
Client
elaborazione
dei pparametri
e calcolo del
risultato
Stub
rete
serializzazione del
risultato (marshalling)
Skeleton
Server
risultato
originale
i i l
marshalling
invio dati
in rete
trasmissione dati serializzati
unmarshalling
ritorno del
risultato della
elaborazione
decodifica del risultato
(unmarshalling)
copia del
risultato originale
14
7
09/10/2014
Marshalling (1/3)
• processo che trasforma un oggetto in
memoria in una espressione serializzabile
• si applica agli oggetti che vengono passati
al metodo dell’oggetto remoto come
parametro, ed al valore che il metodo
ritorna
• nel caso del passaggio di parametri il
marshalling avviene nello Stub, nel ritorno
dei risultati avviene nello Skeleton
15
Marshalling (2/3)
• è necessario interagire su oggetti
serializzabili, quindi non legati ad una
rappresentazione
i
propria
i del
d l sistema
i
operativo.
• è quindi necessario che gli oggetti parametro
e l’oggetto risultato implementino
l’interfaccia java.io.Serializable
• Non tutte le classi sono serializzabili
– Ad es. la classe Java.awt.Image non è
serializzabile, perché rimanda alla descrizione delle
immagini propria dei singoli sistemi operativi
16
8
09/10/2014
Marshalling (3/3)
• i tipi semplici e gli oggetti meno complessi
vengono
g
serializzati direttamente
• gli oggetti complessi richiedono invece un
procedimento diverso
– si serializzano ricorsivamente i membri dell’oggetto
– si serializza l’oggetto
• si crea così una copia
p dell’oggetto
gg
pparametro su
cui lavorerà il server remoto
17
Passaggio parametri by value
• è la modalità comune.
• viene passata all’oggetto server una copia
speculare dell’oggetto presente nel client.
• se la copia nel server viene modificata da una
interazione indiretta, la copia sul client non ne
rispecchierà le modifiche.
possibile che le due copie
p pperdano la
• diventa p
congruenza reciproca.
• ciononostante è un approccio valido nella
stragrande maggioranza dei casi.
18
9
09/10/2014
Passaggio parametri by remote reference
• a volte sarebbe comodo mantenere sempre la
coerenza tra le copie dei parametri del server e del
client.
• occorre però un meccanismo che aggiorni
automaticamente gli oggetti del client quando le
rispettive copie presenti nel server subiscono una
modifica
modifica.
• occorre allora che la copia presente nel server
notifichi alla rispettiva copia nel client ogni
variazione, cioè un meccanismo RMI con client e
server invertiti.
19
Passaggio parametri by remote reference
• Per ottenere un passaggio valori by remote
reference occorre dichiarare come parametro
reference,
formale un’interfaccia che deriva da
java.rmi.Remote
• Quando il meccanismo di marshalling
riconosce un oggetto che implementa
l’interfaccia java.rmi.Remote, invece che
inviare una copia dell’oggetto in questione ne
invia uno Stub
20
10
09/10/2014
Riepilogo lato server
• Attivazione del servizio di registry sull’host
che ospita il server
• Scrittura dell’interfaccia applicativa
• Scrittura del server che:
– Deriva dalla classe
java.rmi.server.UnicastRemoteObject
– Implementa l’interfaccia applicativa
• Creazione automatica stub e skeleton
• Bootstrap del server:
– Creazione di un’istanza
– Registrazione presso il registry dell’istanza
– Attivazione dello skeleton (automatica) e attesa
di chiamate
21
RMI client
• Nel client è sufficiente ottenere l’handle
all’interfaccia remota e poi usarlo come se fosse
locale
– Si chiede il riferimento al servizio di Naming
– Si deve fare il cast all’interfaccia remota dell’handle
ottenuto dal lookup sul registro RMI
– La chiamata ai metodi può generare l’eccezione
RemoteException
System.setSecurityManager(new
y
y
g (
RMISecurityManager());
y
g ());
RMIInterf rmiobj =(RMIInterf)Naming.lookup(“\\host:port\Nomeservizio”);
int i = rmiobj.getValue();
uso dell’oggetto remoto
interrogazione al registro
RMI per ottenere l’handle
all’oggetto remoto
22
11