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