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