Lezione 6: Remote Method Invocation

1,377 views
1,305 views

Published on

✦ Middleware
✦ Remote Method Invocation
✦ Definizione e uso di oggetti remoti

Published in: Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,377
On SlideShare
0
From Embeds
0
Number of Embeds
39
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Lezione 6: Remote Method Invocation

  1. 1. Lezione 6: Remote Method Invocation Corso di Programmazione in Rete Laurea Magistrale in Ing. Informatica Università degli Studi di Salerno 1
  2. 2. Outline ✦ Middleware ✦ Remote Method Invocation ✦ Definizione e uso di oggetti remoti 2
  3. 3. Modelli distribuiti ✦ Molte applicazioni di rete possono essere realizzate usando un paradigma Client- Server • il client invia la richiesta di un’operazione a un server • il server elabora la richiesta • il server fornisce una risposta al client ✦ Esempi • Il protocollo HTTP per il World Wide Web • La posta elettronica • Il nostro sistema di chat 3
  4. 4. Modelli distribuiti ✦ Java permette una gestione semplificata dei socket, con il quale il programmatore è in grado di realizzare un meccanismo di comunicazione. ✦ I socket risolvono solo il problema di fondo “come instaurare la connessione”, ma non definiscono le modalità di comunicazione. • codifica delle informazioni • estensibilità dei protocolli 4 • gestione efficiente delle connessioni
  5. 5. Middleware ✦ Un middleware è uno strato di software che gestisce i meccanismi di comunicazione tra più processi, situati possibilmente su macchine diverse, presentando allo sviluppatore un’astrazione di livello più elevato, che gli consenta di ignorare una serie di problemi legati alla comunicazione • Semplicità di sviluppo • Indipendenza dagli specifici meccanismi di comunicazione 5
  6. 6. Middleware Client Server Middleware Middleware Connessione Trasporto Trasporto 6
  7. 7. Middleware ✦ Esistono delle forti analogie concettuali tra un sistema distribuito client-server e la programmazione orientata agli oggetti Invocazione metodo Oggetto Oggetto Risultato Richiesta Client Server Risposta ✦ I middleware object-oriented usano queste analogie per presentare allo sviluppatore un modello “familiare” 7
  8. 8. Middleware ✦ In un middleware orientato agli oggetti, gli oggetti di un processo possono accedere ai servizi di un altro processo usando l’astrazione di oggetti remoti ✦ L’invocazione di metodi su oggetti remoti in realtà comporta la trasmissione di un messaggio al server che implementa tali oggetti, e l’attesa della risposta di tale server (comunicazione sincrona) 8
  9. 9. Remote Method Invocation ✦ Gli oggetti remoti sono gestiti attraverso riferimenti (Remote Reference) che si comportano, dal punto di vista dello sviluppatore, come riferimenti a oggetti locali (o quasi). L’unica differenza è il modo con cui vengono ottenuti questi riferimenti. ✦ La soluzione full-Java per l’esecuzione di codice remoto è conosciuta con il nome di RMI (Remote Method Invocation) 9
  10. 10. Architettura RMI ✦ quando un oggetto desidera invocare un metodo di un altro oggetto, deve prima ricavarne un riferimento (indirizzo), istanziandolo direttamente o ricevendone l’indirizzo dall’esterno, e successivamente eseguire un istruzione del tipo: nome_oggetto.nome_metodo(lista_parametri) 10
  11. 11. Architettura RMI ✦ Nel caso distribuito si deve ricavare il riferimento all’oggetto remoto e invocare i metodi a distanza • la soluzione proposta da RMI consiste nello scaricare in locale un “rappresentante” dell’oggetto remoto e di considerarlo come se si trattasse a tutti gli effetti di un oggetto locale nome_ogg_remoto.nome_metodo(lista_parametri) 11
  12. 12. Architettura RMI Lo strato più alto è costituito su entrambi i lati (client/server) dall’applicazione che viene eseguita sulla Java-Machine ✦ RMI Client ‣ applicazione che effettua le chiamate ai metodi degli oggetti remoti residenti sul lato server ✦ RMI Server ‣ Applicazione che gestisce gli oggetti serventi 12
  13. 13. Architettura RMI …sotto il livello applicazione si trovano i due protagonisti di tutto il meccanismo RMI, lo stub e lo skeleton, due rappresentanti della stessa entità. Compiti dello stub sul client: Compiti dello skeleton sul • inizia una chiamata via RRL server: ‣ invia i parametri (serializzazione) • attende richieste • invoca il metodo via RRL • riceve i dati dal client ‣ attende il completamento dell’operazione ‣ deserializzazione dei parametri • completa la chiamata • chiama l’effettiva ‣ riceve e deserializza il risultato • ritorna implementazione del metodo • trasmette la risposta al client ‣ serializza il risultato 13
  14. 14. Architettura RMI …i lati server e client sono collegati con il sottostante Remote Reference Layer (RRL) che a sua volta si appoggia al Transport Layer (TL)  Al livello RRL viene instaurato un collegamento virtuale fra i due lati, client e server, mentre fisicamente la connessione avviene al livello sottostante  (RRL) basato su protocollo generico ed indipendente dal particolare tipo di stub/skeleton 14
  15. 15. Architettura RMI …i lati server e client sono collegati con il sottostante Remote Reference Layer (RRL) che a sua volta si appoggia al Transport Layer (TL)  Quando il TL riceve una richiesta di connessione da parte del client, localizza il server RMI relativo all’oggetto remoto richiesto:  localizzazione del server RMI  connessione per mezzo di un socket appositamente creato per il servizio  passa la connessione al lato client del RRL ed aggiunge un riferimento dell’oggetto remoto nella tabella opportuna  controllo dello stato delle connessioni (es. timeout) 15
  16. 16. Architettura RMI RMI Client RMI Server Stub Skeleton Connessione virtuale RRL RRL TL TL socket socket TCP TCP IP IP Network Connessione fisica Network 16
  17. 17. Definizione e uso di oggetti remoti ✦ I passi da seguire sono: • definire un’interfaccia remota • definire un’implementazione dell’interfaccia • creare un’applicazione server che istanzi l’implementazione e la renda pubblicamente accessibile • creare un client che ottenga un riferimento remoto e lo usi per richiedere le operazioni al server 17
  18. 18. Interfaccia remota ✦ Per ogni oggetto che deve essere utilizzato come oggetto remoto occorre definire una interface detta interfaccia remota • l’interfaccia remota deve estendere Remote • ogni metodo deve dichiarare che può sollevare l’eccezione RemoteException • Sia Remote che RemoteException sono definite nel package java.rmi 18
  19. 19. Interfaccia remota ✦ Esempio: • supponendo che l’oggetto remoto che vogliamo realizzare svolga le operazioni aritmetiche fondamentali import java.rmi.*; public interface Calculator extends Remote { double add(double a, double b) throws RemoteException; double subtract(double a, double b) throws RemoteException; double divide(double a, double b) throws RemoteException; double multiply(double a, double b) throws RemoteException; } 19
  20. 20. Interfaccia remota ✦ I parametri e il valore di ritorno dei metodi dell’interfaccia remota possono appartenere solo a un insieme ristretto di tipi: • tipi atomici (es. int) • classi serializzabili • interfacce remote (anche diverse da quella che contiene il metodo) • array i cui elementi appartengono ai tipi sopraindicati 20
  21. 21. Implementazione ✦ La classe che contiene l’effettiva implementazione dell’oggetto remoto: • deve essere derivata da java.rmi.server.UnicastRemoteObject • deve dichiarare che implementa l’interfaccia remota • inoltre deve avere un costruttore (anche vuoto) che dichiara di sollevare RemoteException ✦ Per convenzione, il nome della classe termina generalmente con “Impl” 21
  22. 22. Implementazione ✦ Esempio import java.rmi.*; import java.rmi.server.*; public class CalculatorImpl extends UnicastRemoteObject implements Calculator { public CalculatorImpl() throws RemoteException { // Costruttore vuoto } public double add(double a, double b) { return a+b; } public double divide(double a, double b) { return a/b; } public double multiply(double a, double b) { return a*b; } public double subtract(double a, double b) { return a-b; } } 22
  23. 23. Stub e skeleton ✦ Tradizionalmente, una volta definita la classe di implementazione, occorreva richiamare il tool rmic per effettuare la generazione dello stub e dello skeleton corrispondenti ✦ Da Java 1.2, lo skeleton viene generato dinamicamente in modo automatico ✦ Da Java 1.5, anche lo stub viene generato dinamicamente 23
  24. 24. Applicazione server ✦ L’applicazione server ha il compito di: • creare una o più istanze delle classi che implementano le interfacce remote • rendere accessibili al client i riferimenti remoti a queste istanze ‣ come fa il client a ottenere un riferimento remoto dal server? 24
  25. 25. Applicazione server ✦ Il modo principale con cui un client ottiene un remote reference è attraverso il valore di ritorno di un metodo remoto • se il client ha un riferimento a un oggetto remoto A, l’oggetto può fornirgli il riferimento a un altro oggetto remoto B, che a sua volta può fornirgli il riferimento a C e così via ✦ Problema: “bootstrap” • come fa il client a ottenere il riferimento al primo oggetto remoto? 25
  26. 26. Registry ✦ Per risolvere il problema del bootstrap il Java Development Kit mette a disposizione l’applicazione rmiregistry • name server che associa nomi simbolici (o più precisamente URL) a riferimenti remoti • il server registra i riferimenti agli oggetti di bootstrap (quelli da cui il client deve partire per accedere all’applicazione) • il client consulta il name server usando un protocollo ad hoc (già implementato da una classe della libreria standard) 26
  27. 27. Registrazione di un riferimento ✦ Occorre usare il metodo statico rebind della classe Naming: ‣ static void rebind(String name, Remote obj) throws RemoteException, MalformedURLException • name è il nome assegnato all’oggetto (parte finale dell’URL) • obj è l’istanza della classe di implementazione • l’oggetto viene registrato su un rmiregistry che si trova sulla stessa macchina 27
  28. 28. Applicazione server ✦ Esempio import java.net.*; import java.rmi.*; public class CalculatorServer { public static void main(String args[]) throws RemoteException, MalformedURLException { Calculator calc=new CalculatorImpl(); Naming.rebind("calc", calc); } } 28
  29. 29. Il client ✦ Il client ottiene un riferimento agli oggetti registrati usando il metodo lookup della classe Naming: • static Remote lookup(String url) throws NotBoundException, MalformedURLException, RemoteException ✦ Il formato dell’URL è: • rmi://host/name 29
  30. 30. Il client ✦ Una volta ottenuto un riferimento (dal registry o da un altro oggetto remoto), il client lo usa come se fosse un oggetto “normale” • occorre ricordare che ogni metodo dell’interfaccia remota può sollevare un’eccezione controllata RemoteException 30
  31. 31. Il client ✦ Esempio import java.net.*; import java.rmi.*; public class CalculatorClient { public static void main(String args[]) throws RemoteException, MalformedURLException, NotBoundException { Calculator calc=(Calculator)Naming.lookup("rmi://localhost/calc"); System.out.print("9 per 9 fa "+calc.multiply(9,9)); } } 31

×