Documente Academic
Documente Profesional
Documente Cultură
CORBA
1.1.
1.2.
Un sistem tipic cuprinde programe clieni care utilizeaz obiecte distribuite n sistem. Deoarece n
multe sisteme de operare prelucrrile trebuie s aib loc ntr-un proces, orice obiect trebuie s evolueze
ntr-un proces. n alte cazuri, obiectele pot evolua n thread-uri sau n biblioteci cu legare dinamic
(DLLs). CORBA d factor comun ntre aceste posibiliti i precizeaz c obiectele exist n servere
(uneori, n loc de server se mai folosete termenul de implementare). Fiecare obiect este asociat cu un
singur server. Dac, la invocarea obiectului, serverul nu este n execuie, atunci CORBA va activa
serverul, automat.
Codul unui server include implementarea obiectelor asociate, precum i o funcie principal care
iniializeaz serverul i creaz un set iniial de obiecte. Acestea pot fi de acelai tip sau de tipuri
diferite. Serverul poate include i obiecte non-CORBA, de exemplu obiecte C++ accesibile doar din
server. Doar obiectele pot fi invocate de clieni, nu i serverul nsui.
Client
Apel la distanta
Servere
Obiecte
1.3.
Intercomunicarea obiectelor
Implementarea i localizarea unui obiect sunt ascunse clientului. Comunicarea ntre client i obiect este
facilitat de ORB (Object Request Broker). Aa cum sugereaz i numele, ORB permite obiectelor
s se regseasc unele pe altele n reea. El ajut obiectele s fac cereri i s primeasc rspunsuri de
la alte obiecte aflate n reea. Acestea se desfoar n mod transparent pentru client: el nu trebuie s
tie unde este localizat obiectul, care este mecanismul utilizat pentru a comunica cu el, cum este activat
sau memorat acesta, etc.
ORB este mai sofisticat dect formele alternative client/server, incluznd RPC-urile sau comunicarea
peer-to-peer. ORB permite ca obiectele s se descopere reciproc la execuie i s-i invoce reciproc
serviciile. Din aceste motive, ORB este caracterizat adesea ca fiind o magistral de obiecte (object
bus).
1.3.1. CORBA i Middleware
Ca o parantez, serviciile CORBA fac parte dintr-o categorie denumit generic middleware. Acesta
este un set de servicii independente de aplicaii care permit aplicaiilor i utilizatorilor s interacioneze
prin reea. n esen, middleware este software-ul localizat ntre reele i aplicaii.
Utilizator
Midlleware
Aplicaie
Aplicaie
Middleware
Middleware
Utilizator
Middleware
Reea
Orientate spre aplicaii (replicarea datelor, integritatea, servicii de grup pentru procese
cooperative, servicii pentru obiecte distribuite, etc.)
Serviciile middleware sunt disponibile aplicaiilor prin interfee de programare a aplicaiilor, API (iar
operatorul uman prin GUI Graphical User Interfaces). n practic, serviciile apar ca o combinaie
de componente logice (niveluri), cum sunt cele din figura 1.3.
poate transmite apeluri ntre obiectele unui singur proces, ale unor procese executate pe aceeai main
sau ale unor procese din sisteme diferite, cu sisteme de operare diferite.
C
IDL
C++
IDL
COBOL
IDL
IDL
Java
IDL
IDL
Client
C++
IDL
COBOL
Java
IDL
IDL
IDL
Server
ORB
DSOM - Distributed System Object Model (IBM) i Neo (Sun) sunt ambele compatibile cu
CORBA. Ele folosesc IIOP pentru comunicarea ntre obiecte.
DCOM Distributed Common Object Model (Microsoft) este un ORB dar nu este compatibil
cu CORBA.
1.4.
Modelul de referin
1.4.1. Servicii
CORBA depete nivelul facilitilor de inter-operare a obiectelor. El specific, n plus, un set
cuprinztor de servicii pentru crearea i desfiinarea obiectelor, accesul lor prin nume sau proprieti,
depunerea lor n memorii persistente, definirea de relaii ntre ele, etc.
Prin aceasta, CORBA permite crearea unui obiect obinuit, cu o funcionalitate legat de o anumit
aplicaie, i adugarea ulterioar (prin motenire multipl de la serviciile corespunztoare) a securitii,
proteciei, persistenei, tranzacionalitii, etc.
Categoriile de interfee de servicii sunt prezentate in figura 7.3.
Interfee
de
i
i i
ORB
Servicii de
obiecte
Faciliti
comune
generale (G).
(G) Serviciul ciclului de via (Life Cycle Service) definete operaiile de creare, copiere,
mutare i tergere a componentelor pe magistrala de obiecte.
(B) Serviciul de persisten (Persistence Service) ofer o singur interfa pentru memorarea
persistent a obiectelor ntr-o varietate de servere de memorare, incluznd baze de date de
obiecte, baze de date relaionale sau simple fiiere.
(D) Serviciul de evenimente (Event Service) permite obiectelor s nregistreze sau s anuleze
interesul lor pentru evenimente specifice. Serviciul definete un obiect denumit event channel
care colecteaz i distribuie evenimente pentru obiecte care nu se cunosc reciproc.
(B) Serviciul de proprieti (Properties Service) permite asocierea unor perechi (nume-valoare)
cu obiectele.
(G) Serviciul de timp (Time Service) permite sincronizarea n funcii de timp i gestiunea
evenimentelor dependente de timp.
(D) Serviciul de securitate (Security Service) ofer un cadru complet pentru securitatea
obiectelor distribuite. Suport autentificarea, liste de control al accesului, confidenialitatea
i ne-repudierea. De asemenea, delegarea de acreditive ntre obiecte.
1.5.
CORBA ORB este partea ce mijlocete stabilirea relaiilor client/server ntre obiecte. n 1995, OMG a
publicat CORBA 2.0, ale crui principale caracteristici sunt evideniate n continuare. Structura sa este
prezentat in figura 8.1.
Folosind ORB, un obiect client poate invoca o metod a unui obiect server, n mod transparent. ORB
intercepteaz apelul i este rspunztor de gsirea obiectului server, de transmiterea parametrilor i de
invocarea metodei, ca i de returnarea rezultatelor.
Implementare de
obiect
Client
Depozit
de
interfee
Interfa
de
invocare
dinamic
Stub
IDL
Interfa
ORB
Skeleton
static IDL
Interfa
dinamic
de
Skeleton
Adaptor
Depozit de
implementri
ORB
Starea de execuie: clientul nu trebuie s tie dac obiectul server este activat i gata s
primeasc cererea; dac este cazul, ORB pornete obiectul nainte de a-i da cererea.
Clientul specific obiectul int printr-o referin de obiect. Aceasta se creeaz odat cu obiectul i se
refer la el n mod unic, atta timp ct obiectul exist. Referina este opac pentru client, n sensul
c acesta nu o poate modifica. Referinele de obiecte sunt gestionate exclusiv de ORB i au formate
standard (ca n IIOP) sau proprietare (de firm).
Clienii pot obine referinele de obiecte pe mai multe ci:
La crearea obiectului clientul poate crea un obiect i obine referina sa. CORBA nu are o
operaie special de creare de obiecte. Pentru a crea un obiect, clientul invoc o operaie a unui
obiect fabric de obiecte. Crearea ntoarce o referin de obiect.
Prin serviciul de cataloage (directory service) ambele Naming Service si Trading Service
permit obinerea de referine, dup nume, respectiv dup proprieti.
Problema: cum se lanseaz aplicaia i cum poate obine o referin iniial de obiect. Soluia: ORB
are un serviciu simplu de nume, incorporat, care furnizeaz aplicaiei referinele unor servicii mai
generale (Naming Trading). Operaia resolve-initial-reference cu parametrul Name-Service
furnizeaz aplicaiei referina de obiect pentru serviciul de nume cunoscut de ORB.
Definiie IDL
tipuri
constante
constante
constante
tipuri
excepii
excepii
module
tipuri
interfee
atribute
operaii
module
module modulename
{
interface interfacename1 {};
interface interfacename2 {};
}
O specificaie const din zero sau mai multe definiii de tip, constante, excepii sau module. Un modul
poate conine, n afara interfeelor i definiii de tipuri i alte module.
2.1.
Tipuri
boolean
octet (8 bii) se garanteaz c nu sunt aplicate conversii la transmiterea prin reea cu ORB.
enum
struct catalog {
course curs;
grade nota;
}
Exemplu union cu discriminant:
}
Exemplu tablou de lungime fix, cu elemente de un singur tip:
string
string<10>
sequence tablou unidimensional, mrginit sau nemrginit, cu toi membrii de acelai tip
2.2.
//mrginit
//nemrginit
Constante
Se pot defini constante simbolice, ca n orice limbaj de programare, oriunde ntr-un fiier IDL. IDL
calculeaz valoarea constantelor folosind:
Operatorii sunt
unari -, +, ~ (bit complementat)
binari
De exemplu:
2.3.
O interfa este o descriere a operaiilor pe care un obiect le poate executa. Un obiect satisface
interfaa dac el poate fi specificat ca int n oricare cerere potenial descris de interfa. Forma
general este:
interface Person {
Readonly attribute string name;
};
interface student: Person{
attribute Profesor advisor;
Enrollments load (in semester when);
};
student are atributele name i advisor i operaia load.
Exemplu
2.4.
Operaiile sunt similare declaraiilor de funcii C/C++. O operaie denot un serviciu care poate fi
cerut obiectului i este descris prin:
identificatorul operaiei
nume
tip
(mod) direcie
in client->server
out server->client
Excepiile pe care operaia le poate provoca (clauza raises), ele constituie indicaii c operaia care le-a
generat nu a fost executat corect. Sintaxa unei operaii este urmtoarea:
result_type op_name (
[direction type name {, directions type name} ])
[raises ([exception {, exception }])]
unde exception este o excepie definit anterior. De exemplu:
2.5.
Excepii i atribute
n ce privete excepiile, ele arat producerea unor erori la execuia unei operaii. Excepiile pot fi
clasificate n:
excepii definite de sistem
O excepie de sistem, este generat cnd se produce o eroare n infrastructura ORB sau la producerea
unei noi erori generice n timp ce serverul ncearc s prelucreze o cerere. De xemplu, Out of
memory sau Illegal parameter.
O excepie de sistem const dintr-un motiv major (CORBA:: BAD_PARAM) i un cod minor.
Uzual, o funcie de conversie exception_to_string permite conversia motivului i a codului ntr-o
form descriptiv, textural.
O excepie utilizator este definit la fel ca o nregistrare. De exemplu,
2.6.
Particulariti IDL
OMG IDL are un sistem de tipuri simplu, pentru a facilita corespondena cu multe limbaje de
programare. Cu toate acestea, sistemul de tipuri este suficient pentru cele mai multe aplicaii
distribuite. Simplitatea este critic pentru utilizarea CORBA ca o tehnologie integratoare. Dintre
elementele pe care le gsim n limbajele de programare i nu le regsim in IDL, amintim:
toate definiiile dintr-o interfa IDL sunt publice (nu exist conceptul de private sau protected,
acestea fiind legate de implementare nu de specificare)
parametrii
nu pot fi opionali
nu exist pointeri
2.7.
Corespondena ntre IDL i C++ este definit de standardul CORBA. Ea se refer la modul n care
definiiile IDL sunt traduse n C++ i la regulile pe care clienii i serverele C++ trebuie s le respecte
la utilizarea, respectiv implementarea interfeelor.
IDL
C++ typedefs
short
long
unsigned short
unsigned long
float
double
char
boolean
octet
CORBA::Short
CORBA::Long
CORBA::UShort
CORBA::ULong
CORBA::Float
CORBA::Double
CORBA::Char
CORBA::Boolean
CORBA::Octet
corespondena
n
Orbix
pentru 32 de bii
short, dac 16 bii
long, dac 32 de bii
unsigned short
unsigned long
float
double
char, dac 8 bii
unsigned char
unsigned char, dac 8 bii
Definiiile de tipuri sunt puse ntr-o clas C++ sau ntr-un namespace (cu numele CORBA).
Pentru boolean s-a ales n Orbix unsigned char i nu bool din ANSI C++ pentru c ANSI nu e o
cerin pentru CORBA n acest moment.
Regula de transmiterea parametrilor prntru tipurile de baz este simpl:
parametrii in i rezultatele se transmit prin valoare
parametrii out i inout se transmit prin referin (&)
2.7.2. Module
Modulele IDL sunt mapate pe namespace n C++ (o tratare special este necesar cnd compilatorul
nu suport namespace). De exemplu:
module M{
typedef float money;
interface I{...
}
};
se traduce prin:
namespace M{
typedef CORBA::Float money;
class I: public virtual CORBA::Object{...
};
};
2.7.3. Interfee
O interfa IDL este pus n coresponden cu o clas C++. Fiecare operaie este mapat pe o funciemembr. Un atribut este mapat pe dou funcii (de citire i de modificare a valorii). Un atribut
readonly este mapat pe o funcie de citire a valorii. De exemplu:
interface T{
attribute long l;
readonly attribute char c;
void op1();
};
se mapeaz n C++ pe
Referin la obiect
Referin la obiect
Client
Proxy
Contor refer.=2
Server
int
Contor refer.=1
obT_ptr p1=...;
{
obT_ptr p2;
p2 = obT::_duplicate(p1);
... //poate folosi p2
CORBA::release (p2);
//incrementeaza contorul
//decrementeaza contorul
}
// foloseste apoi p1
CORBA::release(p1)
Gestiunea contorului de referine este automat n cazul tipului _var, considerat ca un pointer
inteligent. De exemplu:
obT_var p1=...;
{
obT_var p2;
p2=p1;
//incrementeaz automat contorul
... //poate folosi p2
}
...// fooseste p1, apoi decrementeaza automat contorul cand p1 iese //din domeniul de valabilitate
3. CORBA static
CORBA ORB suport dou tipuri de apeluri client/server: statice i dinamice. n ambele cazuri,
clientul execut o cerere atunci cnd are acces la o referin a obiectului i specific metoda care
corespunde serviciului. Serverul nu poate face diferenierea ntre invocrile statice i dinamice. Ne
referim aici la prima form.
1. Creare definiii IDL
Precompilare
Skeleton-uri
3. Adugare cod de implementare
4. Compilare
5. Interface
Repository
Client IDL
Stubs
Client
Server IDL
Skeleton
instaniere
Implementri
Object
7. Object
Adapter
6. Implementation
Repository
Server
3.1.
Figura 3.1 arat paii necesari pentru crearea unui server i a unui client care comunic prin ORB.
Figura se refer la cazul general, nu neaprat la varianta static.
1. Se definesc interfee n IDL; acestea precizeaz ce operaii sunt disponibile la un server i cum
pot fi invocate.
2. Pe baza descrierii IDL, un precompilator produce skeleton-uri (pentru server) i stub-uri
(pentru clieni). Cnd clientul i obiectul int sunt n acelai spaiu de adrese, comunicarea lor
se poate face direct, nefiind necesar un cod suplimentar. Cnd acetia sunt n spaii diferite, este
necesar un cod suplimentar la client (stub) pentru transmiterea invocrilor, i la obiectul int
(skeleton), pentru recepia lor i transmiterea lor ctre obiectul int.
3. Se adaug codul care implementeaz serverul.
4. Se face compilarea codului. Un compilator care accept CORBA este, n mod obinuit, capabil
s genereze cel puin trei fiiere:
a. Fiiere import care descriu obiectele pentru Interface Repository
b. Stub-uri client pentru metodele definite n IDL; ele sunt invocate de clieni pentru
acces la server
c. Skeleton-uri server care apeleaz metodele serverului (mai sunt numite up-call
interfaces).
5. Leag definiiile de interfee de InterfaceRepository (se folosete un utilizator). Informaia din
IR este accesibil clienilor la execuie.
6. Adaptorul de obiecte nregistreaz n Implementation Repository tipul i referina oricrui
obiect ce poate fi instaniat pe server. ORB folosete aceste informaii pentru a localiza
obiectele active sau s cear activarea unor obiecte.
7. Instanierea obiectelor pe server cerut de object adapter conform unei anumite strategii.
La aceste etape se adaug operaiile legate de client, la care ne referim n exemplul care urmeaz.
Paii de programare ce corespund dezvoltrii unei aplicaii client-server n CORBA i C++, n varianta
static, sunt urmtorii:
descrierea interfeelor n IDL
scrierea funciei principale a serverului, care creaz instane ale claselor, informeaz apoi
broker-ul i adaptorul c au fost fcute iniializrile i c obiectele int sunt gata s primeasc
cereri
3.2.
Descrierea care urmeaz se refer la VisiBroker for C++ (produs de Visigenic), dar ea corespunde, cu
mici modifcri i altor implementri CORBA 2.0 (vezi Mico de la Universitatea Frankfurt, Germania).
Programul Count folosit aici ca exemplu este o aplicaie rudimentar client/server. Serverul suport o
singur metod numit increment, care incrementeaz valoarea unei variabile numit sum i ntoarce
clientului valoarea acesteia.
Count
Attributes:sum
O Increment
Figura 3.2. Serverul
Sum este declarat ca un atribut read/write. Ca urmare, valoarea sa este accesibil prin funcii
predefinite. Clienii folosesc aceste funcii pentru a stabili valoarea iniial pentru sum i pentru a gsi
valoarea final.
Clientul trebuie s fac urmtoarele operaii:
S stabileasc valoarea iniial a atributului sum
S invoce metoda increment de 1000 de ori
S afieze valoarea final a atributului sum, mpreun cu timpul de rspuns mediu.
Clientul trebuie s poat trata excepiile de sistem CORBA.
Primul pas este definirea n IDL a interfeei serverului. Fiierul count.idl conine aceast descriere:
module Counter
{ interface Count
{ attribute long sum;
long increment();
};
};
3.3.
Compilarea interfeei
Observaie. MICO produce dou fiiere, care reunesc coninutul celor patru menionate aici.
Count.idl
Orbeline
Count_c.hh
Count_c.cpp
stub
Count_s.hh
Count_s.cpp
skeleton
count_s.cpp este skeleton-ul server pentru metodele clasei count. Acesta reprezint codul
care se re-aranjeaz (unmarshals) apelurile pentru obiectul Count i invoc implementarea
obiectului.
count_s.hh este fiierul antet pentru server, care include definiiile de clase pentru skeleton-ul
implementat n count_s.cpp.
count_c.cpp conine o clas numita Count care servete ca intermediar (proxy) al clientului
pentru obiectul Count. El conine funcii stub i de aranjare (marshaling) pentru toate metodele
definite n interfaa Count. n plus, implementeaz o metod bind care ajut clientul s
localizeze serverul Count.
count_c.hh este fiierul antet pentru client, care include declaraiile i definiiile de clase
pentru stub-ul implementat n count_c.cpp.
Cele patru fiiere generate de compilatorul IDL conin n cea mai mare parte funcii private ale
VisiBroker-ului. Ele nu trebuie modificate de programator. Cu toate acestea, programatorul trebuie s
inspecteze count_s.hh, unde gsete declaraiile funciilor virtuale abstracte ale interfeei Count.
(O soluie mai bun ar fi fost ca declaraiile de funcii ce trebuie implementate de programator s fie
furnizate ntr-un fiier separat, aa cum VisiBroker face pentru Java). Partea care intereseaz pentru
implementarea serverului are urmtorul aspect:
Class _sk_Counter
// corespunde modulului Counter modelat aici ca o clasa
{ public:
class _sk_Count: public Counter::Count
// corespunde interfetei Count
{ virtual CORBA::long sum() = 0;
//citeste atribut
virtual void sum (CORBA::long val) = 0;
//scrie atribut
virtual CORBA::long increment() = 0;
//op. incrementare
//alte operatii skeleton implementate automat
...
};
};
3.4.
Orice server CORBA trebuie s aib un program principal care iniializeaz mediul ORB i pornete
obiectele. n plus, serverul trebuie s prevad i implementri ale interfeelor CORBA care sunt
definite n IDL. n acest exemplu, trebuie implementat o singur interfa, Counter.Count. Scriem o
clas C++ numita CountImpl pentru a implementa aceast interfa.
Implementarea clasei CountImpl se deriveaz din clasa skeleton corespunztoare. n acest fel, clasa
server motenete funcionalitatea modelului obiectelor CORBA. De asemenea, astfel clasa server
obine funciile skeleton ce permit ORB s invoce automat metodele obiectului (up-calls).
Sarcina este, deci, s se implementeze CountImpl i funcia main pentru server.
3.5.
Implementarea serverului
nainte de a continua implementarea serverului, s ne referim la un alt element CORBA care intervine
n realizarea apelurilor de operaii. Este vorba de adaptoarele de obiecte, Object Adapters. Rolul lor
este multiplu:
nregistrarea obiectelor OA include operaii care permit unor entiti de limbaj de
programare s se nregistreze ca implementri de obiecte CORBA.
Activarea procesului server dac este necesar, OA pornete procesele server n care pot fi
activate obiectele
Activarea obiectelor OA activeaz obiectele, dac ele nu sunt deja active la sosirea cererilor.
n mod normal, un OA este necesar pentru fiecare limbaj de programare. De exemplu, un obiect
implementat in C s-ar nregistra n OS furniznd un pointer de struct care s in starea obiectelor i
pointerii de funcii corespunztoare operaiilor obiectului, aa cum sunt definite de interfeele IDL.
Pentru C++, o implementare de obiect poate fi derivat dintr-o clas de baz standard care include
interfaa pentru apelurile de operaii.
n consecin, CORBA admite mai multe adaptoare dar actualmente prevede una: Basic Object
Adapter (BOA). Credina iniial a fost c un singur BOA ar fi suficient. Pentru a suporta mai multe
limbaje de programare, specificaia acestuia a fost pstrat la un nivel destul de vag n anumite
privine, cum ar fi i aceea a nregistrrii obiectelor. Aceasta a generat probleme de portabilitate a
implementrii BOA, fiecare furnizor de ORB completnd prile absente cu soluii proprii. Problema
portabilitii BOA este nc n studiul OMG.
Urmeaz elaborarea programului principal server.cpp.
Iniializeaz BOA - folosind referina orb, iniializeaz BOA; iniializarea ntoarce o referin la
BOA.
creaz obiectul CountImpl. Aici serverul asociaz obiectului un nume (marker) la crearea sa.
Numele trebuie s fie unic n cadrul serverului. Dac un server creaz mai multe obiecte Count,
el trebuie s asigneze acestora nume distincte. Ca alternativ, asocierea mrcilor cu obiecte
poate fi lsat n seama ORB, aplicaia avnd posibilitatea s modifice mrcile ulterior crerii
obiectelor. Numele unui obiect este mai complicat, av\nd mai multe componente: numele
serverului, interfaa, marker-ul.
Anun BOA c obiectul este gata s lucreze i c ateapt primirea unor invocri de servicii.
Funcia impl_is_ready nu red controlul imediat. Ea blocheaz serverul pn la apariia unui
eveniment, trateaz evenimentul i re-blocheaz serverul n ateptarea unui alt eveniment.
Funcia se termin la apariia unui time-out (a crui durat este programabil) sau a unei
excepii.
server.cpp
CORBA API
ORB
BOA
ORB_init
BOA_init
new
CountImpl
obj_is_ready
impl_is_ready
3.6.
Implementarea clientului
Partea client a aplicaiei const dintr-un program main i fiierul su antet. Programul trebuie s
realizeze urmtoarele operaii:
S iniializeze ORB
S localizeze un obiect Count distant
S iniializeze la zero atributul sum
S calculeze timpul de start
S invoce metoda increment de 1000 de ori
S calculeze timpul scurs
S afieze rezultatele
# include <iosteam.h>
# include <stdlib.h>
# include <time.h>
# include <sys\types.h>
# include <sys\timeb.h>
struct timeb timebuff;
double startTime, stopTime;
int main (int argc, char * const* argv)
{ try
{
cout << "initialize ORB" << endl;
CORBA::ORB_ptr orb = CORBA::ORB_init(argc, argv);
//bind to the Count Object
cout << Binding to Count Object<<endl;
Counter::Count_var Counter=Counter::Count::_bind(MyCount);
/*Counter va contine un pointer la proxy intermediarul pentru
serverul CountImpl */
Counter->sum((long)0);
ftime(&timebuff);
//calcul timp de start
startTime=((double)timebuff.time+((double)timebuff.millitm)/
(double)1000);
//increment
for (int i=0; i<1000; i++)
{ Counter->increment(); }
//calcul timp stop
stopTime==((Double)timebuff.time+((double)timebuff.millitm)/
((double)1000);
cout << (stopTime startTime) <<nsecs<endl;
cout <<Sum =<<Counter->sum();
}
catch(CORBA::SystemException &excep)
{cout<<System Exception<<endl;
cout <<excep;
return(1);
}
return (0);
}
CORBA permite invocarea obiectelor distante folosind semantica uzual C++. Pentru a invoca
metodele, este mai nti necesar obinerea referinei obiectului, realizat aici cu bind. Aceast metod
este implementat automat de clasa C++ intermediar Count. Pentru referin se folosete Count_var
(n loc de count_ptr), pentru a realiza automat gestiunea memoriei.
CountImpl
counter
CORBA API
Client.cpp
ORB_init
new
_bind
Count
proxy
Sum(0)
Sum(0)
Start timer
de 1000 de ori
increment
increment
Stop Timer
Print
results
client
server
4. CORBA dinamic
Exemplele date pn n prezent folosesc invocarea static a serviciilor prin intermediul stub-urilor i
skeleton-urilor precompilate. Un client necesit un stub pentru fiecare interfa pe care o folosete.
Aceast cerin devine limitativ n cazul Internetului, unde clienii pot apela, teoretic, la milioane de
obiecte din reea i unde apar frecvent noi servicii i interfee.
Un alt exemplu unde soluia este limitativ este cel al unei pori (gateway) ntre dou sisteme de
obiecte diferite: CORBA i un sistem strin. Atunci cnd primete o invocare de la un sistem strin de
obiecte, poarta trebuie s o converteasc ntr-o cerere ctre obiectul CORBA solicitat. Recompilarea
programului porii odat cu adugarea fiecrui nou obiect este o soluie complet nepractic. Din
fericire, CORBA suport dou interfee pentru invocri dinamice:
Dynamic Invocation Interface (DII) pentru invocrile dinamice de cereri ale clienilor i
Dynamic Skeleton Interface (DSI) care realizeaz dispecerizrile dinamice ctre obiecte.
DII i DSI pot fi vzute ca stub-uri si skeleton-uri generice. Fiecare este o interfa prevzut direct de
ORB i independent de interfeele OMG IDL ale obiectelor invocate.
Cu DII, un client poate invoca orice operaie, a oricrui obiect, fr a avea nevoie de informaii despre
acestea la momentul compilrii. Informaiile necesare sunt descoperite n momentul invocrii.
4.1.
Cum descoper clienii obiectele distante? Sunt posibile mai multe mecanisme.
n cea mai simpl abordare, clientului i se poate da o referin de obiect, convertit n ir de
caractere. Referinele de obiecte n mediile CORBA sunt robuste, n sensul c ele pot fi
memorate persistent ntr-un fiier, n forma de ir de caractere. (stringified object reference).
Referinele pot fi regsite ulterior i pot fi folosite pentru invocarea obiectelor, cu condiia ca
acestea s mai existe. ORB garanteaz c referinele rmn valide, chiar dac se produc erori de
reea ce conduc la pierderea comunicaiei cu obiectele, caz n care ORB va realiza automat
refacerea legturii. Clientul face conversia de la ir la referin de obiect folosind una din
metodele interfeei ORB (string-to-object) i realizeaz apoi invocri ale obiectului.
Odat dispunnd de referina obiectului, clientul o poate folosi pentru a regsi interfaa obiectului i a
realiza construcia dinamic a cererii. n cerere, trebuie specificat metoda invocat i parametrii
corespunztori. Aceste informaii sunt obinute uzuala din depozitul de interfee Interface Repository
(IR). n consecin, construcia dinamic a unei invocri reclam etapele descrise n continuare.
(1) Obinerea numelui interfeei.
Odat ce dispunem de o referin la obiectul server, putem cere acestuia numele interfeei sale. Pentru
asta se invoc metoda get_interface (figura 4.1). Acest apel ntoarce o referin la un obiect
InterfaceDef din IR, care descrie interfaa necesar clientului.
(2) Obinerea descrierii metodei, din IR.
Putem folosi InterfaceDef ca un punct de intrare pentru navigarea n Interface Repository, IR. Putem
obine astfel o mulime de detalii despre interfa i despre metodele sale. CORBA specific aproape
zece apeluri pentru inspectarea IR. De exemplu, clientul poate apela lookup_name pentru a gsi
metoda pe care vrea s o invoce (de fapt o referin la un obiect OperationDef care descrie operaia),
iar apoi describe pentru a obine definiia IDL complet a metodei.
Ca alternativ, se poate apela describe_interface pentru a obine o definiie complet a interfeei i
pentru a gsi metoda care trebuie invocat.
(3) Crearea listei de argumente.
(3a) CORBA specific o structur de date autodefinit pentru transmiterea parametrilor, anume Named
Value List. Pentru implementarea acestei liste se folosete un pseudo-obiect NVList. Pentru crearea
listei se invoc create_list i apoi add_item, n mod repetat, pentru a aduga listei fiecare argument.
(3b) Ca alternativ, clientul poate invoca create_operation_list pe un obiect CORBA::ORB, ca
urmare a creia lista este creat de ORB. Acestei metode trebuie s i se dea numele operaiei pentru
care trebuie creat lista de argumente.
(4) Crearea cererii.
O cerere este un pseudo-obiect CORBA care conine numele metodei, lista de argumente i valoarea
returnat ca rezultat.
(4a) Pentru aceasta se invoc create_request, creia i se transmite numele metodei, NVList i un
pointer la valoarea returnat.
client
Object
InterfaceDef
OperationDef
ORB
get_interface
Lookup_name
describe
create_list
NVList
add_item
add_value
create_request
invoke
Request
delete
free
Clientul invoc cererea i continu apoi prelucrarea; nu exist rspuns, deci apelul este definit ca
o datagram; pentru asta se apeleaz send_oneway.
4.2.
Pentru invocarea dinamic a metodelor se folosesc servicii din nucleul CORBA. Serviciile sunt
dispersate n patru interfee din modulul CORBA:
4.3.
Analogul DII de partea serverului este DSI. Aa cum DII permite clienilor s invoce cereri, fr a fi
necesare stub-uri statice, DSI permit ca serverele s fie scrise fr a avea skeleton-uri compilate static
n program.
Pentru aceasta, serverul poate defini o funcie care va fi informat de orice invocare de operaie sau
atribut i care:
determin identitatea obiectului invocat
determin numele operaiei, tipurile i valorile argumentelor
ndeplinete aciunea cerut de client
construiete i ntoarce rezultatul.
Principala sa utilizare este construcia porilor (gateways) ntre sisteme de obiecte CORBA i nonCORBA. Iniial, DSI a fost gndit pentru a fi utilizat n porile dintre diferite ORB se folosesc
protocoale diferite. Odat cu adaptarea IIOP aceast funcie s-a dovedit inutil.
5. Iniializarea
S ne reamintim din exemplul de invocare static a metodelor de obiecte-server c n CORBA 2.0 sunt
definite metode de iniializare pe care orice ORB trebuie s le furnizeze pentru a permite unui obiect
s se integreze ntr-un mediu distribuit. Aceste metode sunt implementate de pseudo-obiectul
CORBA::ORB.
Un pseudo_obiect este un obiect creat direct de ORB, dar care poate fi invocat ca oricare alt obiect.
ORB nsui este un pseudo-obiect.
Trei metode sunt specifice iniializrii unui obiect i sunt disponibile dup execuia unui apel
ORB_init:
BOA_init
list_initial_services
resolve_initial_references
Invocarea metodei BOA_init pe obiectul ORB permite obiectului s informeze adaptorul despre
existena sa i s obin referina pseudo-obiectului BOA.
Serviciul de iniializare este un fel de Naming Service elementar. El permite obinerea unei liste de
servicii binecunoscute: Naming Service, Trading Service, precum i alte servicii de navigare, cutare,
ageni, etc. Utilizarea acestora permite gsirea altor obiecte din universul ORB.
5.1.
Naming Service pstreaz p baz de date de legturi (bindings) ntre nume i referine de obiecte.
Serviciul are operaii pentru:
rezolvarea unui nume
Un nume este o secven IDL de componente de nume. O component este o structur de dou iruri:
primul este numele componentei; al doilea este un atribut care nu este interpretat de Naming Service,
fiind destinat utilizrii de ctre aplicaie. De exemplu, el poate preciza c numele trebuie interpretat ca
numele unui catalog, sau al unui disc.
Fiecare component, cu excepia ultimeia, definete un NamingContext (similar unui director ntr-un
sistem de fiiere). Aceasta confer sistemului de nume o structur ierarhic ce ordoneaz cutarea
pentru rezolvarea numelor: prima component d numele unui context n care se caut al doilea nume;
procesul continu pn la ultima component.
5.2.
Serviciul de Trading
Fa de aceast funcionare simpl, un Trader este mult mai complex. Oricum, i funcia sa este mai
complex, Trader-ul permind cutarea obiectului cel mai potrivit ntr-un set larg de obiecte similare.
Cum funcioneaz un serviciu Trader? Exportatorii sau furnizorii de servicii anun Trader-ul despre
serviciile oferite. Importatorii sau consumatorii de servicii folosesc Trader-ul pentru a gsi serviciile
care satisfac nevoile lor.
Trader
ORB
1-Export
serviciul
2-Import
serviciul
Client
Importator
3-Invoc serviciul
Server
Exportator
ORB
ORB
Tipul serviciului care include informaii asupra numelor operaiilor (sau metodelor) apelabile
mpreun cu tipurile parametrilor i rezultatului.
Propritile serviciului care sunt perechi nume-valoare care definesc oferta. Ele descriu
capabilitile serviciului i se plaseaz n dou categorii: obligatorii i opionale.
Trader-ul pstreaz un depozit de tipuri de servicii. Putem avea, de exemplu, un tip restaurant,
pentru care proprietile serviciului pot fi: meniul, specialitile, adresa, numrul de locuri, orarul, etc.
Trader-ul pstreaz descrierile n ServiceTypeRepository. Totodat, pstreaz o baz de date de
obiecte server, care sunt instane ale acestor tipuri. Clienii pot intra n contact cu Trader-ul cerndu-i
s gseasc serviciile care se potrivesc cel mai bine unui anumit set de cerine. Un serviciu care ar
corespunde cererii trebuie s aib un tip care se potrivete cu cererea clientului i proprietile care
satisfac criteriile impuse de client.
Descrierea criteriilor se face ntr-un limbaj de constrngeri ce precizeaz:
tipurile de proprieti ce pot apare n cosntrngeri (de exemplu, ntregi, reali, char etc.)
Clientul poate preciza preferinele asupra ordinii n care trader-ul ar trebui s furnizeze ofertele care
se potrivesc cererii (de exemplu, mai nti oferta care are un anumit parametru, sau o valoare maxim
pentru un parametru, sau o ordine oarecare, sau ordinea n care ofertele sunt gsite de trader). Clientul
poate specifica i o politic pe care s o urmeze trader-ul i care fixeaz elemente ca numruil maxim
de oferte furnizate sau amploarea cutrii.
Trader-i din domenii diferite pot crea federaii. Un Trader poate oferi serviciile de care rspunde, dar
i servicii ale trader-ilor cu care este n federaie.
n scenariul prezentat n continuare intervin urmtoarele interefe:
Lookup - permite clienilor i trader-ilor s descopere i s importe servicii; are o singur
operaie, query;
Lookup
Register
ServiceTypeRepository
server
add_type
export
list_type
describe_type
query
invoke_method
Trader
6. Activarea obiectelor
n exemplul dat, la discutarea invocrii statice a seviciilor, obiectele count trebuiau pornite manual
nainte de a servi cererile clienilor. Cu excepia cazului crerii unui nou obiect, care este implicit
pornit de CORBA, standardul nu prevede o comand explicit de pornire a unui obiect server.
Filozofia CORBA este de a pstra clientul ct mai simplu: acesta trebuie s vad obiectele server ca
fiind ntotdeauna pregtite s accepte invocrile operaiilor lor. Ca urmare, ORB trebuie s fie capabil
s porneasc n avans un obiect sau s-l porneasc la cerere, atunci cnd un client invoc obiectul.
Aceasta presupune c serverului i se adaug o parte de cod care coopereaz cu ORB la pornirea
sau oprirea lor.
n principiu, interfaa CORBA::BOA este folosit pentru a crea i distruge referine de obiecte i
pentru a afla ori actualiza informaia pe care BOA o pstreaz despre referinele la obiecte. BOA
pstreaz evidena obiectelor active i a implementrilor pe care le controleaz. Interfaa BOA este
folosit pentru a avea acces la aceast eviden, pentru a afla sau aduga informaii despre obiecte. Iat
o scurt descriere a metodelor CORBA::BOA.
create este invocat pentru a descrie implementarea unei noi instane de obiect i a obine o
referin de obiect pentru ea. ORB i se paseaz mai multe informaii:
un identificator unic (nu este folosit de ORB ci este specific implementrii i permite
diferenierea obiectelor sau specificarea unor identificatori persisteni Persistent ID).
Exist i alte metode care permit activarea i dezactivarea implementrilor i a obiectelor care ruleaz
n aceste implementri. CORBA cere ca urmtoarele funcii s fie disponibile ntr-o implementare
BOA:
Un Implementation Repository care permite instalarea i nregistrarea implementrii unui obiect
CORBA face o distincie clar ntre un server i obiectele sale. Un server este un proces, o unitate de
execuie. Un obiect implementeaz o interfa. Un server poate conine unul sau mai multe obiecte,
eventual de clase diferite. La cealalt extrem se afl un server care conine codul pentru
implementarea unei singure metode. n toate cazurile, obiectele sunt activate n serverele lor. CORBA
definete patru politici de activare: server partajat (shared server), server ne-partajat, server-per-metod
i server persistent.
6.1.
Server partajat
Toate obiectele cu acelai nume de server rezid n acelai proces. BOA activeaz serverul la prima
invocare de metod a unuia din aceste obiecte. Dup ce serverul s-a iniializat, el anun BOA c poate
prelucra cereri prin apelul impl_is_ready. Toate cererile ulterioare (de metode ale obiectelor acestui
server) sunt livrate acestui proces. BOA nu activeaz un alt proces server pentru aceast implementare.
(Cnd un alt client execut un obiect, legarea se face la aceeai copie de server).
Proces Server
invocarea unui obiect Count
Count
Client
Count
invocarea altui
obiect Count din
Count
6.2.
Server nepartajat
Fiecare obiect rezid ntr-un proces separat. La prima invocare a unui obiect este pornit procesul
corespunztor. Cnd obiectul a ncheiat faza de iniializare, el anun BOA prin obj_is_ready.
Obiectul rmne activ pn la un apel dezactivate_obj. Ori de cte ori se apeleaz un obiect care nu
este activ se pornete un alt obiect cu aceeai implementare. Acest mod se folosete:
atunci cnd obiectele necesit cantiti mari de resurse
Client
Proces Server
invocarea altui
obiect Count din
Count
6.3.
Server-per-metod
Un nou server este activat odat cu fiecare cerere i dezactivat odat cu satisfacerea cererii. Nu este
deci nevoie ca implementarea s anune BOA cnd un obiect este activat/dezactivat.
6.4.
Server persistent
Serverul este activat prin mijloace din afara adaptorului BOA. Odat activat, serverul anun BOA,
printr-un apel impl_is_ready, c poate primi cereri de la clieni fiind tratat n continuare ca un server
partajat.
6.5.
Concluzii
Dup cum se vede, rolul BOA n pstrarea evidenei obiectelor active sau activabile la cerere este
esenial. BOA folosete aceste informaii pentru a putea realiza dispecerizarea cererilor clienilor.
Pentru actualizarea evidenei, BOA cere tuturor obiectelor server s se autodescrie i s-i nregistreze
permanent starea. n principiu, fiecare obiect i anun pornirea prin obj_is_ready. Cnd toate
obiectele gestionate de un proces server sunt active, acesta apeleaz impl_is_ready.
Ce se ntmpl dac un proces are foarte multe obiecte? Instanierea tuturor obiectelor n memorie, la
pornire ar putea fi prea costisitoare. Este mult mai eficient s se fac instanierea unui obiect doar
atunci cnd un client are nevoie de el. VisiBroker folosete o versiune modificat pentru
obj_is_ready, transmind ca argument un Activator pentru obiect. Acesta este o clas special care
implementeaz dou metode: activate i deactivate. Prima este apelat de BOA cnd obiectul este
invocat. A doua este apelat cnd serverul i termin execuia.
reciproc n mod dinamic i pot coopera. Nu este deci necesar ca programul unui client s includ
apeluri la servere particulare, stabilite la compilare i nemodificabile ulterior. n plus, metadatele
disponibile pot fi folosite de instrumente de creare i gestiune a diferitelor componente de aplicaii.
IDL este un limbaj declarativ care permite specificarea interfeelor unor componente cu diveri clieni.
IR conine metadate identice cu descrierile IDL, dar n forma compilat. CORBA definete coduri de
tip care reprezint diverse tipuri de date definite n IDL. Codurile sunt folosite pentru a crea structuri
auto-descrise ce pot fi comunicate prin sisteme de operare, ORB-uri si IR_uri. Codurile sunt utilizate:
de IR pentru a crea descrieri IDL independente de ORB
de tipul any pentru a furniza un parametru generic auto-descris. any se folosete pentru un
parametru al crui tip nu este fixat la compilare. La execuie, pentru un parametru any se poate
transmite o valoare de orice tip. Obiectul int care primete un any poate obine TypeCode-ul
su i din el poate determina tipul valorii transmise. Concret, clasa CORBA::Any are o funcie
membr type() care ntoarce o valoare de tip CORBA::TypeCode_ptr. Aceast valoare poate fi
inspectat la execuie pentru a se afla tipul valorii transmise ca any.
Interfaa CORBA TypeCode definete un set de metode ce permit operarea cu coduri de tip,
compararea lor, obinerea descriilor, etc.
Fiecare cod de tip are un identificator global unic Repository ID care poate fi folosit ntr-un spaiu
de nume distribuit. Asocierea dintre cod i identificator se face la compilarea descrierilor IDL, sau la
integrarea lor n IR folosind alte instrumente. Un Repository ID este un ir de caractere cu trei
componente, separate de ":" reflectnd o ierarhie de nume cu trei niveluri. Forma este standardizat i
are o structur foarte general.
Prima component identific formatul i poate fi IDL sau DCE (doar aceste dou formate sunt definite
n CORBA 2.0).
Pentru IDL, a doua component este o list de identificatori desprii prin /. Primul este un prefix
unic, reprezentnd numele unei organizaii, un nume Internet, etc. Celelalte sunt identificatori IDL
care alctuiesc mpreun numele (complet al) tipului. De exemplu, interfaa Itrf a modulului Mdl are
numele Mdl/Interf.
A treia component este o pereche de numere de versiune major i minor, desprite prin punct,
v_majora.v_minora
7.1.
Interface Repository
Interface Repository, IR este o baz de date de definiii de obiecte, generate de un compilator IDL
sau introduse prin funciile de scriere specifice IR. Obiectele din IR sunt versiuni compilate ale
informaiei care se afl n sursele IDL. Altfel spus, pentru fiecare definiie IDL gsim n IR un obiect
care ncapsuleaz descrierea corespunztoare. Specificaia CORBA se refer explicit doar la modul n
care informaia din IR este organizat i poate fi regsit. Obiectele din IR suport interfee IDL care
reflect construcia IDL pe care o descrie: ModuleDef, InterfaceDef, AttributeDef, etc. n plus,
interfaa Repository servete ca rdcin pentru toate celelalte. Fiecare IR este reprezentat de un
obiect Repository. Figura 7.1 arat ierarhia de interfee din punct de vedere al coninutului obiectelor
care suport aceste interfee.
Repository
ConstantDef
TypeDef
ModuleDef
ExceptionDef
InterfaceDef
ConstantDef
TypeDef
InterfaceDef
ModuleDef
ExceptionDef
ConstantDef
TypeDef
OperationDef
AttributeDef
ExceptionDef
ParameterDef
ExceptionDef
Pornind de la aceast relaie, CORBA stabilete ierarhia de motenire pentru tipurile IR, introducnd
trei interfee abstracte (interfee ce nu pot fi instaniate): IRObject, Contained si Container. Aceast
ierarhie este reprezentat n figura 7.2.
IRObject
Contained
AttributeDef
Container
ExceptionDef
ConstantDef
TypeDef
InterfaceDef
ParameterDef
OperationDef
Repository
ModuleDef
8. Protocoale Inter-ORB
nainte de CORBA 2.0, produsele ORB comerciale nu puteau inter-opera. CORBA 2.0 introduce
conceptul de inter-operabilitate i definete dou moduri de inter-operabilitate: cea direct i cea bazat
pe o punte. Inter-operabilitatea direct este posibil ntre dou ORB-uri din acelai domeniu: care
neleg aceleai referine de obiecte, acelai sistem de tipuri IDL i care partajeaz aceei informaie de
securitate. Inter-operabilitatea bazat pe o punte (bridge) se folosete atunci cnd dou ORB-uri din
domenii diferite trebuie s coopereze.
Inter-operabilitatea se bazeaz pe un protocol general: GIUP General Inter-ORB Protocol, care
specific sintaxa de transfer i un set standard de formate de mesaje pentru inter-operarea ORB peste o
legtur de transport orientat pe conexiuni. IIOP Internet Inter-ORB Protocol descrie construcia
GIOP pe legturi de transport TCP/IP.
9.2.
Serviciul de evenimente
9.3.
Serviciul de securitate
10.
Implementri ORB
Java ORB este un ORB scris n ntregime n Java. Cu Java ORB, un applet obinuit poate invoca
metode ale obiectelor CORBA folosind IIOP. Appletul ocolete complet CGI i HTTP, ntre client i
server stabilindu-se o legtur direct. Trei dintre cele mai cunoscute Java ORB sunt:
Joe de la Sun
OrbixWeb de la Iona
10.1. Joe
Produsul NEO de la Sun include:
Solaris NEO mediu ce conine suportul de execuie necesar pentru aplicaiile NEO/JOE
Joe este un Java ORB pentru clieni. El poate fi ncrcat odat cu un applet Java sau poate fi instalat
permanent pe maina client. Joe include un compilator IDL-TO-Java care genereaz automat stub-uri
Java din descrieri IDL. n prezent, obiectele server trebuie scrise pentru platforma NEO, care suport C
i C++. Versiunea IIOP pentru Joe va fi capabil s comunice cu orice Java ORB care suport IIOP.
C++
NEO
applet Java
C++
Joe
Java
application
C++
Server Solaris
IIOP
C++
C++
IIOP ORB
Java
Sun IIOP Server
10.2. Orbix
Iona este liderul furnizorilor de tehnologie CORBA. Produsul su Orbix ORB este executat pe 20 de
sisteme de operare (Unix, OS/2, NT, Windows 95, Macintosh, VMS).
OrbixWeb V1 este o implementare Java pentru clieni; care permite applet-urilor i aplicaiilor Java s
comunice cu servere Orbix folosind fie protocolul IIOP, fie protocolul Orbix (Iona).
n prezent, obiectele server trebuie scrise n C++. Oricum, OrbixWeb V2 va permite elaborarea lor n
Java.
C++
IIOP/Orbix
applet Java
C++
C++
IIOP /Orbix
OrbixWeb
Java
application
IIOP / Orbix
C++
C++
IIOP/Orbix
Java
OrbixWeb V2
10.3. VisiBroker
Are dou variante: VisiBroker for C++ si for Java.
VisiBroker for Java este un ORB client i server scris n Java.
Java
VisiBroker for Java
applet Java
Java
Java
IIOP
Orice server Java
IIOP
C++
C++
VisiBroker va suporta versiuni Java pentru serviciile Naming, Event, Transactions. Suport, de
asemenea, Caffeine un mediu de dezvoltare Java peste CORBA/IIOP. Caffeine face CORBA
transparent pentru programatorii Java: obiecte Java pot invoca alte obiecte prin CORBA IIOP ORB,
fr a fi necesare descrieri IDL.
11.
Nivel 1
Nivel 2
ORB
ORB
CORBA
IIOP
O
R
B
DBMS
Lotus
Notes
ORB
Obiecte de
vizualizare
Nivel 3
obiecte
Pagin
i
HTM
L
Aplicaii tradiionale
CGI Gateway
program rezident n serverul Web
script (Unix shell, Perl, etc) sau program executabil (C, C++, etc.)
single step include i funciile aplicaiei, care uzual sunt foarte simple (scurte)
two step un program de aplicaie ruleaz ca un proces daemon, iar CGI Gateway joac rolul
de dispecer.
Acest mod de utilizare se bazeaz pe faciliti de form pe care HTML le include i care permit
transmiterea unor informaii de la browser la server.
Soluia este lent i greoaie.
Java introduce un model nou al interaciunilor client/server pentru Web. El permite scrierea unor
programe, applets, care pot fi ncrcate din server n clieni (ce sunt Java-compatibili) i executate
de clieni. Se mrete astfel interactivitatea i inteligena clienilor. Java permite crearea unor aplicaii
client independente de platform, ce pot fi distribuite prin Internet.
Java este la fel de bun pentru servere. Se pot scrie programe pentru servere mobile, utilizabile n
combinaii foarte diverse.
Permite evitarea gtuirilor CGI la server; clienii pot invoca direct metode pe un server; pot fi
communicate date cu tip nu doar iruri de octei; CORBA pstreaz starea ntre dou invocri
ale unui client (CGI nu!).
Permite realizarea unei infrastructuri flexibile de servere, obiectele pot rula pe mai multe
servere i se poate face echilibrarea ncrcrii.
Realizarea unor convertoare bidirecionale HTTP-IIOP i a unui server CORBA HTTP care
servete cererile HTTP (aici, CORBA nlocuiete total HTTP).
Applet-ul invoc obiecte server CORBA. Sesiunea ntre ele persist pn cnd una din pri
decide s se deconecteze.
12.
Dintre produsele de middleware utilizate azi, cteva atrag atenia prin modelul de arhitectur
distribuit pe care se bazeaz:
CORBA - Common Object Request Broker Architecture al OMG (Object Management Group)
Relaia ntre diferitele arhitecturi distribuite este ilustrat n figura 2. Ea arat c aceste modele aflate
n competiie se completeaz reciproc i se integreaz la diferite niveluri.
Un model de document compus, OLE (Object Linking and Embedding), cu servicii pentru
realizarea de legturi ntre documente compuse sau pentru gestiunea documentelor compuse;
Pentru aplicaii Web Microsoft propune ActiveX, un set de tehnologii adaptate particularitilor Web,
incluznd ActiveX Componentns, ActiveX Scripting i ActiveX documents. Adaptrile vizeaz
obinerea unor componente optimizate ca dimensiune i vitez, ceea ce uureaz ncrcarea lor prin
reea pe maina clientului. Astfel, componentele ActiveX se conformeaz modelului COM i abordrii
OLE.
Java este limbajul care a revoluionat aplicaiile Web. Abordarea standard original prevedea
posibilitatea ca obiecte Java rezidente pe un server s fie transferate la un client pentru execuie.
Limbajul nu prevedea servicii distribuite. Obiectele unei aplicaii trebuia s rezide ntr-un singur
server, iar obiectele erau "perisabile", pierzndu-i informaia de stare pe perioada de inactivitate. Java
RMI rezolv aceste probleme, fiind nceputul dezvoltrii unei arhitecturi de obiecte distribuite. Prin el,
se pot crea obiecte Java ale cror metode pot fi invocate din alte maini virtuale. Ca alternativ de
evoluie, Java va trebui s integreze capabilitile distribuite din CORBA sau s-i dezvolte propriile
sale capabiliti. Prima variant a i fost abordat: produsul Caffeine (produs de Netscape i Visigenic)
permite descrierea obiectelor distribuite direct n Java, oferind un suport transparent al RMI peste
IIOP. Caffeine genereaz automat stub-urile i skeleton-urile IIOP. Poate genera chiar i descrierile
IDL din bytecode-uri Java. Java are dou avantaje importante: este uor de folosit i codul poate fi
ncrcat prin reea i executat. Un client poate localiza un serviciu de interes pentru el, poate ncrca
interfaa corespunztoare i poate interaciona apoi cu serviciul. Aceast manier de lucru este tipic
limbajelor de programare a Web-ului.
Lucrarea de fa analizeaz comparativ aceste soluii, principalele rezultate fiind prezentate n tabelele
urmtoare. Ca element de referin a fost ales modelul CORBA, elaborat de OMG, care satisface
cerinele unui mare numr de dezvoltatori de aplicaii distribuite.
Caracteristic
Suport pentru
Servicii comune
Servicii diferite
Model de
programare
Interfa
Extensibilitate
Standardizare
Implementri
disponibile n
CORBA
Dezvoltarea aplicaiilor client-server
eterogene
Cataloage, timp, threads, securitate,
evenimente, gestiune reea
Persisten, query, trader, tranzacii,
gestiunea
informaiilor
i
a
sistemelor, servicii n finane,
simulare distribuit, CIM
Obiect, cu suport pentru ncapsulare,
abstractizare, polimorfism, motenire
Invocare static i dinamic
Da
CORBA 1.0 n 1991
1993
DCE
Dezvoltarea aplicaiilor client-server
eterogene
Cataloage, timp, threads, securitate,
evenimente, gestiune reea
Sistem de fiiere distribuit
Diferenele notabile provin din stilurile de programare adoptate: n timp ce CORBA se bazeaz pe un
model de obiecte, DCE are la baz un model procedural, n care apelurile de proceduri la distan
(RPC - Remote Procedure Call) constituie "piesa" central.
DCE are un scop mai restrns, fiind concentrat pe un set redus de servicii. CORBA vizeaz un set de
servicii mai amplu. Ca urmare, implementarea DCE a atins un nivel de maturitate ridicat, n timp ce
unele servicii CORBA sunt nc n curs de dezvoltare.
esenial, fiecare obiect avnd o interfa care poate deriva din altele, n DCOM agregarea este mai des
folosit. Un obiect poate avea mai multe interfee independente, fr relaia de motenire ntre ele.
Caracteristic
Concepie
CORBA
Ca schem de interoperare eficient a
aplicaiilor scrise n diferite limbaje
pentru platfome diferite (eterogene)
MVS, UNIX (diferite versiuni),
Windows
(toate
versiunile),
Macintosh
DCOM
Schem de integrare a documentelor
compuse i extins la prelucrare
distribuit
Platforme
Bine integrat ntr-o singur platform,
Windows NT; n perspectiv
extindere la toate versiunile de
Windows, Macintosh, UNIX, MVS
Servicii
Orientat pe anumite categorii de Poate folosi orice servicii oferite de
servicii bine definite: persisten, Windows (ActiveX)
query, trader, tranzacii, gestiunea
informaiilor i a sistemelor, servicii
n finane, simulare distribuit, CIM
Limbaje
C, C++, Smalltalk, Ada95, Java, C, C++; n curs - Java, Visual Basic,
suportate
COBOL
Ada
Model de baz Obiect; cu accent pentru persistena i Obiect
identitatea obiectelor
Interfee
Separare interfa de implementare
Similar, Type Library
Depozit de interfee
Independen Da
Da
de limbaj
Transparen
Da
Da
la localizarea
obiectelor
Model
de OpenDoc
OLE
document
compus
Uurina
de Mai greu de folosit - util pentru Uor de folosit pentru mediul
folosire
probleme complexe (nu este nativ pe Windows
un mediu particular i cere
acomodarea
programatorului
n
fiecare mediu)
Un obiect DCOM nu este un obiect n adevratul sens al cuvntului. Interfeele DCOM nu pot fi
instaniate i nu au stri. O interfa DCOM este un grup de funcii, clientului dndu-i-se un pointer
pentru a avea acces la aceste funcii (mai precis un pointer la un tablou de pointeri la funcii, cunoscut
sub numele de vtable - virtual table). Aceasta justific eticheta de standard de "interconectare binar"
asociat cu DCOM (respectiv OLE). Deoarece acest pointer nu este legat de vreo informaie de stare,
un client nu se poate reconecta la o aceeai instan de obiect, la un moment ulterior. Deci, DCOM nu
are noiunea de identitate a obiectului, n timp ce aceasta este foarte bine structurat n CORBA.
Ca i CORBA, DCOM ofer interfee statice i dinamice pentru invocrile metodelor, ca i depozite de
interfee (Type Library). Clienii pot inspecta aceste depozite pentur a descoperi interfeele unui obiect
i parametrii necesari pentru o invocare particular.
IDL joac un rol imporant n CORBA, att pentru a defini sistemul de tipuri, ct i pentru a preciza
modul de transmitere a datelor prin reea. Similar, ODL (Object Definition Language) din OLE
definete sistemul de tipuri, iar MIDL specific modul n care parametrii i identificatorii operaiilor
sunt specificai ntr-un apel ctre un obiect OLE. Compilatorul NT 4.0 MIDL extinde IDL pentru a
suporta construciile ODL, reunind astfel cele dou limbaje.
Caracteristic
Model
Creare de obiecte la distan
Faciliti de broker
Limbaje suportate
Obiecte autodescrise
Depozite de obiecte
Invocri dinamice
Servicii
de
securitate,
tranzacii etc.
CORBA
Obiect
Da
Da
C, C++, Smalltalk, Ada95, Java, COBOL
da
da
da
da
Java RMI
Obiect
Da
Da
Java
nu
nu
nu
nu
Java este un excelent limbaj pentru a descrie obiecte CORBA. Apoi, Java complementeaz serviciul de
componente din CORBA, bazat pe OpenDoc. n timp ce CORBA definete containere vizuale pentru
componente, i containere de memorare mobile, Java poate furniza "boabele" care evolueaz n aceste
containere. Mai mult, facilitile de cod mobil din Java permit partiionarea unei aplicaii ntre client i
server, la momentul execuiei. Java simplific distribuia codului n sistemem CORBA mari, printr-o
gestiune centralizat a cosului pe server i difuzarea codului la clieni, cnd i unde este necesar.
n compensaie CORBA aduce trei beneficii imediate aplicaiilor Web:
Permite evitarea gtuirilor CGI prin invocarea direct, de ctre client, a metodelor serverelor;
Faciliteaz o infrastructur scalabil de servere (obiectele server pot comunica folosind CORBA
ORB)
CORBA extinde Java cu o infrastructur de obiecte distribuite, astfel nct un applet este n stare
s comunice cu orice obiect, indiferent de limbajul n care este scris i de localizarea n reea.
Sintetiznd, diferenele dintre abordarea HTTP i CORBA sunt prezentate n urmtorul tabel:
Caracteristic
Pstrarea strii ntre invocri
IDL, Interface Repository
Suport metadate
Invocare dinamic
Tranzacii
Securitate
Servicii bazate pe obiecte
Callbacks
Infrastructur server-server
Scalabilitate
Metode IDL
Java CORBA
DA
DA
DA
DA
DA
DA
DA
DA
DA
DA
DA
Java - CGI
NU
NU
NU
NU
NU
DA
NU
NU
NU
NU
NU
DCOM (Distributed Component Object Model) este principalul rival al alianei Java/CORBA,
considerat actualmente un standard de facto, datorit rspndirii sale. Este fundamentul viziunii
Microsoft asupra Internet-ului.
DCOM, la fel ca i CORBA, separ interfaa de implementare cernd ca toate interfeele s fie descrise
folosind un IDL. Microsoft IDL se bazeaz pe DCE i nu este compatibil cu CORBA (aa cum era de
ateptat). n timp ce CORBA se bazeaz pe modelul clasic de obiecte, DCOM nu face acest lucru. O
component DCOM nu suport motenire multipl, ns poate implementa mai multe interfee, astfel
nct reutilizarea codului nu se obine prin motenire, ci prin agregare.
Sintetiznd, principalele aspecte legate de comparaia Java/CORBA DCOM sunt prezentate n
tabelul urmtor:
Caracteristic
ORB scris n java
Platforme suportate
Transfer de parametri
Configurare
Descrcare dinamic a stub-urilor
Descrcare dinamic a claselor
Transfer obiecte prin valoare
Interfaa - IDL
Aflare dinamic a informaiilor
Invocare dinamic
Performane
Securitate
Serviciu de nume
Recunoate URL
Referine persistente la obiecte
Invocaii multilimbaj
Scalabilitate
Protocol ORB standard
Java/CORBA
DA
Toate
In, out, in/out
Uoar
NU
NU
DA
DA
DA
DA
F. rapid
DA
DA
DA
DA
DA
DA
DA
DCOM
NU
Windows
In, out, in/out
Grea
NU
NU
NU
DA
DA
DA
Rapid
DA, pe NT
NU
NU
NU
DA
NU
Posibil
Dei CORBA a luat un start promitor, DCOM este o ameninare serioas la supremaia Web-ului.
Fcnd acum sinteza tehnologiilor Internet existente, putem vedea c, per ansamblu, CORBA deine
cele mai bune performane. Acest lucru este ilustrat n tabelul urmtor, unde se folosete un sistem de
notare asemntor celui de apreciere a filmelor: cinci stele maxim, o stea minim.
Caracteristic
Nivel de abstractizare
Integrare Java
Sisteme de operare suportate
Implemenatare Java
Parametri cu tip
Uurin de configurare
Invocare de metode distribuite
Salvare stare ntr invocri
Invocare dinamic
CORBA
*****
*****
*****
*****
*****
****
*****
*****
*****
DCOM
*****
****
***
**
*****
*
****
****
*****
RMI
*****
*****
*****
*****
*****
****
****
****
**
HTTP/ CGI
***
***
*****
*****
**
****
*
*
*
Sockets
**
***
*****
*****
**
****
*
***
*
Caracteristic
Performane
Securitate
Tranzacii
Obiecte persistente
Recunoatere UTL
Invocare multilimbaj
Scalabilitate
Standard deschis
13.
CORBA
*****
*****
*****
*****
****
*****
*****
*****
DCOM
****
*****
****
**
**
****
**
***
RMI
****
****
*
*
***
*
**
***
HTTP/ CGI
*
****
*
*
*****
****
***
*****
Sockets
*****
****
*
*
****
*****
*****
*****
Concluzii
Tehnologia este mai dezvoltat dect RMI (CORBA este propus nainte de Java).
Permite evitarea gtuirilor CGI la server; clienii pot invoca direct metode pe un server; pot fi
communicate date cu tip nu doar iruri de octei; CORBA pstreaz starea ntre dou invocri
ale unui client (CGI nu!).
Permite realizarea unei infrastructuri flexibile de servere, obiectele pot rula pe mai multe servere
i se poate face echilibrarea ncrcrii.
Bibliografie selectiv
1. S.Baker, CORBA Distributed Objects Using Orbix, Addison Wesley 1997
2. T.J.Mowbray, W.A.Ruh, Inside CORBA, Distributed Object Standards and Applications, Addison
Wesley 1997
3. D.E. Comer, D.L. Stevens Internetworking With TCP/IP Prentice Hall, 1993
4. S. Beaker, V.Cahill, P.Nixon, Bridging Boundaries: CORBA in Perspective, n IEEE Internet
Computing Vol.1, No.5, Sept/Oct 1997
5. E.Evans, D.Rogers, Using Java applets and CORBA for Multi-User Distributed Applications, n
IEEE Internet Computing Vol.1, No.3, May/June 1997
6. C. McFall, An Object Infrastructure for Internet Middleware; IBM on Component Broker, n IEEE
Internet Computing Vol.2, No.2, March/April 1998
7. R. Ben Natan Objects on the Web, McGraw Hill 1997
8. A. Umar, Object Oriented Client/Server Internet Environments, Prentice Hall 1997
9. www.microsoft.com, DCOM Architecture
10. www.sun.com, Java RMI Specification
11. J. Boutell , CGI Programming in C and Perl, Addison Wesley, 1997