Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

DS-kursusgang nr. 6: distribuerede objekter 1. Intro (oversigt over grundl₣ggende begreber og komponenter) 2. De basale designspørgsm ₢ l ved konstruktion.

Lignende præsentationer


Præsentationer af emnet: "DS-kursusgang nr. 6: distribuerede objekter 1. Intro (oversigt over grundl₣ggende begreber og komponenter) 2. De basale designspørgsm ₢ l ved konstruktion."— Præsentationens transcript:

1 DS-kursusgang nr. 6: distribuerede objekter 1. Intro (oversigt over grundl₣ggende begreber og komponenter) 2. De basale designspørgsm ₢ l ved konstruktion af middleware til understøttelse af distribuerede objekter 3. Java's RMI implementation -hvordan man konstruerer, overs₣tter og afvikler Java-programmer med distribuerede objekter 4. Forklaring af øvelsesopgaverne

2 Opgave 1 Hello World ! String sayHello() { return ”Hello World !”; } HelloImpl sayHello() ”Hello World !” Klientprogram: - applet som ikke selv ved hvad den skal skrive ud. Serverprogram: - indeholder distribueret objekt med sayHello() - kunne v₣re kompliceret server, som vi vil styre via browser HelloApplet

3 Hvorfor distribuerede objekter ? Hvis der i øvrigt er gode grunde til at lave en distribueret applikation, tilbyder distribuerede objekter en højniveau (p₣n, abstrakt) gr₣nseflade mellem de enkelte programmer. Gr₣nsefladen = fjernmetodekald Fordele ved højniveau-gr₣nsefladen: - fjernmetodekald eliminerer behov for fejlbeh₣ftet parsing af beskeder - almindelige objekter kan let modificeres til distribuerede objekter

4 Hvad er et fjernt objekt ? Et fjernt (remote) objekt er et objekt - hvis metoder kan kaldes fra andre processer (evt. p ₢ andre maskiner) - dvs. som tillader fjernmetodekald - i Java-sammenh₣ng menes der "anden Virtuel Maskine" i stedet for "anden proces". Bem₣rk - metoden udføres ”lokalt”, i objektets egen proces / VM - normalt den proces objektet er skabt i - der kan v₣re flere samtidige kald Logisk set er der alts ₢ kun 1 objekt, uanset at der kan laves en vis form for dublering eller replikering bl.a. af hensyn til transparens og effektivitet. Distribueret objekt = fjernt objekt, men bruges ogs ₢ i lidt bredere betydning.

5 Distribuerede objekter er generelle begreber, uafh₣ngigt af Java Varianter: Java RMI Corba - sproguafh₣ngigt Besl₣gtet: Sun RPC - fjernprocedurekald CDK definerer "objekt model" (s. 170) og "distribueret objekt model" (s. 172) for at have nogle (rimeligt) veldefinerede begreber som basis for den sprog-uafh₣ngige diskussion af distribuerede objekter.

6 Distribuerede objekter: begreber Interfaces for fjerne objekter Reference til fjerne objekter (”fjernreference” ?) -En objektreference, som logisk set refererer til et fjernt objekt Parameteroverførsel - overførsel af parametre og returv₣rdi for fjerne metoder Marshalling, unmrshalling - forbehandling af argumenter til fjernprocedurekald, is₣r serialisering: transformation af objekter til bytesekvens Actions (aktioner ? udførelse ?) - udførelse af metodekald, tilstands₣ndring Garbage collection (spildopsamling) Exceptions (undtagelser)

7 Distribuerede objekter: komponenter i RMI middleware A Komm Stub Fjernref. modul B Komm Skelet Fjernref. modul Dispatcher Samt: Global navneservice "Interface-compiler" (generering af stubbe m.m.)

8 DS-kursusgang nr. 6: distribuerede objekter 1. Intro (oversigt over grundl₣ggende begreber og komponenter) 2. De basale designspørgsm ₢ l ved konstruktion af middleware til understøttelse af distribuerede objekter 3. Java's RMI implementation -hvordan man konstruerer, overs₣tter og afvikler Java-programmer med distribuerede objekter 4. Forklaring af øvelsesopgaverne

9 Basale designspørgsm ₢ l - oversigt A. hvorledes specificeres distribuerede objekter (deres metoder) ? B. hvorledes bør parametre og returv₣rdi overføres ? C. hvad er en passende ”transparens” ? D. semantik i øvrigt: - synkronisering - hvilken opførsel ønskes i tilf₣lde af fejl ?

10 Designspørgsm ₢ l: A: Specifikation af distr. obj. Hvorledes specificeres distribuerede objekter (s₣rligt deres metoder) Ved hj₣lp af interfaces i stil med Java interfaces. Interfaces for fjerne objekter specificerer hvilke metoder, der kan kaldes fjernt. Fjerne objekter kan derudover have andre metoder. I princippet kan fjerne objekter ogs ₢ have "fjerne attributter" - jf. CORBA - ikke i Java - CDK mener ikke interfaces kan/bør erkl₣re s ₢ danne (s. 167) ?? - jeg mener det er konsistent med OO paradigme (men det er lidt vanskeligere at implementere transparent)

11 Interfaces for fjerne objekter: HelloApplet-eksempel String sayHello() { return ”Hello World !”; } HelloImplHelloApplet Hello String sayHello();

12 Designspørgsm ₢ l: B: Hvorledes ønsker vi parametre overført ? obj_r = r.p(obj_r1, obj_r2,..) Skal parametre til fjernmetodekald: - v₣re fjerne eller lokale ? - hvad skal forst ₢ s ved et lokalt objekt der fjern-overføres ? - "by value" eller "by reference" ?

13 Designspørgsm ₢ l: B: Hvorledes ønsker vi parametre overført ? obj_r = r.p(obj_r1, obj_r2,..) Gerne valgmulighed fjernt/lokalt, hvor "lokalt" betyder "ikke-fjernt", dvs. den fjerne proces kan ikke senere tilg ₢ det oprindelige objekt. Call by value: giver kopi, derfor: -egnet til overførsel af lokale objekter - kan ikke bruges til overførsel af fjerne objekter

14 Designspørgsm ₢ l: C: Transparens Transparens er spørgsm ₢ let om hvor synligt det er i programkildeteksten, at der bruges fjerne varianter af programelementer (objekter, referencer, metodekald, interfaces etc.) Grundl₣ggende skal der v₣re transparens i betydningen abstraktion af detaljer (fysiske adresser p ₢ fjerne objekter, serialisering, p ₢ lidelighed, m.m.) Endvidere skal der v₣re en rimelig (men ikke nødvendigvis 100%) ensartethed mellem fjerne og lokale objekter objekter etc. - nemt at modificere et program til at blive distribueret. - men ogs ₢ gerne nemt at se forskel ! Java: Her tvinger undtagelsesh ₢ ndtering til en vis forskel mellem fjerne/lokale metodekald

15 Transparens public class HelloApplet { Hello obj; // Hello er "fjern-interface" String msg;.. try { msg = obj.sayHello(); // N₣sten som alm. metodekald } catch (..) {..} }.. }

16 Navne service Et program er nødt til eksplicit at forespørge hos en navne- service for at f ₢ en fjernreference. En form for undtagelse fra det generelle princip om transparens. Brug af navneservice kun nødvendigt ved "bootstrapping", dvs. for at f ₢ reference til første fjerne objekt. Derefter kan fjerne referencer overføres via fjernmetodekald.

17 Java's RMI involverer mindst tre processer (bootstrapping) obj Proces A Proces B Den tredje proces (C): • P ₢ serversiden er der ogs ₢ en naming service • objektet obj er registreret under navnet "o" o Proces C Har du et objekt ved navn "o" ?

18 Brug af RMI Registry obj = new HelloImpl(); Naming.rebind(”HelloServer”,obj); obj = (Hello)Naming.lookup (”..HelloServer”); msg = obj.sayHello(); Klient Server tid

19 Opsummering: To m ₢ der at overføre objekt- referencer mellem processer (1) Via naming service (2) Som parametre til fjernmetodekald F₣lles: • de objekter, der overføres referencer til, skal implementere et interface, som er kendt hos b ₢ de server og klient Forskel: • (1) ikke transparent • (1) kr₣ver brug af symbolsk navn p ₢ det/de distribuerede objekter • (1) nødvendigt ved bootstrapping

20 Opgave: hvordan bruges metode (2) i CDK's tavle-eksempel ?

21 Transparent parameteroverførsel af fjerne objekter class Server Server s = new Server; Data d = new Data(); String txt = s.p(d); Class Client // metoder String p(Data d){..}; class Data s.p(d) ved ₣ndring af programtekst til distribueret form kr₣ves for class Data blot: - klassen nedarver fra passende interface - definition af p() bruger interface-typen - efter kald af p() kan serveren beholde reference til fjernt Data-objekt - kr₣ver ikke brug af navneservice

22 Referencer i fjernprocedurekald (jf. CDK figur 5.6) - A har en fjernreference til B - refererer logisk set til B. - A's fjernreference er i virkeligheden en reference til stubben (svarer til en C-pointer). - Stubben indeholder en egentlig, global reference til B (en datastruktur med IP nummer m.m.). - Den globale reference til B overs₣ttes af fjernreferencemodulet hos serveren til en lokal reference til B (igen svarende til en C-pointer). - Klientens fjernreference-modul ikke nødvendigt her (men se CDK s. 178) Klient med objekt AServer med distr. objekt B A Komm Stub Fjernref. modul B Komm Skelet Fjernref. modul Dispatcher

23 Overførsel og brug af "Stubbe" Klient Registry/Server Har du et objekt ved navn "HelloServer" ? KlientServer Stub Oprettelse af reference til fjernt objekt brug Stub-bytecode + stub-instans

24 Designspørgsm ₢ l: D: Semantik, fejlh ₢ ndtering Fjernmetodekald bør v₣re synkroniserede, dvs. klienten blokerer indtil: - der er kommet besked fra server med returv₣rdi - eller middleware kaster undtagelse (f.eks. pga. netv₣rksfejl) Design for kommunikationsmodul afgør hvilken grad af p ₢ lidelighed, der opn ₢ s: - uden retry request: lav p ₢ lidelighed; enten 1 eller 0 udførelse. - retry request uden filtrering: bedre p ₢ lidelighed, risiko for flere udførelser !! - retry request + filtrering + "retransmit, don't reexecute" (Java RMI) bedre p ₢ lidelighed, uden risiko for flere udførelser.

25 Kommunikationsmodulet Stub Dispatcher/ skelet doOperation() getRequest() sendReply() doOperation() getRequest() sendReply() Stub og dispatcher/skelet kommunikerer via kommunikationsmodulerne, som principielt indeholder de tre viste metoder

26 Request/reply protokol mellem kommunikationsmoduler byte[] doOperation(RemoteObjectRef r, methodId m, byte[] args) -kaldes af stub (blokerende) -sender fjernprocedurekald, efter serialisering, fra klient til server. -ud fra r, findes (ip,port) -m pakkes med ind i bytesekvens byte[] getRequest() - blokerer, ligesom socket-kaldet accept() -lytter efter andre processer, der har kaldt doOperation() sendReply(byte[] r, InetAddress ip,int port) - sender svar Retry request: doOperation() kan laves med time out. Filtrering m.m.: h ₢ ndteres af programtekst efter getRequest()

27 DS-kursusgang nr. 6: distribuerede objekter 1. Intro (oversigt over grundl₣ggende begreber og komponenter) 2. De basale designspørgsm ₢ l ved konstruktion af middleware til understøttelse af distribuerede objekter 3. Java's RMI implementation -hvordan man konstruerer, overs₣tter og afvikler Java-programmer med distribuerede objekter 4. Forklaring af øvelsesopgaverne

28 Opgave 1: et interface som b ₢ de server og klient skal kende package RMIHello; import..; public interface Hello extends Remote { public String sayHello() throws RemoteException; }

29 Opgave 1: klientsidens kildetekst package RMIHello; import..; public class HelloApplet { Hello obj; String msg; void init() { try { obj = (Hello)Naming.lookup(”//” + getCodeBase().getHost() + ”/HelloServer”); msg = obj.sayHello(); } catch (..) {..} }.. } lookup() modtager ”//127.0.0.1/HelloServer” og returnerer en fjernreference

30 Opgave 1: serverens kildetekst package RMIHello; import..; public class HelloImpl extends UnicastRemoteObject implements Hello { public HelloImpl { super(); // eksporterer objektet } // dvs. indføjer i det lokale kommunikationsmodul public String sayHello() { return ”Hello World !”; // definerer metoden der kan kaldes fjernt } public static void main(..) {.. // security manager try { HelloImpl obj = new HelloImpl(); Naming.rebind(”HelloServer”,obj); // offentliggører objektet under symbolsk navn } catch (..) {..} }

31 Opgave 1: overs₣ttelse HelloImpl.java Hello.java HelloApplet.java HelloImpl.class Hello.class HelloApplet.class HelloImpl_Stub.class javac rmic -v1.2 X.java javac javac X.java

32 Opgave 1 - kør maskine 1: rmiregistry & java RMIHello.HelloImpl maskine 2: appletviewer RMIHello/hello.html

33 Opgave 1: Stubbe // Bytecode for class HelloImpl_Stub samt en instans af den overføres til klient // p ₢ passende tidspunkt public String Hello() { } Class HelloImpl_Stub

34 Refleksion Reflektion i Java: klasser kan forholde sig til sig selv ! - for en givent navn p ₢ en klasse, kan man f ₢ en reference til et objekt, der repr₣senterer klassen (et class Class objekt) - for et givet class Class objekt, kan man f ₢ en reference til et array af objekter, der repr₣senterer klassens metoder. C har en begr₣nset refleksiv facilitet idet C-programmet har adgang til deres eget stinavn main(int argc, char * argv[]) { printf(”usage: %s ”, argv[0]);.. }

35 java.lang.Class & java.lang.reflect.Method Class: package java.lang; class Class { Class forName(String className) {..} Method getDeclaredMethod(String methodName, Class[] paramTypes){..} Method[] getDeclaredMethods(){..} } Method: package java.lang.reflect; class Method { void invoke(Object obj,Object[] params) {..} }

36 (RMI)SecurityManager I Java er et SecurityManager-objekt et objekt der h ₢ ndterer sikkerhed for en proces: - hvilke fremmede maskiner m ₢ tr ₢ de i processen kontakte (via sockets) ? - hvilke klasser m ₢ downloades fra fremmede maskiner ? En SecurityManager styres af en sikkerhedspolitik-fil og/eller ved at overskrive metoder i class SecurityManager // fra class HelloImpl if (S ystem.getSecurityManager == null) { System.setSecurityManager(new RMISecurityManager()); } try { HelloImpl obj = new HelloImpl(); Naming.rebind(HelloServer,obj); } catch (..) {..}

37 UnsafeRMISecurityManager UnsafeRMISecurityManager() { super(); } public void checkConnect(String host,int port) { if ( host.equals("lt-nielsj") || host.equals("127.0.0.1") ) { System.err.println("Accepting..”); } else super.checkConnect(host,port); }

38 DS-kursusgang nr. 6: distribuerede objekter 1. Intro (oversigt over grundl₣ggende begreber og komponenter) 2. De basale designspørgsm ₢ l ved konstruktion af middleware til understøttelse af distribuerede objekter 3. Java's RMI implementation -hvordan man konstruerer, overs₣tter og afvikler Java-programmer med distribuerede objekter 4. Forklaring af øvelsesopgaverne

39 Opgave 2 Tilføj en metode HelloImpl.sayHello() der tager et argument hvis v₣rdi angiver hvilket sprog, der skal siges "hallo" p ₢. HelloImpl sayHello(”Danish”) ”Hej Verden !” HelloApplet

40 Opgave 3 HelloImpl sayHello(myId) ”Hej Verden !” HelloApplet Et fjernt objekt hos klienten skal angive sproget/nationaliteten. IdImpl getId() ”Danish”

41 Ny opgave: skriv almindelig Java klient, som svarer til HelloApplet

42 package RMIHello; import java.rmi.Naming; import java.rmi.RemoteException; public class HelloClient { String message = "blank"; Hello obj = null; public HelloClient() { try { obj = (Hello)Naming.lookup("//127.0.0.1/HelloServer"); message = obj.sayHello(); } catch (Exception e) { System.out.println("HelloClient exception: " + e); } public static void main(String args[]) { HelloClient hc = new HelloClient(); System.out.println(hc.message); }


Download ppt "DS-kursusgang nr. 6: distribuerede objekter 1. Intro (oversigt over grundl₣ggende begreber og komponenter) 2. De basale designspørgsm ₢ l ved konstruktion."

Lignende præsentationer


Annoncer fra Google