Broker [POSA]-Fig/P.107.

Slides:



Advertisements
Similar presentations
1 Advanced Programming Topics - II Objectives:  Background  Remoting  Types of remoting  Marshalling  Farmatters  Channels.
Advertisements

Remote Method Invocation Chin-Chih Chang. Java Remote Object Invocation In Java, the object is serialized before being passed as a parameter to an RMI.
PROGRAMUL CADRU 7 Cum să folosim facilitatea CORDIS: “Search for partners”
Introduction to Remote Method Invocation (RMI)
Spring/2002 Distributed Software Engineering C:\unocourses\4350\slides\DefiningThreads 1 RMI.
RMI remote method invocation. Traditional network programming The client program sends data to the server in some intermediary format and the server has.
RMI Remote Method Invocation Distributed Object-based System and RPC Together 2-Jun-16.
Distributed Objects and Middleware. Sockets and Ports Source: G. Coulouris et al., Distributed Systems: Concepts and Design.
 Remote Method Invocation  A true distributed computing application interface for Java, written to provide easy access to objects existing on remote.
Remote Method Invocation RMI architecture stubs and skeletons for remote services RMI server and client in Java Creating an RMI Application step-by- step.
Java RMI. RMI Any object whose methods can be invoked from another Java VM is called a remote object.
Presentation 24 Ultra Simple.NET Remoting to CORBA bridge.
Netprog Java RMI1 Remote Method Invocation.
Broker in practice: Middleware
Broker in practice: Middleware
What is RMI? Remote Method Invocation
Course contents Basic concepts Fundamental architectural styles
Remote Method Invocation
Februarie 2018 ASE Bucuresti
IntraShip inovatie, flexibilitate, rapiditate.
Funcţii Excel definite de utilizator (FDU) în VBA
Instrumente CASE Curs nr. 7.
Căutarea şi regăsirea informaţiei.
SOFTWARE Tipuri de software.
PASII INSTALARII SISTEMULUI DE OPERARE
Dispozitive de stocare
Arhitectura serviciilor web
Căutarea şi regăsirea informaţiei.
Paxos Made Simple Autor: Puşcaş Radu George
Primirea si procesarea cererilor
Broker in practica: Middleware
Gestionarea datelor stiintifice
Structura bazei de date MS Access
Retele de calculatoare
Software product management
CONVERSII INTRE SISTEME DE NUMERATIE
WebSite Social Tema 2 WebSite Social.
Crearea si gazduirea serviciilor
Tipuri structurate Tipul tablou
SUBNETAREA.
C# şi platforma .NET.
Web Form BuilDer Coffee Cup.
UPB ETTI IISC Web Interactiv Floroiu Andrei.
Funcții C/C++ continuare
prof. mrd. Negrilescu Nicolae Colegiul National Vlaicu Voda
Apache WEB Server.
Continutul cursului Conceptul de arhitectura software
Crearea si gazduirea serviciilor
INTERNET SERVICII INTERNET.
Forms (Formulare).
A great way to create a channel of communication
Functia de documentare
Continutul cursului Conceptul de arhitectura software
Broker in practica: Middleware
SOAP -Simple Object Access Protocol-
Dezvoltarea aplicaţiilor WEB
Configurarea, deployment-ul automat si testarea serviciilor
Broker in practica: Middleware
Programarea in limbajul Java 2004 Lecturer: Gavrila Cristian
Realizarea prezentarilor cu Microsoft PowerPoint
Software open source in industria software
Sisteme distribuite Continutul capitolului:
Crearea unei aplicatii Windows Forms simple
Stiluri / tipare arhitecturale
Harti de imagini, Cadre, Stiluri
Broker in practica: Middleware
Tabele WEB.
Remote method invocation (RMI)
CS 584 Lecture 18 Assignment Glenda assignment extended to the Java RMI Deadline No Java RMI Assignment Test Friday, Saturday, Monday.
Java Remote Method Invocation
Presentation transcript:

Broker [POSA]-Fig/P.107

Brokerul rezolva o cerere Client-Server [POSA]-Fig/P.109

Variante de Broker Indirect Broker: Direct Broker: realizeaza o comunicatie indirecta intre client si server: orice comunicatie intre client si server este transmisa prin intermediul Broker-ului Corespunde cu varianta prezentata in scenariul general din diagrama de colaborari anterioara Direct Broker: Clientul poate comunica direct cu Server-ul, dupa ce conexiunea a fost realizata prin intermediul Broker => creste eficienta comunicatiei Operatiile descrise in diagrama anterioara raman valabile ca principiu si secventa dar sunt rearondate intre Proxy-uri si Broker: Proxy-urile vor prelua operatiile forward_request si forward_response de la Broker

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 RMI Server Client implements Remote Interface Remote Object uses implements Stub (ClientSide Proxy) Skeleton (ServerSide Proxy) Remote Reference Layer Transport Layer

ORB (Object Request Broker) Arhitectura CORBA Server Client Remote Interface IDL Remote Object Dynamic Invocation Interface IDL Stub (ClientSide Proxy) IDL Skeleton (ServerSide Proxy) Object Adapter ORB Interface Implem Repository Interface Repository ORB (Object Request Broker)

.NET Remoting Architecture Server Client Remote Interface Remote Object TransparentProxy RealProxy Remoting system Remoting system Channel

Exemplu Aplicatie distribuita simpla: realizarea unui sistem StockMarket, 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 StockMarket float get_price(Company) 2. Implementare obiect 4. Implementare Server 5. Implementare Client StockMarketServer StockMarketClient StockMarketImpl 6. Rulare aplicatie 3. Generare Proxy 3. Generare Proxy StockMarket ClientSide PROXY StockMarket ServerSide PROXY Broker

RMI - Pas1. Definire interfata Se defineste interfata StockMarket Aceasta exporta operatia get_price: Parametru: numele companiei cotate la bursa Rezultat: valoarea actiunilor package SimpleStocks; import java.rmi.*; public interface StockMarket extends java.rmi.Remote { float get_price (String Company) throws RemoteException; } Specific RMI: Interfata trebuie sa extinda java.rmi.Remote Metodele trebuie sa poata genera exceptii RemoteException Fisier StockMarket.java

RMI - Pas 2. Implementare Obiect Se implementeaza clasa StockMarketImpl Aceasta realizeaza operatia get_price import java.rmi.*; import java.rmi.server.UnicastRemoteObject; public class StockMarketImpl extends UnicastRemoteObject implements StockMarket { public StockMarketImpl() throws RemoteException {} public float get_price(String company) { float price=12345; return price; } Specific RMI: Implementarea trebuie sa extinda UnicastRemoteObject Fisier StockMarketImpl.java

RMI - Pas 3. Generare Proxy-uri RMI Stub/Skeleton Se genereaza automat din implementarea obiectului server >rmic StockMarketImpl.java Rezulta clase pentru stub-uri: StockMarketImpl_Stub.class

RMI - 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 java.rmi.*; import SimpleStocks.*; public class StockMarketServer { public static void main(String[] args) { try { StockMarketImpl stockMarketImpl = new StockMarketImpl(); Naming.rebind("NASDAQ", stockMarketImpl ); } catch (Exception e) {} } Specific RMI: Naming Fisier StockMarketServer.java

RMI - 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 java.rmi.*; import SimpleStocks.*; public class StockMarketClient { public static void main(String[] args) { try { StockMarket market= (StockMarket) Naming.lookup("rmi://localhost/NASDAQ"); float price=market.get_price("ABC SRL"); System.out.println("Price is "+price); } catch (Exception e) { System.out.println("Exception !");} } Specific RMI: Naming.lookup Fisier StockMarketClient.java

RMI - Pas 6. Rulare aplicatie RMI Registry = non-persistent Naming Service > start rmiregistry > [start rmid] > start java StockMarketServer > start java StockMarketClient RMI Activation Daemon (nu e necesar pentru exemplu) Codul aplicatiei exemplu poate fi download-ad de pe pagina cursului, de la sectiunea de exemple de cod pentru cursul c4: RMI_StockMarket

CORBA - Pas1. Definire interfata module SimpleStocks { interface StockMarket { float get_price(in string Company); }; Se defineste interfata StockMarket Aceasta exporta operatia get_price: Parametru: numele companiei cotate la bursa Rezultat: valoarea actiunilor Specific CORBA: Interfata se defineste intr-un limbaj neutru, CORBA IDL Fisier StockMarket.idl

CORBA - Pas 2. Generare Proxy-uri CORBA IDL Stub/Skeleton Se genereaza automat din definitia interfetei IDL > idl2java StockMarket.idl Rezulta clasele/fisierele: Client Stub: _st_StockMarket.java Server Stub: _StockMarketImplBase.java

CORBA - Pas 3. Implementare Obiect Se implementeaza clasa StockMarketImpl Aceasta realizeaza operatia get_price import org.omg.CORBA.*; import SimpleStocks.*; public class StockMarketImpl extends _StockMarketImplBase { public float get_price(in string company) { float price=12345; return price; } public StockMarketImpl (String name) { super(name); Specific CORBA: Un obiect accesibil la distanta trebuie sa extinda o clasa proxy generata automat din descrierea interfetei Fisier StockMarketImpl.java

CORBA - Pas 4. Implementare Server import org.omg.CORBA.*; Import SimpleStocks.*; public class StockMarketServer { public static void main(String[] args) { try { ORB orb=ORB.init(); BOA boa=orb.BOA_init(); StockMarketImpl stockMarketImpl= new StockMarketImpl(“NASDAQ”); boa.obj_is_ready(stockMarketImpl); boa. Impl_is_ready(); } catch (Exception e) {} } Se implementeaza un program StockMarketServer, care creaza un obiect de tip StockMarketImpl, ce poate fi accesat de la distanta Obiectul creat este inregistrat sub numele “NASDAQ” Specific CORBA: ORB BOA Fisier StockMarketServer.java

CORBA - Pas 5. Implementare Client import org.omg.CORBA.*; import SimpleStocks.*; public class StockMarketClient { public static void main(String[] args) { try { ORB orb=ORB.init(); StockMarket market= StockMarketHelper.bind(orb, “NASDAQ”); market.get_price(“ABC SRL”); } catch (Exception e) {} } 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” Specific CORBA: ORB StockMarketHelper = proxy generat Fisier StockMarketClient.java

CORBA - Pas 6. Rulare aplicatie Location service (numele OSAgent e specific unei anumite implementari CORBA) > start osagent start java StockMarketServer start java StockMarketClient

.NET – Pas 1. Definire Interfata Remote public interface StockMarket { float get_price(string company); } Fisier StockMarket.cs Se defineste interfata StockMarket 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

.NET – Pas 2. Definire Obiect Remote using System; public class StockMarketImpl : MarshalByRefObject, StockMarket{ public float get_price(string company){ return 12345; } Fisier StockMarketImpl.cs Se implementeaza clasa StockMarketImpl Aceasta realizeaza operatia get_price Specific .NET: Obiectul accesibil la distanta trebuie sa extinda MarshalByRefObject

.NET – Pas 3. 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” using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; public class StockMarketServer{ public static void Main(){ StockMarketImpl myStockMarket = new StockMarketImpl(); TcpChannel m_TcpChan = new TcpChannel(9999); ChannelServices. RegisterChannel(m_TcpChan); RemotingServices.Marshal( myStockMarket, "NASDAQ"); System.Console.WriteLine( "Listening for requests. Press ENTER to quit"); System.Console.ReadLine(); } Specific .NET: ChannelServices RemotingServices Fisier StockMarketServer.cs

.NET – Pas 4. 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” using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; public class Client{ public static void Main(){ TcpChannel tcpChan = new TcpChannel(); ChannelServices.RegisterChannel(tcpChan); StockMarket stockMarket = (StockMarket) Activator.GetObject(typeof(StockMarket), "tcp://localhost:9999/NASDAQ"); Console.WriteLine(stockMarket.get_price( "abc SRL")); } Specific .NET: ChannelServices Activator.GetObject Fisier StockMarketClient.cs

.NET - Pas 5. Rulare aplicatie > Presupunand ca Windows si .NET Framework este instalat: start StockMarketServer start StockMarketClient Codul aplicatiei exemplu poate fi download-ad de pe pagina cursului, de la sectiunea de exemple de cod pentru cursul c4: .NET Remoting StockMarket

.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

Exercitiu Implementarea unui Broker simplu ToyORB Se furnizeaza o implementare pentru Forwarder-Receiver (Requestor/Replyer) Implementarea nu va folosi alte tehnologii de Middleware Detalii cerinte => Tema 3 laborator

Exercitiu: ToyORB: un client Este de dorit ca utilizand ToyORB, StockMarketClient:main sa constea in principiu in urmatoarele: StockMarket objRef=(StockMarketClientProxy) ToyORB.getObjectReference(“NASDAQ”); float price=objRef.get_price(“ABC SRL”); Cauta adresa unui obiect inregistrat sub numele NASDAQ Creaza si returneaza un obiect de tip StockMarketClientSideProxy StockMarketClientSideProxy. get_price trimite catre StockMarketServerSideProxy parametrul operatiei (numele companiei cotate la bursa) si receptioneaza rezultatul (pretul curent) Reprezinta operatia send_request din Patternul Broker asa cum e definit in POSA/Fig.pg.109

Exercitiu: ToyORB: un server Este de dorit ca utilizand ToyORB, StockMarketServer:main sa constea in principiu in urmatoarele: StockMarket obj=new StockMarketImpl ToyORB.register (obj, StockMarket, “NASDAQ”); Inregistreaza obj creat, care implementeaza serviciul StockMarket si are numele NASDAQ Creaza un obiect de tip StockMarketServerProxy care intra in asteptarea cererilor de la clienti

Exercitiu: ToyORB: 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 ( 1234.5 ) 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

Adaptarea Forwarder-Receiver in 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

Exemplu: ToyORB: Requester-Replyer 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

Exemplu: Implementarea Requester-Replyer Implementarea unor clase Requester si Replyer este data si poate fi folosita ca atare sau cu modificari pentru realizarea ToyORB Implementarea este disponibila pentru download in pagina cursului la sectiunea exemple de cod de la c4 -> fisierul RR.jsl public interface Address { … } public class Requestor { public Requestor(String myName) { … } public byte[] deliver_and_wait_feedback(Address theDest, byte[] data) { …} public interface ByteStreamTransformer { public byte[] transform(byte[] in) { …} public class Replyer { public Replyer(String myName, Address myAddr) {…} public void receive_transform_and_send_feedback(ByteStreamTransformer t) { …}

Exemplu: ToyORB: un server mai complex 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=(ComplexStockMarketClientProxy) 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

Exemplu: Scenarii de localizare a serverelor ToyORB.getObjectReference(“NASDAQ”); StockMarketImpl NASDAQ StockMarketClient1 StockMarketImpl NIKKEI StockMarketClient2 StockMarketImpl BVB ToyORB.getObjectReference(StockMarket);

Exemplu: ToyORB: un NamingService complex 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

Exemplu: ToyORB: activarea obiectului remote In exemplul StockMarket discutat pana acum, utilizatorul middleware-ului ToyORB are sarcinile: Sa implementeze remote object – StockMarketImpl Sa implementeze un program server care creaza remote object si sa lanseze in executie acest program - StockMarketServer Sa implementeze programe client care utilizeaza remote interface StockMarket – StockMarketClient Alternativa la pct. 2 : ToyORB creaza si activeaza un remote object la cererea unui client! Exemplu: Interface Incrementer { int increment(int nr); } IncrementerImpl nu are informatii de stare; Un obiect IncrementerImpl poate fi creat automat de ORB in momentul in care un client solicita acest lucru.

Pasi de realizare a unei arhitecturi Broker Alegerea unui object model Alegerea suportului pentru interoperabilitatea intre componente: IDL sau format binar comun Specificarea unui API al Broker pentru colaborarea cu clientii si serverele Utilizarea Proxy pentru ascunderea detaliilor fata de clienti sau servere Proiectarea componentei Broker Alegerea protocolului intern de interactiune Definirea maparii structurilor de un nivel mai inalt de abstractizare pe protocolul intern Alegerea variantei de comunicare: Direct Broker vs Indirect Broker Name Service Daca alegem sa suporte invocarea dinamica: componenta care mentine informatii despre tipurile serverelor existente Realizare tool-uri de generare de proxy-uri pentru o interfata data