Föregående föreläsning • Olika nivåer av meddelanden. Från oblockad sändning till request/reply • Extern data representation • Utökning av traditionella programmeringsmodeller – Remote Procedure Call, RPC – Remote Method Invocation, RMI – Händelsestyrda distribuerade system 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 1 Middleware Applications RMI, RPC and events Middleware layers Request reply protocol External data representation Operating System • Mjukvara som tillhandahåller en programmeringsmodell • Abstraherar detaljer kring hårdvara, OS, programspråk och kommunikationsprotokoll 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 2 RPC - I klienten client process server process Request Reply client stub procedure client program 10/9 - 02 Communication module server stub procedure Communication dispatcher module Distribuerade system - Jonny Pettersson, UmU service procedure 3 1 Implementation av RMI server client object A proxy for B skeleton & dispatcher for B’s class Request remote object B Reply Communication Remote reference module module Communication Remote reference module module 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 4 Distribuerad händelsehantering Event service subscriber object of interest 1. notification object of interest 2. object of interest subscriber observer notification notification observer 3. subscriber notification 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 5 Dagens föreläsning • • • • • SUN RPC Java RMI CORBA Genomgång av laboration 2 Gruppövning 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 6 2 Middleware - Frågetecken • Hur sker parameterpassning och dataomvandling? • Hur hittar man distribuerade funktioner/metoder? • Hur sker felhanteringen i en distribuerad miljö? • Hur blir det med säkerheten? • Kompilering? 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 7 Sun RPC • Kallas även ONC RPC • Det mest spridda biblioteket/programvaran för RPC • God litteratur – Brown, Unix Distributed Programming, Prentice-Hall – rpc(3N) – RFC 1831+ • Finns för (alla?) Unix. Finns för C, Java, Perl, mfl. • Nätverk kan vara TCP, UDP, HTTP, mfl. 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 8 Sun RPC - Parametrar och Data • Språket XDR (eXternal Data Representation) används för att specificera datatyper. XDR har stöd för: – fundamentala typer – sammansatta typer (arrayer, strukturer, avancerade datatyper) • XDR använder en enkel kanonisk form – Endast en datarepresentation, ingen “överrenskommelse” görs – Implicit typning används, mottagaren vet vad som ska komma 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 9 3 Sun RPC - XDR-filter - exempel • license.x const CAR = 0; const TRUCK = 1; union vehicleunion switch (int vehicletag) { case CAR: void; case TRUCK: double weight; }; struct license { int birthday[3]; /* year, month, day */ string name<>; vehicleunion vehicle; }; 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 10 Sun RPC - Registrering • Utökning av XDR. Utöka licence.x: program MYPROGRAM { version MYVERSION { license getlicense(int) = 1; } = 2; } = 0x20000099; • Första positionen i programnumret – – – – 0-1 är reserverade av Sun 2-3 är användardefinierade 4-5 är temporära programnummer 5-F är reserverade • Kör rpcinfo -p 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 11 Sun RPC - Registrering 2 • Sker i princip automatiskt, från .x-filen. Bara att länka med de _clnt, _svc och _xdr-filer som rpcgen skapar • Sedan exekverar man serverprogrammet, som registrerar servicen • Klienten skapar en uppkoppling till servern med clnt_create, som kontaktar portmappern, hittar servern, och kopplar upp 10/9 - 02 main.c license.x getlicense.c rpcgen license_clnt.c license_xdr.c client Distribuerade system - Jonny Pettersson, UmU license.h license_svc.c server 12 4 Sun RPC - Felhantering • Vad kan hända – Maskinen som klienten försöker anropa finns inte: clnt_create() returnerar NULL – Programmet kan inte köras/hittas: Användarfunktionen returnerar NULL – Applikationsfel: Upp till applikationsdatat 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 13 Sun RPC - Säkerhet • Fyra typer av autenticering: – Ingen (AUTH_NONE): Ingen autenticering. Klienten har ingen aning om den kommer rätt. Servern har ingen aning om vem klienten är. – Unix-style (AUTH_UNIX): Klienten skickar vem han är och från vilken burk. Om någon skriver en egen RPC-klient är det knäckt. – DES (AUTH_DES): Klienten och servern visar vem de är genom att DES-kryptera sin tid. – Kerberos (AUTH_KERB) 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 14 Sun RPC - Kompilering • Bäst att utforska själv: – www.cs.umu.se/kurser/TDBC85/HT02/libretto/slides/rpc_exempel • Prova provocera den. Studera vilka fel som du kan generera. • Laborera med: – Mer komplicerade datatyper – Mer komplicerade serverrutiner. Multitrådar? 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 15 5 Java Remote Method Invocation • Tydlig parallell med RPC • Men skillnaden finns där: – Java RMI är objektorienterat – Java RMI bygger på JVM (Java Virtual Machine) • Inget speciellt språk för datatypsdeklaration, dock måste – ett objekt som anropar en fjärrmetod hantera RemoteExceptions – och fjärrobjektet måste implementera Remoteinterfacet • Mer information - java.sun.com 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 16 Java RMI - Parametrar och Data • Utnyttjar att JVM och Javas typer är binärkompatibla • Bygger på att typer är serialiserbara (java.io.serializable) • Tre typer av parameterpassning: – Primitiva typer: Call-by-value – Objekttyper: Call-by-copy (skiljer sig från Java) – Fjärrobjekttyper: Call-by-refence (som Java) • Deklareras som interface 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 17 Java RMI - Registrering • Binder – rmiregistry, opererar normalt på port 1099 – Kommunikationen sker utanför rmiregistry • Servern – Binder ett objekt (av referenstyp) till ett namn (sträng) hos rmiregistry. Exempel: Naming.rebind(“rmi://peppar/MyServiceObject”, object); • Klienten hittar objekt med: Nåja, nästan. Naming.lookup(“rmi://peppar/MyServiceObject”); 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 18 6 Java RMI - Felhantering • Exceptions – Vanligast: java.rmi.RemoteException – Kan tex vara en ConnectException – Dessa måste man ta hand om - Bra 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 19 Java RMI - Säkerhet • Serverns main-metod bör skapa en “security manager” för att få lämplig säkerhet för RMI servern • Default: RMISecurityManager – Skyddar lokala resurser • Om ingen “security manager” anges kan proxies och klasser bara laddas via lokal path 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 20 Java RMI - Kompilering • Vid överföring av referensobjekt (exv det objekt man binder), krävs det att man: – Kompilerar interface-deklarationen (som ärver av java.rmi.Remote) – Kör rmic för att generera stubbe och skelett – Kompilera implementationsklassen • För de andra typerna (primitiva och objekttyper) behöver man inte göra något särskilt (förutom ärva java.io.Serializable) 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 21 7 Java RMI - Exempel • Två implementationer av den körkortsdatabas som implementerades med Sun RPC • En där vi helt enkelt frågar efter körkortet och får det returnerat • Och en där vi istället för ett körkort får en referens till ett körkort • Koden – www.cs.umu.se/kurser/TDBC85/HT02/libretto/slides/rmi_exempel1 – www.cs.umu.se/kurser/TDBC85/HT02/libretto/slides/rmi_exempel2 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 22 Java RMI - Exempel 1 • “Licens”-databas. Fem klasser: – License: Innehåller bara data, en konstruktor och en hjälpmetod – LicenseDatabase: Innehåller ett interface, som visar vad vi kan göra med databasen – LicenseDatabaseImpl: Implementationen av denna databas – LicenseServer: Enkel klass, som binder implementationen till namnet LicenseDatabaseService – LicenseClient: Hämtar en referens till databasen, genom att fråga efter LicenseDatabaseService, och ställer en fråga 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 23 Java RMI - Exempel 1 (bild) 2. Klienten frågar efter LicenseDatabaseService, får en LicenseDatabase 1. Servern registrerar LicenceDatabaseImpl som en LicenseDatabase rmiregistry LicenseDatabase LicenseDatabase LicenseDatabase LicenseServer LicenseClient LicenseDatabaseImpl License 4. Serverns LicenseDatabaseImpl får anropet, returnerar en License 5. License överförs som vanligt (endast data) 3. Klienten anropar LicenseDatabase:ns getLicense med en int, som överförs som vanligt, tillsammans med en referens till LicenseDatabase 6. Klienten anropar License:ns myToString, som ett vanligt, lokalt, metodanrop. 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 24 8 Java RMI - Exempel 1 - Exekvering • Starta tre X-fönster varav två på samma maskin • Gå till biblioteket med källkoden i alla fönster. Gör make • I fönster 1: – /usr/bin/rmiregistry port • I fönster 2 (samma dator som fönster 1): – /usr/bin/java LicenseServer port • I fönster 3: – /usr/bin/java LicenseClient servernamn port • Varför måste fönster 1 och 2 vara i samma dator? 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 25 Java RMI - Exempel 2 • Sex klasser: – LicenseDatabase, LicenseDatabaseImpl, LicenseServer, LicenseClient: som tidigare (fast med nya funktioner) – License: Nu ett interface till en (fjärr)referensklass – LicensseImpl: Implementationen av Licensec • Nu måste rmic köras två gånger: En gång för License och en gång för LicenseDatabaseImpl 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 26 Java RMI - Exempel 2 (bild) 1. rmiregistry LicenseDatabase 2. LicenseDatabase LicenseDatabase License LicenseClient 3. LicenseServer LicenseDatabaseImpl LicenseImpl License String 5. Licensereferensen överförs som referens… 8. LicenseImpl får anropet, returnerar en String, som är en serialiserbar typ, och därför... 4. LicenseDatabaseImpl får anropet, returnerar en License, som är en referens till en LicenseImpl 10/9 - 02 6. Klienten anropar myToString på Licensen. Men eftersom det är en referens, så… 9. …skickas den som vanligt data. 7. …skickas den tillbaka till servern. Distribuerade system - Jonny Pettersson, UmU 27 9 Java RMI - Exempel - Slutsats • Kraftfull modell – Ger snygg transparens mellan lokala och perifera objekt • Var ska objekten egentligen finnas? – Fördel med lokala objekt • Snabb åtkomst – Fördelar med fjärrobjekt • Kan fungera som referenser till databaser • Servern har fortfarande kontroll över vilken information som lämnas ut 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 28 Java RMI - Detaljer • Servern kan utföra client callbacks genom att klienten skickar över RemoteObjects som refererar till egna, lokala objekt • Implementerar en distribuerad garbage collection som hanterar fjärreferenser till lokala objekt • Har stöd för automatisk distribution av klasser (kod) • Stöd för reflektion 10/9 - 02 Distribuerade system - Jonny Pettersson, UmU 29 Java RMI - Brandväggar • Konstruerat med tanke på brandväggar: – Endast en TCP-uppkoppling mellan datorerna – Kommunikationen multiplexas på uppkopplingen – Kan operera via HTTP-protokollet proxy RMIklient 10/9 - 02 http webserver http säkerhetshål RMIserver Distribuerade system - Jonny Pettersson, UmU 30 10