450 likes | 652 Views
R emote P rocedure C all. Corso di Sistemi di Elaborazione delle Informazioni a.a 2007/2008 Autori: Alberto Colombo Fulvio Frati. Sommario. Descrizione RPC File IDL e ACF Applicazione Client Applicazione Server Java RMI. Remote Procedure Call (1).
E N D
RemoteProcedure Call Corso di Sistemi di Elaborazione delle Informazioni a.a 2007/2008 Autori: Alberto Colombo Fulvio Frati
Sommario • Descrizione RPC • File IDL e ACF • Applicazione Client • Applicazione Server • Java RMI
RemoteProcedure Call (1) • Tecnologia (’80) che permette ad un programma di chiamare una funzione che si trova su un altro computer • Trasparenza: la chiamata di procedura remota è eseguita in modo il più possibile analogo a una chiamata di procedura "locale“ • Dettagli della comunicazione su rete sono "nascosti" all’utente
IDL-Compiler shop_c.c shop_s.c C-Compiler C-Compiler shop_c.o shop.h shop_s.o #include shop_client.cpp shop_server.cpp C-Compiler shop_client.o shop_server.o Linker Linker Client.exe Server.exe Descrizione RPC shop.idl
File shop.IDL InterfaceHeader InterfaceBody
File shop.IDL: Interface Header • Contiene informazioni generali relative all’interfaccia • Gli attributi definiti sono globali rispetto a tutta l’interfaccia • UUID: assegna all’interfaccia un Universally Unique IDentifier che la identifica univocamente • version: definisce la versione dell’interfaccia: è possibile avere più interfacce relative allo stesso servizio ognuna identificata da un numero di versione
File shop.IDL: UUID • UUID: Universally Unique Identifier, identificativo standard utilizzato in informatica • Esadecimale a 16 byte (o 128 bit) calcolato come la concatenazione fra numero casuale + MAC address della macchina + nanosecondi dall’adozione del calendario gregoriano • Ci sono teoricamente 25616 or about 3.4 × 1038. Quindi è necessario generare 1012 UUID ogni nanosecondo di 109 anni per esaurire le possibili combinazioni • Generabile attraverso librerie nei più comuni linguaggi o attraverso siti appositi (es. www.itu.int/ITU-T/asn1/uuid.html) • Unicità di UUID fondamentale se l’interfaccia utilizzata a livello internet, non necessaria se per servizio locale
File shop.IDL: Interface Body (1) Nome Interfaccia Definizione struttura Book Definizione struttura Receipt • Definizione dei tipi di dato che saranno condivisi dalle due applicazioni • Il servizio remoto può utilizzare tutti i tipi elementari + le strutture definite nel file IDL • [string] indica di trattare il campo (unsigned char*) come un campo string
File shop.IDL: Interface Body (2) • Definizione funzioni remote chiamate dal client ed esposte dal server • L’attributo [in] indica che il parametro è passato dalla procedura chiamante alla procedura chiamata • L’attributo [out] indica che il puntatore al parametro deve essere restituito dal server al client. Deve essere sempre seguito da una variabile puntatore • E’ permesso indicarli contemporaneamente: [in,out] • Se i dati scambiati sono tipi complessi (non definiti dal linguaggio) devono essere dichiarati all’interno del file IDL
File shop.ACF • ACF: Application Configuration File • Contiene configurazioni specifiche dell’implementazione locale e non l’interfaccia di rete • Configurazione nell’esempio specifica di Visual Studio, per dettagli vedere MSDN
IDL Compiler Output • I file ACF e IDL sono necessari al compilatore MIDL (Microsoft) per generare i proxy • MIDL genera i file: • shop.h (o shop_h.h): header file da includere nei sorgenti del client e del server; contiene le signature (definizione) dei metodi remoti • shop_c.c: client proxy, implementa i metodi remoti indicati nell’IDL e richiamati dal client; gestisce la comunicazione con il server • shop_s.c:server proxy, gestisce la comunicazione con i client e l’esposizione dei metodi remoti • shop.h deve essere incluso nel codice del client e del server • shop_c.c e shop_s.c devono essere linkati, rispettivamente, con il client e il server in fase di compilazione
shop.idl IDL-Compiler shop_c.c shop_s.c C-Compiler C-Compiler shop_c.o shop.h shop_s.o #include shop_client.cpp shop_server.cpp C-Compiler shop_client.o shop_server.o Linker Linker Client.exe Server.exe Descrizione RPC
Applicazione Client (1) • Contiene la signature (definizione) dei metodi remoti • Il file shop.h creato da MIDL deve essere importato con il percorso corretto
Applicazione Client (2) • status: stato attuale della connessione • pszUuid: UUID (Universal Unique Identifier) dell’interfaccia connessa (NULL perchè unica, servizio locale) • pszProtocolSequence: protocollo di rete utilizzato • pszNetworkAddress: indirizzo di rete della macchina server (NULL per indirizzo locale)
Applicazione Client (2): Protocol Sequence Costants • Identificano il protocollo di rete da utilizzare • Sono specifici del sistema client e server attraverso cui avviene la comunicazione • ncacn_np definisce un protocollo di comunicazione fra sistemi Windows attraverso named pipes • named pipes: canali di comunicazioni utilizzati da Windows per le comunicazioni inter-processi • Lista dei protocolli su sistemi Windows reperibile su MSDN
Applicazione Client (3) • pszEndpoint: indica che canale utilizzare; la sintassi dipende dal protocollo specificato. Nel nostro caso utilizziamo la pipe con nome bookshop • pszOptions: opzioni generali di rete • pszStringBinding: stringa che rappresenta la connessione da stabilire (protocollo, indirizzo e endpoint) e valorizzata in seguito
Applicazione Client (4) • RpcStringBindingCompose crea una stringa di connessione per la gestione della comunicazione • Restituisce: RPC_S_INVALID_STRING_UUID se ci sono errori, RPC_S_OK (0) se tutto ok • Valorizza la variabile pszStringBinding che contiene la stringa di connessione da utilizzare per stabilire la connessione e di cui è passato il puntatore
Applicazione Client (5) • Stabilisce la connessione tra client e server a partire da pszStringBinding creata precedentemente • Restituisce lo stato della connessione ed eventuali errori • Valorizza server_Handle che contiene il descrittore (handle) della connessione stabilita e utilizzabile successivamente per riferirla
Applicazione Client (7) • Le macro RpcTryExcept e RpcExcept forniscono un meccanismo per la gestione delle eccezioni in sistemi RPC • Se nel blocco RpcTryExcept si riscontra un’eccezione causata da una procedura remota, il controllo passa al blocco RpcExcept per la gestione della stessa • RpcExceptionCode() restituisce il codice dell’eccezione, utilizzabile per eventuali messaggi d’errore • RpcEndExcept chiude il blocco RpcTryExcept • Utilizzabile solo sotto sistemi Microsoft, NON è standard ANSI C
Applicazione Client (8) • Al termine della connessione, RpcBindingFree libera la memoria utilizzata da server_Handle • Funzioni da implementare obbligatoriamente per permettere al sistema l’allocazione e la disallocazione della memoria
shop.idl IDL-Compiler shop_c.c shop_s.c C-Compiler C-Compiler shop_c.o shop.h shop_s.o #include shop_client.cpp shop_server.cpp C-Compiler shop_client.o shop_server.o Linker Linker Client.exe Server.exe Descrizione RPC
Applicazione Server (1) • pszSecurity: parametro opzionale per la gestione della sicurezza, ignorato da quasi tutti i protocolli di rete; da impostare a NULL • Protocol Sequence e Endpoint devono corrispondere tra client e server per poter stabilire un canale di comunicazione
Applicazione Server (2) • cMinCalls: numero minimo di richieste di connessione da attendere prima di aprire i canali; RPC_C_LISTEN_MAX_CALLS_DEFAULT indica il valore imposto di default dal sistema • cMaxCalls: numero massimo di connessioni gestite contemporaneamente; RPC_C_PROTSEQ_MAX_REQS_DEFAULT indica il valore imposto di default dal sistema • fDontWait: = 0 (FALSE) il server attende la conclusione di una connessione per continuare (bloccante), <> 0 (TRUE) il server continua l’elaborazione anche durante una connessione (non bloccante)
Applicazione Server (3) • RpcServerUseProtseqEp indica al sistema di utilizzare il protocollo specificato, combinato con l’entry point, per gestire l’invocazione di procedure remote, riferite a quel protocollo • Restituisce lo stato della connessione ed eventuali errori • Un’applicazione server può utilizzaree più protocolli per gestire diversi canali di comunicazione
Applicazione Server (4) • RpcServerRegisterIf registra l’interfaccia nel sistema RPC; ogni richiesta verso quell’interfaccia sul protocollo di rete specificato sarà reindirizzata verso l’applicazione server • Accetta come parametri l’interfaccia, l’UUID dell’interfaccia e un puntatore ad un vettore di entry point • bookshop_v1_0_s_ifspec: oggetto creato dal compilatore MIDL che identifica l’interfaccia bookshop; • MIDL utilizza la seguente sintassi per identificare le interfacce: • <nome>_v<major number>_<minor number>_<s|c>_ifspec • Restituisce lo stato della connessione
Applicazione Server (4): Port Mapper • Le applicazioni sono associate alle relative porte attraverso il Port Mapper • In sistemi Unix/Linux il Port Mapper è implementato dal demone portmap • rpcinfo fornisce informazioni su porte e programmi associati $ rpcinfo -p program vers proto port 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100024 1 udp 32770 status 100021 1 udp 32770 nlockmgr 100021 3 udp 32770 nlockmgr 100021 4 udp 32770 nlockmgr 100024 1 tcp 32769 status 100021 1 tcp 32769 nlockmgr 100021 3 tcp 32769 nlockmgr 100021 4 tcp 32769 nlockmgr 100005 1 udp 644 mountd 100005 1 tcp 645 mountd 100005 2 udp 644 mountd
Applicazione Server (5) • RpcServerListen indica al sistema RPC di rimanere in attesa di chiamate a procedure remote • Accetta come parametri il valore minimo e massimo di connessioni e se la comunicazione deve essere bloccante o non bloccante: • bloccante, il server attende la conclusione dell’elaborazione prima di accettare la successiva richiesta • non bloccante, più richieste in esecuzione in parallelo • Restituisce lo stato della comunicazione dopo la chiamata a RpcServerListen • RpcServerListen rimane in esecuzione fino a che il server non viene terminato
Applicazione Server (6) • I metodi remoti vanno gestiti come funzioni normali, seguendo però la signature definita nel file IDL • Le strutture definite nel file IDL sono visibili in tutta l’applicazione • La gestione della comunicazione verso i client è a carico della classe shop_s.c generata dal compilatore MIDL, da linkare in fase di compilazione
Applicazione Server (7) • Le funzioni per l’allocazione e la disallocazione della memoria devono essere codificate anche nel server
RPC e Java: RMI (cenni) • RMI (Remote Method Invocation) applicazione di RPC in Java più comune • Rappresentano un’evoluzione di RPC per la gestione di oggetti • Permette il passaggio di tipi complessi
RMI: Protocollo di Comunicazione • Comunicazione client/server in cui: • Il server: • crea un certo numero di oggetti • li rende accessibili da remoto • attende le invocazioni dei client sugli oggetti • Il client: • preleva la reference da uno o più oggetti distribuiti • Invoca direttamente i loro metodi • Nota: Nei sistemi peer to peer il ruolo di client e server può essere assunto da tutti i nodi; questi sono chiamati servant
RMI: Protocollo di Comunicazione Processo Client Oggetto Client STUB Lookup RMI transport layer SKELETON RMI REGISTER Oggetto Server Register Processo Server
RMI: Stub e Skeleton • Il client invoca il metodo sullo stub non sull’oggetto. Lo stub “impacchetta” la richiesta in modo opportuno e la invia allo skeleton. Lo stub mantiene un reference dell’oggetto remoto • Lo skeleton si comporta da proxy nei confronti delle richieste del client. Intercetta tali richieste e le elabora in modo che sia possibile chiamare il metodo dell’oggetto reale. Inoltre si occupa di “impacchettare” la risposta e di inviarla allo stub.
RMI: Comunicazione • Il client ottiene un’istanza dello stub • Viene chiamato il metodo sullo stub (non sull’oggetto remoto) • Lo stub crea una connessione con lo skeleton sul server: • esegue il marshall delle informazioni riguardanti il metodo (nome e parametri) • invia le informazioni allo skeleton • Lo skeleton esegue il demarshall dei dati ricevuti dal client • esegue il metodo • esegue il marshall del valore di ritorno del metodo • invia le informazioni allo stub • Lo stub esegue il demarshall dei dati ricevuti dal server e li ritorna al client
RMI: implementazione (cenni) • Definire un’interfaccia remota • Implementare l’interfaccia remota, definendo l’oggetto remoto • Sviluppare il server • Sviluppare il client
RMI: implementazione (cenni) • Definire un’interfaccia remota • Implementare l’interfaccia remota, definendo l’oggetto remoto • Sviluppare il server • Sviluppare il client
RMI: implementazione (cenni) • Definire un’interfaccia remota • Implementare l’interfaccia remota, definendo l’oggetto remoto • Sviluppare il server • Sviluppare il client
RMI: implementazione (cenni) • Definire un’interfaccia remota • Implementare l’interfaccia remota, definendo l’oggetto remoto • Sviluppare il server • Sviluppare il client
Annotazioni finali • Le slide saranno pubblicate su • http://ra.crema.unimi.it • References: MSDN – Remote Procedure Call (RPC) Java - RMI