HOJ RPC = Remote Procedure Call (ja Common Object Request Broker Architecture) Ville Leppänen HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.1/36
Missä mennään... 1. Johdanto (1h) 2. Säikeet (2h) 3. Samanaikaisuudesta (2h) 4. Hajautetuista sovelluksista (1h) 5. Soketit (3h) 6. RMI ja J2EE (2h) 7. RPC (1h) 8. WWW-sovellustekniikoista (2h) 9. Pilvialustat (4h) 10. Haja-aiheita (2h) 99. Kertausluento (2h) + 1h pelivaraa HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.2/36
Remote Procedure Call, RPC Birrell & Nelson (1984) (vaikka keskusteltu jo aiemmin kirjallisuudessa). RFC 1057 (vähän ympäripyöreä). RPC:n (Remote Procedure Call) idea on välittää (UDP:n tai TCP:n avulla) verkon yli proseduurin kutsu(ja) argumentteineen ja palauttaa takaisin etäällä suoritetun proseduurin tulos. Syy irrottaa proseduuri etäproseduuriksi liittyy yleensä työmäärään tai keskitettyyn suureen tietomäärään (jota ei ole järkevä kopioida moneen paikkaan). RPC:ssä, etäproseduurin kutsu näyttää ohjelmassa tavalliselta metodin kutsulta. Toteutus (kommunikointi verkon yli) on näkymätön ohjelmoijan kannalta. C-pohjainen ei olioita kuten RMI:ssä. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.3/36
RPC:n toteutus Paikallinen RPC-kutsu näyttää normaalilta kutsulta. Jotta tämä olisi mahdollista, todellista proseduuria vastaten pitää määrittää rajapinta ja sille toteutus paikalliseen koneeseen. Jokainen paikallinen RPC-kutsu on edustaproseduurin (client stub) kutsu, joka hoitaa kommunikoinnin etäkoneen kanssa. Etäkoneessa (palvelimessa) on etäkutsupalvelin (server stub), joka odottaa etäkutsun tiedot sisältäviä viestejä. Palvelin tulkitsee viestin ja suorittaa muistiavaruudessaan vastaavaan etäproseduurin palauttaen tuloksen takaisin. (Stub = tynkä) HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.4/36
RPC-kutsu käytännössä 1. Kutsuva ohjelma kutsuu edustaproseduuria kuten muitakin paikallisia proseduureja. 2. Edustaproseduuri koodaa parametrit viestiin ja lähettää viestin. 3. Etäkutsupalvelin ottaa viestin vastaan, purkaa sen ja kutsuu vastaavaa etäproseduuria. 4. Etäkutsupalvelin koodaa tuloksen viestiin ja lähettää sen takaisin. 5. Paikallinen edustaproseduuri ottaa viestin vastaan, purkaa tuloksen ja palauttaa sen paikalliselle ohjelmalle. 6. (Edellisessä: synkroninen RPC-kutsu.) HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.5/36
Parametriongelmia Etäproseduurikutsujen toteuttaminen olisi helppoa, jos kaikki parametriarvot olisivat skalaariarvoja ja molemmat RPC-järjestelmät olisivat samoja. RPC-toteutukset perustuvat usein alla olevaan käyttöjärjestelmään ja siinä tiedon esitysmuoto voi vaihdella. Parametrien koodauksen (mashalling) täytyy ottaa tämä huomioon. (XDR) Jotkin paikalliset parametrit voivat olla viiteparametrejä. Jos sallittua, marshallointi tarkoittaa viitatun rakenteen kopiointia. Tulisiko muutosten heijastua takaisin? Mahdollista! Copy/restore-parametrit! HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.6/36
Kohti RPC-sovelluksia Koneessa pitää olla RPC:n toteutus. Useita saatavilla. (Kokeile esim. Unixissa man rpcgen.) Helpoin tapa tehdä RPC-sovellus on käyttää rajapintakieltä Interface Definition Language (IDL), jonka avulla määritellään kutsuttavien etäproseduurien muoto. Järkevää, koska IDL kuvausta käyttäen voidaan generoida edustaproseduuri ja etäkutsupalvelin (+muuta)!! rpcgen: ei IDL vaan RPC Language kuvaus rajapinnasta. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.7/36
Esimerkki: DCE RPC http://www.opengroup.org/dce/ Open Software Foundation (OSF) on tehnyt RPC-toteutuksen nimeltä Distributed Computing Environment useille käyttöjärjestelmille. DCE RPC tarjoaa välikerroksen käyttöjärjestelmän ja hajautettujen sovellusten välille. Seuraavan kalvon kuva näyttää, miten tehdä DCE RPC-sovellus käytännössä (asiakas- ja palvelinpää). HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.8/36
DCE RPC Uuidgen Interface definition file IDL compiler Client code Client stub Header Server stub Server code #include #include C compiler C compiler C compiler C compiler Client object file Client stub object file Server stub object file Server object file Linker Runtime library Runtime library Linker Client binary Server binary HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.9/36
DCE RPC-sovellusten tekeminen IDL description + client code + server code = app. Rajapintakuvaus on kirjoitettu IDL-kielellä ja kuvaus on kaikkia yhteensitova liima. Jokaisella kuvauksella tulee olla yksikäsitteinen tunnistenumero. Asiakas sidotaan etäkutsupalvelimeen hakemistopalvelun avulla. Palvelimessa on käynnissä DCE daemon, joka tunnistaa sisääntulevat RPC-viestit ja välittää ne oikealle prosessille. Varsinainen RPC-kutsun toteutus on normaali: koodaus, viestin lähettäminen, purkaminen, prosessointi, (tuloksen) koodaus, lähettäminen, purkaminen. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.10/36
Sun RPC-esimerkki Ei ilmeisesti ole aivan samanlainen kuin DCE RPC. Esimerkki (dice.x, dice_prog.c, rdice.c) on kurssin kotisivulla. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.11/36
Miten käyttää esimerkkiä Generoi rajapinnat rpcgen dice.x Käännä client gcc rdice.c dice_clnt.c -o dice_client -lnsl Käännä server gcc dice_prog.c dice_svc.c -o dice_server -lnsl Serverin käynnistys./dice_server Clientin käynnistys./dice_client staff.cs.utu.fi 10 HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.12/36
dice.x /* dice.x: Remote random dice protocol */ program DICEPROG { version DICEVERS { int GETDICE(string) = 1; } = 1; } = 0x20000001; HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.13/36
Palvelimeen: dice_prog.c /* * dice_proc.c: implementation of the * remote procedure "getdice" */ #include <stdio.h> #include "dice.h" /* dice.h generated by rpcgen */ #define RANDOM random long random(); int * getdice_1_svc(char **who, struct svc_req *req) { static int result; /* must be static! */ result = (unsigned long int)(random()%6) + 1; printf("sending %d back to %s\n", result, *who); return (&result); } HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.14/36
Asiakas: rdice.c 1/3 /* * rdice.c: main program for getting random dice numbers */ #include <stdio.h> #include "dice.h" /* dice.h generated by rpcgen */ main(int argc, char **argv) { CLIENT *clnt; int *result; char *server; int howmanytimes,i; if (argc!= 3) { fprintf(stderr, "usage: %s host number\n", argv[0]); exit(1); } HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.15/36
Asiakas: rdice.c 2/3 server = argv[1]; sscanf(argv[2],"%d",&howmanytimes); if (howmanytimes < 1) howmanytimes = 1; // Create client "handle". clnt = clnt_create(server, DICEPROG, DICEVERS, "tcp"); if (clnt == (CLIENT *)NULL) { // No connection established clnt_pcreateerror(server); exit(1); } HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.16/36
Asiakas: rdice.c 3/3 // Call the remote procedure for (i=0; i<howmanytimes; i++) { result = getdice_1(&server, clnt); printf("got %d \n", *result); } } printf("dice asking from %s done.\n", server); clnt_destroy( clnt ); exit(0); HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.17/36
Huomioita RPC:stä RPC:n viestin voi tehdä itse. RPC:n kirjasto tarjoaa suuren määrään proseduureja asiakkaita ja palvelimia varten. Parametrien koodausstandardi: XDR (external Data Representation). Asiakkaan ja palvelimen voi tehdä alusta alkaen itse tai ne voi toteutusympäristöstä riippuen osittain generoida. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.18/36
Huomioita RPC:stä (jatkoa) IDL-kieli on kohtuullisen rikas. DCE RPC:n IDL-kieli on toiminut pohjana Microsoftin COM:n (ja DCOM:n) IDL-kielelle (lähes identtinen). Kutsun ei tarvitse olla synkroninen kutsuja voi jatkaa suoritustaan ja kun kutsu on valmis, kutsujalle ilmoitetaan. TCP:n tilalla voi olla jokin muu kuljetusmekanismi (XML-RPC: HTTP). RPC ei ole vain C-kielisille ohjelmille esim. XML-RPC toteutuksia on useille kielille: Java, C/C++, Perl, PHP, Python. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.19/36
Corba CORBA (Common Object Request Broker Architecture) on RMIn tapaan arkkitehtuuri hajautetuille järjestelmille. Useita toteutuksia: Sunin J2SE:n mukana tulee Corban toteutus. Katsaus Yleistä Esimerkkejä Corban muita ominaisuuksia HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.20/36
Corba yleiskatsaus CORBA (Common Object Request Broker Architecture) on ryhmän nimeltä OMG (Object Management Group) määrittelemä. OMG perustettu 1989. (www.omg.org.) Tavoitteena on mahdollistaa hajautettujen järjestelmien kehittäminen kieliriippumattomuutta tukien. Ensimmäinen versio 1991. Versio 2.0 vuonna 1996 ja versio 3.0 vuonna 2002. Määrittely on n. 2000 sivua. Tehty ennen RMI:tä ja Javaa. RMI:tä laajempi. Soveltuu myös muille kuin OO-kielille. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.21/36
jatkuu... CORBAn ydin on ORB (Object Request Broker), joka on alustaja kieliriippumaton taso etäkutsujen tekemiseksi. Huolehtii mm. marshalloinnista. Sovelluksissa olevat ORBit keskustelevat GIOP:llä (General Inter-ORB Protocol). Sen TCP/IP-mukaelma on IIOP (Internet Inter-ORP Protocol). Asiakas/palvelin rajapinnat kuvataan Corbassa IDL:llä (Interface Description Language). HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.22/36
IDL esimerkki module Bank { interface Account { typedef double Amount; readonly attribute Amount balance; exception InsufficientFunds { Amount overdraft; }; void withdraw(in Amount x) raises (InsufficientFunds); }; }; HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.23/36
Noppa.idl interface Noppa { void setseed( in long long l ); void setmax( in long m ); void setmin( in long m ); readonly attribute long next; oneway void shutdown(); }; HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.24/36
Corba havainnollistus Client machine Client application Server machine Object implementation Static IDL proxy Dynamic Invocation Interface ORB interface Object adapter Skeleton Dynamic Skeleton Interface ORB interface Client ORB Local OS Server ORB Local OS Network HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.25/36
Corba havainnollistus (2) Interface repository IDL compiler Implementation repository CLIENT operation OBJECT DII IDL stub IDL skel. DSI ORB interface object adaptor GIOP/IIOP ORB CORE HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.26/36
CORBA:n keskeiset osat Edustaolio (client object) kutsuu jotain palvelimessa olevan etäolion (server object, servant) metodia ORBin kautta. Muita komponentteja: IDL (Interface Definition Language) on RPC:n IDL-kieltä muistuttava kieli (yhteyksiä C++:aan ja Javaan). Sillä kuvataan etäolioiden rajapinnat (metodit, attribuutit) mutta ei toteutusta. IDL-kuvauksesta voidaan generoida asiakas- ja palvelintyngät. Asiakastynkä (IDL stub) on etäolion edustaolio. Asiakastyngät ovat kieliriippuvaisia. Kielestä riippuen näyttää metodin tai proseduurin kutsulta. Palvelintynkä (IDL skeleton) on palvelinpuolen osuus, joka kykenee toteuttamaan kutsun palvelimessa. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.27/36
Jatkoa DII (Dynamic Invocation Interface) on vaihtoehtoinen käyttötapa (korvaa asiakastyngän). Joskus staattista IDL-kuvausta (ja siten asiakastynkää) ei ole saatavilla, ja DII:n avulla kutsu voidaan rakentaa dynaamisesti (vertaa Javan reflektioon). DSI (Dynamic Skeleton Interface) on palvelinpuolen vastine DII:lle. Object Adapter kuuntelee verkkoa (kutsuja) ja välittää kutsun palvelintyngälle. (Tukee turvallisuutta, palvelun aktivointia ja deaktivointia.) HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.28/36
Edelleen jatkoa Rajapintavarasto (Interface Repository) on rajapintakuvausten tietokanta, johon voi tehdä hakuja suoritusaikana (DII:n kautta käyttäminen). Toteutusvarasto (Implementation Repository) on edellisen vastine palvelinpuolella sisältäen toteutuskoodia erilaisille etäolioille. IOR (Interoperable Object Reference). IOR on yksikäsitteinen, globaali tunniste, joka jokaisella CORBA-oliolla on. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.29/36
Python: Client esim. import CORBA, Bank orb = CORBA.ORB_init() # Read the IOR written by the server ior = open("/tmp/orbit-python.ior").readline() account = orb.string_to_object(ior) print "Current balance:", account.balance try: account.withdraw(30.00) print "New balance:", account.balance except Bank.Account.InsufficientFunds, data: print "Withdraw failed: overdrawn by", data.overdraft HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.30/36
Python: Server esim. import CORBA, Bank, Bank POA class Account(Bank POA.Account): def init (self): self.balance = 100.0 def withdraw(self, amount): if self.balance - amount < 0: d = Bank.Account.InsufficientFunds() d.overdraft = amount - self.balance raise Bank.Account.InsufficientFunds, d else: self.balance = self.balance - amount orb = CORBA.ORB_init() poa = orb.resolve_initial_references("rootpoa") ref = Account()._this() # implicit activation # Write the IOR to a file to be read by the client open("/tmp/orbit-python.ior", "w").write(orb.object_to_string(ref)) poa._get_the_poamanager().activate() HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.31/36
Java esimerkkejä HelloWorld; ks. http://java.sun.com/j2se/1.4.2/ docs/guide/idl/jidlsamplecode.html Tehdään RMI-esimerkistä Noppa Corba-sovellus... (rmic -idl + idlj -fall + client + server) HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.32/36
Nimeäminen CORBAssa CORBAssa viitteet etäolioihin esitetään IOR-muodossa (Interoperable Object Reference): Tagged Profile Interoperable Object Reference (IOR) Repository identifier Profile ID Profile IIOP version Host Port Object key Components POA identifier Object identifier Other serverspecific information HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.33/36
Nimipalvelu Toimiakseen CORBA vaatii nimipalvelun (kuten RMI), joka kuvaus symbolisista nimistä IOR-muotoon. RMI:n tapaan nimipalvelu tarjoaa rekisteröinti- ja hakupalvelun. Koodissa käytetään/muodostetaan symbolisia nimiä IOR-muotoisten sijaan. Java: orb toteuttaa CORBA-nimipalvelun. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.34/36
Muita CORBAn ominaisuuksia Tukee lukkoja ja transaktioita. Tukee replikointia (ja cachea). Tukee vikasietoisuutta. Tukee kryptausta, autentikointia,...... + paljon muuta. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.35/36
Lopuksi RPC on esitelty välitystekniikkana. Sovellusten tekemisen problematiikka samanlaista kuin RMI:n kohdallakin. Etäproseduurit eivät ole mitään aktiivista, vaan passiivisia palveluita. Ja yleisemmin monisäiesovellusten ongelmat koskien tiedon samanaikaista käsittelyä ovat myös RPC-sovellusten ongelmia. Corba hyvin samanlainen kuin RMI, mutta yleisempi. Kaikkia ominaisuuksia ei kaikissa toteutuksissa. RMI:n ja RPC:n ja samanaikaisuuden ongelmat ovat myös CORBAn ongelmia. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.36/36