Download presentation
Presentation is loading. Please wait.
1
Broker in practica: Middleware
Tool Generare Proxy-uri Biblioteca(API)+ Executabile Application Developer
2
Exercitiu Implementarea unui broker foarte simplu, de “jucarie” - Toy-ObjectRequestBroker Se furnizeaza implementari pentru suportul de comunicare in retea la nivel de transport de octeti (ByteSender/Receiver sau Requester/Replyer) Descarcati ByteCommunication.zip de pe pagina cursului si incercati exemplele ! Exemplul 1: ServerWithSR, ClientWithSR Exemplul 2: ServerWithRR, ClientWithRR Implementarea nu va folosi alte tehnologii de Middleware Detalii cerinte => Tema 3 laborator
3
Cerinte ToyORB Scopul ToyORB este sa ofere support dezvoltatorilor de aplicatii distribuite (precum o face, de exemplu, unul dintre “competitorii” sai, Java RMI) ToyORB consta din: O biblioteca oferita dezvoltatorului de aplicatii, care va fi utilizata pentru implementarea programelor client si server a aplicatiei (omologul lui java.Remote) Un executabil tip server, Naming Service, care este necesar pentru deploymentul si rularea aplicatiilor dezvoltate peste ToyORB (omologul lui rmiregistry) . Pentru implementarea lui se poate folosi suportul dat in ByteCommunication Optional, contine tool-uri sau implementeaza alte metode prin care degreveaza dezvoltatorul de aplicatii de sarcina scrierii manuale a proxy-urilor
4
Dezvoltarea unei aplicatii folosind ToyORB
1. Definire interfata obiect la distanta INTERFACE StockMarket float get_price(Company) 2. Implementare obiect 4. Implementare Server 5. Implementare Client StockMarketServer StockMarketClient StockMarketImpl 3. Generare Proxy Scriere manuala in varianta simpl 3. Generare Proxy/ Scriere manuala in varianta simpla 6. Rulare aplicatie StockMarket ClientSide PROXY StockMarket ServerSide PROXY Broker
5
Cerinte ToyORB (2) Peste ToyORB, se vor dezvolta diverse aplicatii, una dintre ele poate fi de ex aplicatia StockMarket. Codul sursa al unei aplicatii StockMarket, dezvoltata peste ToyORB, contine: Interfata obiectului la distanta StockMarket.java Implementarea obiectului la distanta StocMarketImpl.java Implementarea programului client, StockMarketClient,java Implementarea programului server, StockMarketServer.java Implementarea StockMarketClientSideProxy.java (* in varianta standard a cerintelor, si aceasta clasa se scrie manual; in variantele extinse se implementeaza masuri astfel incat sa nu se scrie manual) Implementarea StockMarketServerSideProxy.java (* in varianta standard a cerintelor, si aceasta clasa se scrie manual; in variantele extinse se implementeaza masuri astfel incat sa nu se scrie manual)
6
ToyORB - Pas1. Definire interfata
Se defineste interfata StockMarket, ca o interfata normala Aceasta exporta operatia get_price: Parametru: numele companiei cotate la bursa Rezultat: valoarea actiunilor public interface StockMarket { float get_price (String Company) } Fisier StockMarket.java
7
ToyORB - Pas 2. Implementare Obiect
Se implementeaza clasa StockMarketImpl, ca o clasa normala Aceasta realizeaza operatia get_price public class StockMarketImpl implements StockMarket { public StockMarketImpl() {} public float get_price(String company) { float price=12345; return price; } Fisier StockMarketImpl.java
8
ToyORB - Pas 4. Implementare Server
Se implementeaza un program StockMarketServer, care creaza un obiect de tip StockMarket, ce poate fi accesat de la distanta Obiectul creat este inregistrat sub numele “NASDAQ” import toyORB.*; public class StockMarketServer { public static void main(String[] args) { StockMarketImpl stockMarketImpl = new StockMarketImpl(); ToyORB.register("NASDAQ", stockMarketImpl ); }} } Specific ToyORB: ToyORB.register: Obiectul StockMarket este inregistrat la Naming Service cu numele “Nasdaq”, Se primeste de undeva nr portului la care va asculta serverul Se creaza instant lui serverside proxy si se invoca metoda de start a acestuia Fisier StockMarketServer.java
9
ToyORB - Pas 5. Implementare Client
Se implementeaza un program StockMarketClient, care acceseaza un obiect de tip StockMarket aflat la distanta, si invoca operatia get_price pentru un nume de companie Prin intermediul Broker se localizeaza obiectul cu numele “NASDAQ” import toyORB.*; public class StockMarketClient { public static void main(String[] args) { StockMarket market= (StockMarket) ToyORB.getObjectRef("NASDAQ"); float price=market.get_price("ABC SRL"); System.out.println("Price is "+price); } Specific ToyORB: ToyORB.getObjectReference Se interogheaza Naming service pentru adresa serverului se returneaza o referinta (o instanta a lui client side proxy de fapt) la obiectul server care a fost inregistrat ca “Nasdaq” Fisier StockMarketClient.java
10
ToyORB - Pas 3. Versiunea 0: Scriere manuala proxy-uri
Cerinta standard: se vor implementa manual clasele: StockMarketClientSideProxy.java StockMarketSErverSideProxy.java Se poate folosi suportul ByteCommunication (Requester-Replyer) in implementarea acestor clase
11
ToyORB – To Do Checklist pentru dezvoltarea aplicatiei StockMarket:
Cod sursa scris de programatorul aplicatiei Stockmarket: StockMarket.java, StockMarketImpl.java, StockMarketServer.java, StockMarketClient.java (**) StockMarketClientSideProxy.java, StockMarketServerSideProxy.java Deployment Server: StockMarket.class, StockMarketImpl.class, StockMarketServerSideProxy.class, StockMarketServer.class Deployment Client: StockMarket.class, StockMarketClientSideProxy.class, StockMarketClient.class
12
ToyORB - Pas 6. Rulare aplicatie
> start ToyORBNamingService > start java StockMarketServer > java StockMarketClient
13
ToyORB: Varianta Forwarder-Receiver
2 canale de comunicatie diferite, unul pentru transmis parametri, unul pentru transmiterea rezultatului StockMarket ClientProxy deliver ( marshal ( “ABC SRL” ) unmarshal ) receive StockMarket ServerProxy F R receive ( unmarshal ( ) marshal ) deliver R F ToyORB NamingService 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) Config.db “StockMarketClient”: IP, Port “NASDAQ”: IP, Port
14
ToyORB: Varianta Requester-Replyer
StockMarket ClientProxy StockMarket ServerProxy Marshaller Marshaller deliver_and_wait_feedback Replyer Requester receive_transform_and_send_feedback ToyORB NamingService deliver_and_wait_feedback: deliver cererea urmata de receptia rezultatului pe acelasi canal de comunicatie (socket) receive_transform_and_send_feedback: receive cererea urmata de transmiterea rezultatului pe acelasi canal de comunicatie Config.db “NASDAQ”: IP, Port
15
ToyORB: Implementare Proxy-uri
call_service send_request StockMarketServerSideProxy: Are un Replyer r Il cunoaste pe StockMarketImpl 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 tip rezultat, care vor fi transmisi inapoi la client ServerTransformer: Are un Marshaller m Pentru a rezolva transformarea: cu ajutorul lui m – unmarshal, reconstruieste parametri de intrare (numele companiei) Apeleaza operatia de la StockMarketImpl s si obtine rezultatul Cu ajutorul lui m - marshal, transforma rezultatul (pretul) in sir de octeti StockMarketClientSideProxy: Are un Requestor r Are un Marshaller m Pentru a rezolva operatia get_price: Cu ajutorul lui m – marshal, transforma parametri de intrare(numele companiei) intr-un sir de octeti Cu ajutorul lui r - deliver_and_wait_feedback, transmite catre ServerSideProxy sirul de octeti parametru si receptioneaza un sir de octeti reprezentand rezultatul Cu ajutorul lui m - unmarshal, transforma sirul de octeti obtinut in valoarea rezultatului (pretul) pack_data forward_ request forward_ response unpack_data unpack_data Cu text rosu italics sunt identificate operatiile prin numele cu care apar in Pattern-ul Broker run_service pack_data
16
ToyORB: 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 ComplexStockMarket { 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: ComplexStockMarket objRef=(ComplexStockMarket) ToyORB.getObjectReference(“NASDAQ”); float price=objRef.get_price(“ABC SRL”); String junk=objRef.whois_lowest_today(); Pentru aceasta, ClientSideProxy trebuie sa includa in sirul de octeti produs la operatia marshal si informatia referitoare la ce operatie s-a cerut. ServerSideProxy va deduce in operatia unmarshal despre ce operatie este vorba
17
ToyORB: Atentie la dependente !
ToyORB trebuie sa poata fi folosit pentru orice tip de aplicatii (StockMarket, ComplexStockMarket, InfoServer, MathServer, etc – si orice alt tip, necunoscut la momentul crearii ToyORB) ToyORB nu poate sa depinda deloc de cod specific aplicatiilor ! Marshaller: trebuie sa poata transforma in bytes orice combinatie de parametrii ToyORB.getObjectReference(String ServerName) trebuie sa poata sa creeze si returneze un obiect proxy client corespunzator tipului aplicatiei (StockMarketClientSideProxy, MathServerClientSideProxy, InfoServerClientSideProxy, etc), dar fara sa depinda de aceasta ! Posibila solutie: utilizarea Reflection pentru crearea obiectului de tipul corespunzator
18
Scenarii de localizare a serverelor
ToyORB.getObjectReference(“NASDAQ”); StockMarketImpl NASDAQ StockMarketClient1 StockMarketImpl NIKKEI StockMarketClient2 ToyORB.getObjectReference(StockMarket); InfoServerImpl TimisInfo ToyORB.getObjectReference(“TimisInfo”) InfoClient1
19
Scenarii de localizare a serverelor
StockMarketImpl NASDAQ StockMarketClient1 StockMarketImpl NIKKEI StockMarketClient2 InfoServerImpl TimisInfo NamingService Address , 1111 InfoClient1 NamingService NASDAQ, StockMarket, ,1112 NIKKEI, StockMarket, ,1113 TimisInfo, InfoServer, ,1114
20
Scenarii de utilizare: Inregistrare Server
StockMarketImpl NASDAQ ToyORB.register Requester NamingService Address , 1111 Inregistreaza NASDAQ de tip StockMarket La adresa , 1112 Replyer NamingService NASDAQ, StockMarket, , 1112
21
Scenarii de utilizare: Serverul ready
StockMarketImpl NASDAQ StockMarketClient1 StockMarketServerProxy Replyer NamingService Address , 1111 Replyer NamingService NASDAQ, StockMarket, , 1112
22
Scenarii de utilizare: getObjectReference
StockMarketImpl NASDAQ StockMarketClient1 StockMarketServerProxy Replyer ToyORB.getObjectRef Requester NamingService Address , 1111 1112 Adresa NASDAQ ? Replyer NamingService NASDAQ, StockMarket, , 1112
23
Scenarii de utilizare: s-a obtinut referinta
StockMarketImpl NASDAQ StockMarketClient1 StockMarketServerProxy StockMarketClientProxy Replyer Requester NamingService Address , 1111 Replyer NamingService NASDAQ, StockMarket, , 1112
24
ToyORB: Implementare NamingService
NamingService 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 (StockMarket) -> se obtine o referinta spre unul din obiectele inregistrate ca furnizand acest serviciu Implementarea NamingService: sub forma de server care are o adresa fixa cunoscuta de catre ToyORB ToyORB:getObjectReference ToyORB:register Interactioneaza fiecare cu NamingService dupa tiparul Requester-Replyer
25
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
26
ToyORB: Generarea automata a proxy-urilor
Punct de start: scrieti manual proxy-urile pentru cel putin 2 aplicatii diferite, pentru a identifica un Template comun
27
ToyORB: Implementare Proxy-uri StockMarket
call_service send_request StockMarketServerSideProxy: Are un Replyer r Il cunoaste pe StockMarketImpl 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 tip rezultat, care vor fi transmisi inapoi la client ServerTransformer: Are un Marshaller m Pentru a rezolva transformarea: cu ajutorul lui m – unmarshal, reconstruieste parametri de intrare (numele companiei) Apeleaza operatia de la StockMarketImpl s si obtine rezultatul Cu ajutorul lui m - marshal, transforma rezultatul (pretul) in sir de octeti StockMarketClientSideProxy: Are un Requestor r Are un Marshaller m Pentru a rezolva operatia get_price: Cu ajutorul lui m – marshal, transforma parametri de intrare(numele companiei) intr-un sir de octeti Cu ajutorul lui r - deliver_and_wait_feedback, transmite catre ServerSideProxy sirul de octeti parametru si receptioneaza un sir de octeti reprezentand rezultatul Cu ajutorul lui m - unmarshal, transforma sirul de octeti obtinut in valoarea rezultatului (pretul) pack_data forward_ request forward_ response unpack_data unpack_data Cu text rosu italics sunt identificate operatiile prin numele cu care apar in Pattern-ul Broker run_service pack_data
28
ToyORB: Template-uri pentru proxy: Client Side Proxy
Se presupune un server cu interfata ServiceX ServiceXClientSideProxy: Class ServiceXClientSideProxy implements ServiceX Fiecare operatie definita in interfata ServiceX 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
29
ToyORB: Generare Client Side Proxy
ServiceXClientSideProxy este o clasa care implementeaza interfata ServiceX, deci depinde de aplicatie ! Pentru a genera Client Side Proxy: Varianta1 (general aplicabila): tipul ServiceX este cunoscut de dinainte, Codul pentru ServiceXClientSideProxy este generat in faza de design cu ajutorul unui tool si este instalat pe calculatorul clientului (Exemple: CORBA, RMI in java < 1.5) Tool-ul de generare ia ca input descrierea interfetei ServiceX si genereaza cod sursa care apoi e compilat Varianta 2 (pentru tehnologii care suporta forme de run time code generation - dynamic proxy): codul clasei ServiceXClientSideProxy este generat automat la runtime (nu trebuie utilizate tool-uri de generare in faza de design), (Exemple: RMI in java dupa1.5 si .NET Remoting)
30
ToyORB: Template-uri pentru proxy: Server Side Proxy
Se presupune un server cu interfata ServiceX ServiceXServerSideProxy: Class ServiceXServerSideProxy: are o referinta la obiectul server ServerXImpl Contine “server-loop” (while (true) receive_transform_sendfeedback) Class ServiceXServerTransformer implements ServerTransformer Primeste referinta la obiectul server ServerXImpl 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 ServiceX -> devine un ServerSideProxy generic (Java 1.2, .NET) Creaza mesajul de raspuns(marshal) cu rezultatul invocarii operatiei
31
ToyORB: Generare Server Side Proxy
Clasa ServiceXServerTransformer este cea care depinde de aplicatie in masura in care trebuie sa cunoasca metodele din interfata remote Varianta1 (general aplicabila): se genereaza cod sursa pentru aceasta clasa, care va contine o secventa de cod de tip “switch-case” cu cate un caz ptr fiecare operatie posibila Varianta2 (aplicabila daca limbajul in care e implementat obiectul server suporta reflection): exista o clasa unica, generala, valabila ptr orice aplicatie, care inlocuieste swich-case-ul cu invocarea operatiei corespunzatoare prin reflection
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.