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