Broker in practica Middleware Tool Generare Proxyuri BibliotecaAPI
Broker in practica: Middleware Tool Generare Proxy-uri Biblioteca(API)+ Executabile Application Developer
Implementari de referinta ale arhitecturii Broker Middleware care implementeaza tiparul Broker: – CORBA: Common Object Request Broker Architecture. Arhitectura de referinta elaborata de OMG (Object Management Group) • Diverse implementari, comerciale sau open – RMI: Java Remote Method Invocation - Sun –. NET Remoting - Microsoft
Arhitectura comuna Server implements Client uses Remote Interface Remote Object implements Server. Side Proxy Client. Side Proxy Broker
Exemplu • Aplicatie distribuita simpla: realizarea unui sistem Stock. Market, care poate fi interogat de la distanta asupra valorii curente a actiunilor unor companii specificate • Middleware (Broker) utilizat - 3 variante: – CORBA – RMI –. NET Remoting • Se compara: – Suportul oferit de cele 3 implementari de Broker pentru dezvoltarea unei aplicatii distribuite simple – Pasii necesari pentru realizarea aplicatiei • Exemplul ajuta la intelegerea functionarii unui Broker in general
Pasi de dezvoltare ai aplicatiei 1. Definire interfata obiect la distanta INTERFACE Stock. Market 5. Implementare Client float get_price(Company) 2. Implementare obiect 4. Implementare Server Stock. Market. Client 3. Generare Proxy Stock. Market Client. Side PROXY Stock. Market. Impl 6. Rulare aplicatie Broker 3. Generare Proxy Stock. Market Server. Side PROXY
RMI: Arhitectura Server implements Client uses Remote Interface Remote Object implements Stub (Client. Side Proxy) Remote Reference Layer Transport Layer Skeleton (Server. Side Proxy)
RMI - Pas 1. Definire interfata • Se defineste interfata Stock. Market • Aceasta exporta operatia get_price: – Parametru: numele companiei cotate la bursa – Rezultat: valoarea actiunilor Specific RMI: • Interfata trebuie sa extinda java. rmi. Remote • Metodele trebuie sa poata genera exceptii Remote. Exception package Simple. Stocks; import java. rmi. *; public interface Stock. Market extends java. rmi. Remote { float get_price (String Company) throws Remote. Exception; } Fisier Stock. Market. java
RMI - Pas 2. Implementare Obiect • Se implementeaza clasa Stock. Market. Impl • Aceasta realizeaza operatia get_price import java. rmi. *; import java. rmi. server. Unicast. Remote. Object; public class Stock. Market. Impl extends Unicast. Remote. Object implements Stock. Market { public Stock. Market. Impl() throws Remote. Exception {} Specific RMI: • Implementarea trebuie sa extinda Unicast. Remote. Object public float get_price(String company) { float price=12345; return price; } } Fisier Stock. Market. Impl. java
RMI - Pas 3. Generare Proxy-uri RMI Stub/Skeleton Se genereaza automat din implementarea obiectului server >rmic –v 1. 1 –keep Stock. Market. Impl Rezulta clase pentru stub si skeleton, utilizand conventia de nume: Stock. Market. Impl_Stub. class Stock. Market. Impl_Skel. class (incepand cu versiunea Java 1. 2 implicit nu se mai genereaza skeleton-ul, de aceea e optiunea –v 1. 1) Observatie: incepand cu versiunea Java 1. 5, nu mai este necesara pregenerarea stub-ului cu rmic, acesta poate fi generat dinamic la runtime prin mecanismul de dynamic proxy Se poate alege daca se doreste utilizarea unui stub pregenerat sau crearea unui stub cu dynamic proxy, chiar daca ar exista stub-ul pregenerat prin setarea corespunzatoare a valorii system property java. rmi. server. ignore. Stub. Classes
RMI - Pas 4. Implementare Server • Se implementeaza un program Stock. Market. Server, care creaza un obiect de tip Stock. Market, ce poate fi accesat de la distanta • Obiectul creat este inregistrat sub numele “NASDAQ” import java. rmi. *; import Simple. Stocks. *; public class Stock. Market. Server { public static void main(String[] args) { try { Stock. Market. Impl stock. Market. Impl = new Stock. Market. Impl(); Naming. rebind("NASDAQ", stock. Market. Impl ); Specific RMI: • Naming } catch (Exception e) {} } } Fisier Stock. Market. Server. java
RMI - Pas 5. Implementare Client • Se implementeaza un program Stock. Market. Client, care acceseaza un obiect de tip Stock. Market aflat la distanta, si invoca operatia get_price pentru un nume de companie • Prin intermediul Broker se localizeaza obiectul cu numele “NASDAQ” import java. rmi. *; import Simple. Stocks. *; public class Stock. Market. Client { public static void main(String[] args) { try { Stock. Market market= (Stock. Market) Naming. lookup("rmi: //localhost/NASDAQ"); float price=market. get_price("ABC SRL"); System. out. println("Price is "+price); Specific RMI: • Naming. lookup } catch (Exception e) { System. out. println("Exception !"); } } } Fisier Stock. Market. Client. java
RMI - Pas 6. Rulare aplicatie > start rmiregistry RMI Registry = non -persistent Naming Service > start java Stock. Market. Server > start java Stock. Market. Client Codul aplicatiei exemplu poate fi download-ad de pe pagina cursului, de la sectiunea de exemple de cod pentru cursul c 7: RMI_Stock. Market
CORBA: Arhitectura Server Remote Interface IDL Client Interface Repository Dynamic IDL Stub Invocation (Client. Side Interface Proxy) ORB Interface Remote Object IDL Skeleton (Server. Side Proxy) ORB (Object Request Broker) Object Adapter Implem Repository
CORBA - Pas 1. Definire interfata • Se defineste interfata Stock. Market • Aceasta exporta operatia get_price: – Parametru: numele companiei cotate la bursa – Rezultat: valoarea actiunilor Specific CORBA: • Interfata se defineste intrun limbaj neutru, CORBA IDL module Simple. Stocks { interface Stock. Market { float get_price(in string Company); }; }; Fisier Stock. Market. idl
CORBA - Pas 2. Generare Proxy-uri CORBA IDL Stub/Skeleton Se genereaza automat din definitia interfetei IDL > idl 2 java Stock. Market. idl Rezulta clasele/fisierele: Client Stub: _st_Stock. Market. java Server Stub: _Stock. Market. Impl. Base. java
CORBA - Pas 3. Implementare Obiect • Se implementeaza clasa Stock. Market. Impl • Aceasta realizeaza operatia get_price Specific CORBA: • Un obiect accesibil la distanta trebuie sa extinda server-side-proxy-ul generat automat din descrierea interfetei import org. omg. CORBA. *; import Simple. Stocks. *; public class Stock. Market. Impl extends _Stock. Market. Impl. Base { public float get_price(in string company) { float price=12345; return price; } public Stock. Market. Impl (String name) { super(name); } } Fisier Stock. Market. Impl. java
CORBA - Pas 4. Implementare Server • Se implementeaza un program Stock. Market. Server, care creaza un obiect de tip Stock. Market. Impl, ce poate fi accesat de la distanta • Obiectul creat este inregistrat sub numele “NASDAQ” Specific CORBA: • ORB • BOA import org. omg. CORBA. *; Import Simple. Stocks. *; public class Stock. Market. Server { public static void main(String[] args) { try { ORB orb=ORB. init(); BOA boa=orb. BOA_init(); Stock. Market. Impl stock. Market. Impl= new Stock. Market. Impl(“NASDAQ”); boa. obj_is_ready(stock. Market. Impl); boa. Impl_is_ready(); } catch (Exception e) {} } } Fisier Stock. Market. Server. java
CORBA - Pas 5. Implementare Client • Se implementeaza un program Stock. Market. Client, care acceseaza un obiect de tip Stock. Market aflat la distanta, si invoca operatia get_price pentru un nume de companie • Prin intermediul Broker se localizeaza obiectul cu numele “NASDAQ” Specific CORBA: • ORB • Stock. Market. Helper = proxy generat import org. omg. CORBA. *; import Simple. Stocks. *; public class Stock. Market. Client { public static void main(String[] args) { try { ORB orb=ORB. init(); Stock. Market market= Stock. Market. Helper. bind(orb, “NASDAQ”); market. get_price(“ABC SRL”); } catch (Exception e) {} } } Fisier Stock. Market. Client. java
CORBA - Pas 6. Rulare aplicatie Location service (numele OSAgent e specific unei anumite implementari CORBA) > start osagent > start java Stock. Market. Server > start java Stock. Market. Client
. NET Remoting Architecture Server Client Remote Interface Remote Object Transparent. Proxy Real. Proxy Remoting system Channel Remoting system
. NET – Pas 1. Definire Interfata Remote • Se defineste interfata Stock. Market • Aceasta exporta operatia get_price: – Parametru: numele companiei cotate la bursa – Rezultat: valoarea actiunilor Specific. NET: • Interfata nu contine nimic special • Nu este neaparat nevoie sa fie definita o interfata public interface Stock. Market { float get_price(string company); } Fisier Stock. Market. cs
. NET – Pas 2. Definire Obiect Remote • Se implementeaza clasa Stock. Market. Impl • Aceasta realizeaza operatia get_price Specific. NET: • Obiectul accesibil la distanta trebuie sa extinda Marshal. By. Ref. Object using System; public class Stock. Market. Impl : Marshal. By. Ref. Object, Stock. Market{ public float get_price(string company){ return 12345; } } Fisier Stock. Market. Impl. cs
. NET – Pas 3. Implementare Server • Se implementeaza un program Stock. Market. Server, care creaza un obiect de tip Stock. Market, ce poate fi accesat de la distanta • Obiectul creat este inregistrat sub numele “NASDAQ” Specific. NET: • Channel. Services • Remoting. Services using System; using System. Runtime. Remoting. Channels; using System. Runtime. Remoting. Channels. Tcp; public class Stock. Market. Server{ public static void Main(){ Stock. Market. Impl my. Stock. Market = new Stock. Market. Impl(); Tcp. Channel m_Tcp. Chan = new Tcp. Channel(9999); Channel. Services. Register. Channel(m_Tcp. Chan); Remoting. Services. Marshal( my. Stock. Market, "NASDAQ"); System. Console. Write. Line( "Listening for requests. Press ENTER to quit"); System. Console. Read. Line(); } } Fisier Stock. Market. Server. cs
. NET – Pas 4. Implementare Client • Se implementeaza un program Stock. Market. Client, care acceseaza un obiect de tip Stock. Market aflat la distanta, si invoca operatia get_price pentru un nume de companie • Prin intermediul Broker se localizeaza obiectul cu numele “NASDAQ” using System; using System. Runtime. Remoting. Channels; using System. Runtime. Remoting. Channels. Tcp; public class Client{ public static void Main(){ Tcp. Channel tcp. Chan = new Tcp. Channel(); Channel. Services. Register. Channel(tcp. Chan); Stock. Market stock. Market = (Stock. Market) Activator. Get. Object(typeof(Stock. Market), "tcp: //localhost: 9999/NASDAQ"); Specific. NET: • Channel. Services • Activator. Get. Object Console. Write. Line(stock. Market. get_price( "abc SRL")); } } Fisier Stock. Market. Client. cs
. NET - Pas 5. Rulare aplicatie > Presupunand ca Windows si. NET Framework este instalat: > start Stock. Market. Server > start Stock. Market. Client Codul aplicatiei exemplu poate fi download-ad de pe pagina cursului, de la sectiunea de exemple de cod pentru cursul c 7: . NET Remoting Stock. Market
. NET - Pas 6. Creare Proxy ? • Crearea de Proxy este total transparenta pentru developer-ul de aplicatii • Proxy se creaza automat de catre. NET Framework in timpul executiei cand un client activeaza un obiect la distanta.
Alte facilitati oferite de Middleware • Exemplul anterior ilustreaza doar facilitatile elementare oferite de un Broker: – Inregistrarea unui serviciu la Broker – Localizarea unui serviciu prin Broker – Obtinerea unei referinte la un obiect la distanta • In functie de fiecare tehnologie, se mai poate oferi suport si pentru unele din urmatoarele: – Invocare dinamica – Livrare dinamica – Transferul obiectelor (inclusiv remote objects) ca parametri la serviciile la distanta – prin valoare sau referinta – Activarea unui obiect la distanta – Concurenta in interiorul obiectelor server – Securitate – Garbage collection pentru obiectele la distanta – Interoperabilitatea intre clienti si servere din limbaje diferite – Bridge cu alte tehnologii de Middleware
Alte facilitati oferite de Middleware - detalii • Invocare statica vs. Invocare dinamica – Invocare statica: daca clientul cunoaste de la design-time care este interfata serviciului la distanta utilizat: • Se pot genera clasele de tip Client. Side. Proxy pentru serviciul respectiv • Clientul interactioneaza cu acest proxy • Apelurile sunt hard-codate in codul sursa – Invocare dinamica: daca clientul nu cunoaste la design-time care este interfata serviciului la distanta utilizat (acesta va fi descoperit la runtime) • Apelurile nu pot fi hardcodate in codul sursa al clientului • Solutie: un mecanism tip Reflection: orice server ofera o operatie de tip invoke, care primeste ca parametrii operatia concreta si valorile parametrilor • Livrare statica vs livrare dinamica – Livrare statica: Programul server cunoaste de la design-time care sunt obiectele server pe care le gazduieste – Livrare dinamica: Obiecte server pot fi create dinamic la runtime • Server. Side. Proxy poate fi unul generic, care suporta o operatie de tip invoke ca la invocarea dinamica
Alte facilitati oferite de Middleware – detalii (cont) • Concurenta – Varianta simpla: Programul server (Server. Side. Proxy) contine un ciclu in care accepta cereri si le trateaza secvential – Server concurent: creaza cate un thread pentru tratarea cererilor • Problema: Obiectul server poate fi utilizat de thread-uri diferite in acelasi timp – poate necesita utilizarea unor mecanisme de sincronizare
Alte facilitati oferite de Middleware – detalii (cont) • Activarea obiectelor server – Varianta simpla: Programul server creaza obiectul server, acesta exista atat timp cat ruleaza programul server Activarea obiectelor la cerere: obiectul server este creat doar daca apare prima cerere pentru el – • Activator: un server care: – – – • – Are evidenta unde se gasesc Implementarile (clasele) din care pot fi instantiate obiecte server (Exemplu: CORBA: Implementation Repository) Are evidenta obiectelor server create Primeste cererea de la client, daca obiectul server nu exista inca - il creaza, altfel invoca operatia solicitata pe obiectul server Activator Pattern: Michael Stal, Douglas Schmidt, PLOP 2005 http: //www. stal. de/Downloads/Activator. pdf Exemple: Implementation repository in CORBA, rmid (Java RMI Activation System Daemon )
Alte facilitati oferite de Middleware – detalii (cont) • Garbage collection pentru obiectele server: – Obiectele server pentru care nu mai exista nici o remote reference pot fi dezactivate – Variante: • Stil cooperativ: clientii anunta cand nu mai au nevoie/elibereaza referinta la server object, serverul pastreaza evidenta prin contoare • Brokerul pastreaza evidenta canalelor de comunicatie care sunt active • Persistent remote reference – Un client poate sa detina o remote reference catre un server object, chiar daca acesta a fost oprit intre timp (accidental sau time-out) – Daca clientul incearca sa acceseze obiectul server pentru care detine o referinta, broker-ul trebuie sa il reactiveze si sa il aduca in starea in care acesta a fost inainte de dezactivare • sunt necesare mecanisme de salvare a starii obiectelor server, de aplicat automat inainte de dezactivare
Alte facilitati oferite de Middleware – detalii (cont) • Interoperability intre clienti si servere: – Interface Description Languages: • Exista un model comun (model orientat pe obiecte, stabileste un sistem de tipuri, operatii, interfete, exceptii) • interfata obiectelor server este descrisa folosind un limbaj de descriere neutru • Exista reguli (si tool-uri) care mapeaza conceptele IDL pe particularitatile unor limbaje de programare concrete
Bibliografie suplimentara facultativa • Frantisek Plasil, Michael Stal: An Architectural View of Distributed Objects and Components in CORBA, Java RMI, and COM/DCOM, published in Software Concepts & Tools, Springer, 1998. http: //dissertations. ub. rug. nl/FILES/faculties/science/2007/m. stal/c 3. pdf • [POSA 2]: Pattern-Oriented Software Architecture – Volume 2: Patterns for Concurrent and Networked Objects, Wiley, 2000. http: //www. cs. wustl. edu/~schmidt/POSA 2/
Exercitiu • Implementarea unui broker foarte simplu, gen “jucarie” Toy-Object. Request. Broker – Se furnizeaza implementari pentru suportul de comunicare in retea la nivel de transport de octeti (Byte. Sender/Receiver sau Requester/Replyer) • Descarcati Byte. Communication. zip de pe pagina cursului si incercati exemplele ! – Exemplul 1: Server. With. SR, Client. With. SR – Exemplul 2: Server. With. RR, Client. With. RR – Implementarea nu va folosi alte tehnologii de Middleware – Detalii cerinte => Tema 3 laborator http: //bigfoot. cs. upt. ro/~ioana/arhit/laborator. html
Toy. ORB: un client • Este de dorit ca utilizand Toy. ORB, Stock. Market. Client: main sa contina in principiu urmatoarele: Stock. Market obj. Ref=(Stock. Market) Toy. ORB. get. Object. Reference(“NASDAQ”); float price=obj. Ref. get_price(“ABC SRL”); Reprezinta operatia send_request din Patternul Broker asa cum e definit in POSA/Fig. pg. 109 • Cauta adresa unui obiect inregistrat sub numele NASDAQ • Creaza si returneaza un obiect de tip Stock. Market. Client. Side. Proxy. get_price trimite catre Stock. Market. Server. Side. Proxy parametrul operatiei (numele companiei cotate la bursa) si receptioneaza rezultatul (pretul curent)
Toy. ORB: un server • Este de dorit ca utilizand Toy. ORB, Stock. Market. Server: main sa contina in principiu urmatoarele: Stock. Market obj=new Stock. Market. Impl Toy. ORB. register (obj, Stock. Market, “NASDAQ”); • Inregistreaza obj creat, care implementeaza serviciul Stock. Market si are numele NASDAQ • Creaza un obiect de tip Stock. Market. Server. Proxy care intra in asteptarea cererilor de la clienti
Toy. ORB: Varianta Forwarder-Receiver 2 canale de comunicatie diferite, unul pentru transmis parametri, unul pentru transmiterea rezultatului deliver ( marshal ( “ABC SRL” ) unmarshal ) receive Stock. Market Client. Proxy F R R receive ( unmarshal ( 1234. 5 ) marshal ) deliver Dezavantaj: tiparul F-R presupune participanti cu statut egal => ar trebui ca si clientii sa se inregistreze (sau ORB sa le asigneze un nr de port in mod transparent) Toy. ORB Naming. Service Config. db “Stock. Market. Client”: IP, Port “NASDAQ”: IP, Port F Stock. Market Server. Proxy
Toy. ORB: Varianta Requester-Replyer Stock. Market Client. Proxy Marshaller Stock. Market Server. Proxy Marshaller deliver_and_wait_feedback Requester receive_transform_and_send_feedback Replyer Toy. ORB Naming. Service deliver_and_wait_feedback: deliver cererea urmata de receptia rezultatului pe acelasi canal de comunicatie (socket) Config. db “NASDAQ”: IP, Port receive_transform_and_ send_feedback: receive cererea urmata de transmiterea rezultatului pe acelasi canal de comunicatie
Toy. ORB: Implementare Proxy-uri send_request Stock. Market. Client. Side. Proxy: • • • Are un Requestor r Are un Marshaller m Pentru a rezolva operatia get_price: pack_data – Cu ajutorul lui m – marshal, transforma parametri de intrare(numele companiei) intr-un sir de octeti forward_ – Cu ajutorul lui r deliver_and_wait_feedback, request transmite catre Server. Side. Proxy sirul de octeti parametru si receptioneaza un sir de octeti reprezentand rezultatul – Cu ajutorul lui m - unmarshal, unpack_data transforma sirul de octeti obtinut in valoarea rezultatului (pretul) Cu text rosu italics sunt identificate operatiile prin numele cu care apar in Pattern-ul Broker call_service Stock. Market. Server. Side. Proxy: • • • Are un Replyer r Il cunoaste pe Stock. Market. Impl s Are un Transformer t : primeste un sir de octeti si returneaza sirul de octeti transformat • Pentru a realiza operatia get_price de ori de cate ori este solicitat: While (true) r. receive_transform_and_send_feedback(t(s)); – Receptioneaza sirul de octeti reprezentand parametrii, t(s) il transforma in sir de octeti de forward_ tip rezultat, care vor fi transmisi inapoi la response client Server. Transformer: • • Are un Marshaller m Pentru a rezolva transformarea: – cu ajutorul lui m – unmarshal, reconstruieste unpack_data parametri de intrare (numele companiei) – Apeleaza operatia de la Stock. Market. Impl s si obtine rezultatul run_service – Cu ajutorul lui m - marshal, transforma pack_data rezultatul (pretul) in sir de octeti
Toy. ORB: suport pt servere mai complexe • • Este de dorit ca sa se poata accesa la distanta si obiecte care implementeaza interfete mai complexe (cu mai multe operatii). De exemplu: public interface Complex. Stock. Market { float get_price (String Company); String whois_highest_today(); String whois_lowest_today(); } In acest caz, un client va putea accesa serviciile la distanta in felul urmator: Complex. Stock. Market obj. Ref=(Complex. Stock. Market) Toy. ORB. get. Object. Reference(“NASDAQ”); float price=obj. Ref. get_price(“ABC SRL”); String junk=obj. Ref. whois_lowest_today(); Pentru aceasta, Client. Side. Proxy trebuie sa includa in sirul de octeti produs la operatia marshal si informatia referitoare la ce operatie s-a cerut. Server. Side. Proxy va deduce in operatia unmarshal despre ce operatie este vorba
Toy. ORB: Atentie la dependente ! • Toy. ORB trebuie sa poata fi folosit pentru orice tip de aplicatii (Stock. Market, Complex. Stock. Market, Info. Server, Math. Server, etc – si orice alt tip, necunoscut la momentul crearii Toy. ORB) • Toy. ORB nu poate sa depinda deloc de cod specific aplicatiilor ! – Marshaller: trebuie sa poata transforma in bytes orice combinatie de parametrii – Toy. ORB. get. Object. Reference(String Server. Name) trebuie sa poata sa creeze si returneze un obiect proxy client corespunzator tipului aplicatiei (Stock. Market. Client. Side. Proxy, Math. Server. Client. Side. Proxy, Info. Server. Client. Side. Proxy, etc), dar fara sa depinda de aceasta ! • Posibila solutie: utilizarea Reflection pentru crearea obiectului de tipul corespunzator
Scenarii de localizare a serverelor Toy. ORB. get. Object. Reference(“NASDAQ”); Stock. Market. Impl NASDAQ Stock. Market. Client 1 Stock. Market. Client 2 Stock. Market. Impl NIKKEI Toy. ORB. get. Object. Reference(Stock. Market); Toy. ORB. get. Object. Reference(“Timis. Info”) Info. Client 1 Info. Server. Impl Timis. Info
Scenarii de localizare a serverelor Stock. Market. Impl NASDAQ Stock. Market. Client 1 Stock. Market. Impl NIKKEI Stock. Market. Client 2 Info. Client 1 Naming. Service Address 127. 0. 0. 1, 1111 Naming. Service NASDAQ, Stock. Market, 127. 0. 0. 1, 1112 NIKKEI, Stock. Market, 127. 0. 0. 1, 1113 Timis. Info, Info. Server, 127. 001, 1114 Info. Server. Impl Timis. Info
Scenarii de utilizare: Inregistrare Server Stock. Market. Impl NASDAQ Toy. ORB. register Requester ip t de Naming. Service Address Q A 112 D 127. 0. 0. 1, 1111 AS. 1, 1 N a. 0. 0 z rea 127 t s gi esa e r Replyer In adr Naming. Service La NASDAQ, Stock. Market, 127. 0. 0. 1, 1112 t ck o t S rke a M
Scenarii de utilizare: Serverul ready Stock. Market. Impl NASDAQ Stock. Market. Client 1 Stock. Market. Server. Proxy Replyer Naming. Service Address 127. 0. 0. 1, 1111 Replyer Naming. Service NASDAQ, Stock. Market, 127. 0. 0. 1, 1112
Scenarii de utilizare: get. Object. Reference Stock. Market. Impl NASDAQ Stock. Market. Client 1 Stock. Market. Server. Proxy Replyer Toy. ORB. get. Object. Ref Requester Adr esa 111 2 Naming. Service Address 127. 0. 0. 1, 1111 NA SD AQ ? Replyer Naming. Service NASDAQ, Stock. Market, 127. 0. 0. 1, 1112
Scenarii de utilizare: s-a obtinut referinta Stock. Market. Impl NASDAQ Stock. Market. Client 1 Stock. Market. Server. Proxy Stock. Market. Client. Proxy Replyer Requester Naming. Service Address 127. 0. 0. 1, 1111 Replyer Naming. Service NASDAQ, Stock. Market, 127. 0. 0. 1, 1112
Toy. ORB: Implementare Naming. Service • Naming. Service mai complex (Trader): – Localizarea unui obiect la distanta se face dupa numele sau (“NASDAQ”) – Localizarea unui obiect la distanta se face dupa descrierea serviciului pe care il furnizeaza (Stock. Market) -> se obtine o referinta spre unul din obiectele inregistrate ca furnizand acest serviciu • Implementarea Naming. Service: sub forma de server care o adresa fixa cunoscuta de catre Toy. ORB – Toy. ORB: get. Object. Reference – Toy. ORB: register Interactioneaza fiecare cu Naming. Service dupa tiparul Requester-Replyer
Scopul unui ORB • Un Object Request Broker este o infrastructura pentru dezvoltarea de aplicatii distribuite: • Se refoloseste ca infrastructura in MULTE aplicatii DIFERITE, NECUNOSCUTE dezvoltatorului sau! • Consecinte: – Esential: ORB NU poate depinde in nici un fel de cod specific acestor aplicatii – Pentru cresterea “usability”: este de dorit ca Broker-ul sa sprijine dezvoltatorul de aplicatii si in problema scrierii proxy-urilor • Tool-uri pentru generarea automata a proxy-urilor
Toy. ORB: Generarea automata a proxy-urilor • Punct de start: scrieti manual proxy-urile pentru cel putin 2 aplicatii diferite, pentru a identifica un Template comun
Toy. ORB: Implementare Proxy-uri Stock. Market send_request Stock. Market. Client. Side. Proxy: • • • Are un Requestor r Are un Marshaller m Pentru a rezolva operatia get_price: pack_data – Cu ajutorul lui m – marshal, transforma parametri de intrare(numele companiei) intr-un sir de octeti forward_ – Cu ajutorul lui r deliver_and_wait_feedback, request transmite catre Server. Side. Proxy sirul de octeti parametru si receptioneaza un sir de octeti reprezentand rezultatul – Cu ajutorul lui m - unmarshal, unpack_data transforma sirul de octeti obtinut in valoarea rezultatului (pretul) Cu text rosu italics sunt identificate operatiile prin numele cu care apar in Pattern-ul Broker call_service Stock. Market. Server. Side. Proxy: • • • Are un Replyer r Il cunoaste pe Stock. Market. Impl s Are un Transformer t : primeste un sir de octeti si returneaza sirul de octeti transformat • Pentru a realiza operatia get_price de ori de cate ori este solicitat: While (true) r. receive_transform_and_send_feedback(t(s)); – Receptioneaza sirul de octeti reprezentand parametrii, t(s) il transforma in sir de octeti de forward_ tip rezultat, care vor fi transmisi inapoi la response client Server. Transformer: • • Are un Marshaller m Pentru a rezolva transformarea: – cu ajutorul lui m – unmarshal, reconstruieste unpack_data parametri de intrare (numele companiei) – Apeleaza operatia de la Stock. Market. Impl s si obtine rezultatul run_service – Cu ajutorul lui m - marshal, transforma pack_data rezultatul (pretul) in sir de octeti
Toy. ORB: Template-uri pentru proxy • • Se presupune un server cu interfata Service. XClient. Side. Proxy: – Class Service. XClient. Side. Proxy implements Service. X – Fiecare operatie definita in interfata Service. X este implementata in felul urmator: • • Creaza mesajul (marshal): numele operatiei, (numarul si tipurile parametrilor), valorile parametrilor Deliver_and_wait_feedback Extrage din mesajul de raspuns valoarea rezultatului (conform tipului returnat de operatie) si o returneaza Observatie: – Service. XClient. Side. Proxy este o clasa care implementeaza interfata Service. X ! – Varianta 1 (general aplicabila): tipul Service. X este cunoscut de dinainte, Codul pentru Service. XClient. Side. Proxy este generat automat in faza de design si este instalat pe calculatorul clientului (Exemple: CORBA, RMI in java 1. 1) – Varianta 2 (pentru tehnologii care suporta dynamic class loading): codul pentru Service. XClient. Side. Proxy este generat automat, dar nu trebuie pre-instalat pe fiecare calculator client de dinainte, ci poate fi download-at dinamic la runtime (Exemplu RMI) – Varianta 3 (pentru tehnologii care suporta forme de run time code generation - dynamic proxy): codul clasei Service. XClient. Side. Proxy este generat automat la runtime (nu trebuie utilizate tool-uri de generare in faza de design), (Exemple: RMI in java dupa 1. 5 si. NET Remoting)
Toy. ORB: Template-uri pentru proxy (cont) • Se presupune un server cu interfata Service. X • Service. XServer. Side. Proxy: – Class Service. XServer. Side. Proxy: • are o referinta la obiectul server Server. XImpl • Contine “server-loop” (while (true) receive_transform_sendfeedback) – Class Service. XServer. Transformer implements Server. Transformer • Primeste referinta la obiectul server Server. XImpl • Extrage din mesajul primit (unmarshal) numele operatiei si valorile parametrilor • Invoca operatia pe obiectul server – Varianta 1: secventa de cod de tip “switch-case” (Java 1. 1, CORBA) – Varianta 2: prin Reflection -> nu mai depinde de tipul Service. X -> devine un Server. Side. Proxy generic (Java 1. 2, . NET) • Creaza mesajul de raspuns(marshal) cu rezultatul invocarii operatiei
Toy. ORB: Generarea automata a proxy-urilor • Posibilitati de generare automata a proxy-urilor: – In mod diferit in RMI, CORBA, . NETRemoting • RMI-style (in varianta java. rmi. server. ignore. Stub. Classes = false): – Tool de generare (echivalent lui rmic) • Intrare: Implementarea obiectului remote (class). Poate fi analizat prin reflection. • Iesire: fisiere sursa proxy-uri (denumite dupa o conventie de numire), care vor fi compilate si link-uite cu clientul respectiv serverul • CORBA-style: – Tool de generare (echivalent lui idl 2 java) • Intrare: Interfata obiectului remote. Poate fi analizata cu parsing de text. • Iesire: ca si in cazul anterior, fisiere sursa proxy-uri (denumite dupa o conventie de numire), care vor fi compilate si link-uite cu clientul respectiv serverul
Toy. ORB: Generarea automata a proxy-urilor (cont) • Posibilitati de generare automata a proxy-urilor: – In mod diferit in RMI, CORBA, . NETRemoting • . NET Remoting-style sau RMI (in varianta java. rmi. server. ignore. Stub. Classes =true) – Existenta Proxy-urilor este complet transparenta pentru dezvoltatorul de aplicatii • Broker-ul creaza in mod dinamic clasele pentru proxy-uri si apoi le instantiaza – Dynamic proxy » Java. lang. reflect. Proxy http: //download. oracle. com/javase/1. 3/docs/guide/reflection/proxy. html » . NET emit http: //msdn. microsoft. com/en-us/library/5 kyyyeh 2. aspx
- Slides: 55