Bevezetés Java RMI Párhuzamos és Elosztott rendszerek II. Dr. Mileff Péter A számítógép-hálózatok rohamos terjedésével a hálózattal összekapcsolt számítógépekbıl álló rendszerek egyre népszerőbbek: Erıforrás megosztás Megbízhatóság növelés Teljesítmény növelés Elosztott rendszerek kialakulásának célja. Programozók szempontjából egy elosztott rendszer kényelmesen programozható, ha a lehetı legkevésbé kell a hálózati protokollok, kommunikáció programozásával törıdni. (a feladatra való koncentrálás) A Java egy rohamosan fejlıdı programozási nyelv. Már a megjelenéskor hangoztatott tulajdonsága volt az elosztottság. (1.0-ban ez még nem igazán teljesült) A szállítási szintő hálózati kommunikáció egyszerő programozása. Távoli eljáráshívás (RPC) visszatekintés Az elosztott rendszerek programozásában kiemelkedı szerepet játszik a távoli eljáráshívás (RPC, Remote Procedure Call) ) módszere. A programozó egy processzoros rendszerben gondolkozik, és egyszerő eljáráshívással valósítja meg a program részei között a kommunikációt. A fejlesztés egy késıbbi lépésében szétválaszthatja a hívó és hívott eljárásokat, más-más számítógépre telepítve azokat. Függvénykönyvtárak alkalmazása: biztosítják, hogy a hálózaton keresztül is az eljáráshívás, a paraméterek átadása és átvétele automatikusan, a programozó elıl rejtetten" történjen meg. Az RPC folyamata 1
Mi is az az RMI? RMI (Remote Method Invocation), azaz távoli metódushívás megvalósítása objektum orientált módon. A távoli eljáráshívás egy magasabb szintő megvalósítása Java nyelven. 1997-ben megjelent JDK 1.1 verziótól elérhetı. Lehetıvé teszi más VM-ben (Virtual Machine virtuális gép) elhelyezkedı objektumok metódusainak meghívását. A rendszer elrejti a kommunikációt végzı részt, és a metódushívás hasonló a helyi, azaz lokális objektumok metódusainak meghívásával, bizonyos megszorításokkal és kötöttségekkel. A rendszert úgy tervezték, hogy a hálózaton elosztott objektumok viselkedése hasonló legyen a helyi objektumok viselkedésével, de ne egyezzen meg, a teljes transzparencia biztosítása nem volt cél. Miért szükséges az RMI? A klasszikus távoli eljáráshívás (RPC) nem igazodik a modern objektum orientált paradigmába. Problémája: Összetett adatszerkezetek hálózaton keresztüli átvitele. A paraméterátadást az átvihetı adatszerkezetek szigorú korlátozásával, a programtól független specifikációjával segítik. Az RMI elınyei A Java RMI hatékonyabb, és robosztusabb megoldást kínál ilyen feladatok megoldására. RMI esetén a paraméterátadás a programozó számára nem jelent semmiféle korlátozásokat. Okai: Jáva egyszerőbb, egységesebb szerkezete. A referenciák következetes, kizárólagos használata. A Jáva virtuális gép tulajdonságai. Távoli módszereink tetszıleges paraméterekkel rendelkezhetnek a paraméterátadás alapvetıen az objektum másolatának átadásával történik. Egyszerő szám paraméter is objektumként értelmezett. Az objektumok átadása A rendszerben objektumok keringenek egy egy RMI hívás során. Egy hívás menete: A csonk az átadandó objektum állapotát (tagváltozóinak értékét) átalakítja a hálózaton átvihetı, úgynevezett soros reprezentációvá. Szerializáció. A szerializált objektum átmegy a hálózaton. A másik oldalon, a szerializált objektumot a csontváz (a másik csonk) visszaalakítja. Létrehoz a szerver oldalon egy lokális objektumot. Végül erre utaló hivatkozást ad tovább a szerver módszer törzsének. 2
Szerializáció Egy objektum szerializáció során egy bájtfolyammá alakul át. Tulajdonságai: Ezek után használható a Java nyelv szabványos kimenet és bemenet kezelési módszereivel. Ellenkezıje a deszerializáció: a bájtfolyam visszaalakul objektummá. Mire alkalmazható? Egy objektum háttértárra való kiírására, állományba mentéshez. Alkalmas a VM-ek közötti kommunikáció megvalósítására: A szerializált objektum a hálózaton átküldhetı, mint bájtfolyam, és a másik oldalon visszaalakítható objektummá. A szerializáció azon objektumokra is végrehajtódik, amelyek valamilyen referenciaként jelennek meg az eredeti objektumban. (Rekurzió) Szerializáció megvalósítása Valamely Java osztály szerializálásához az osztálynak implementálnia kell a java.io.serializable interface-t. Pl.: class myclass implements java.io.serializable. Innentıl kezdve a programozónak nincs több feladata a szerializáció kapcsán. A Java virtuális gép megoldja a feladatot. Az RMI mőködése A rendszer alapfogalma a távoli objektum. más virtuális gépeken lévı objektumok metódusait lehet meghívni. Egy objektum nem minden metódusa hívható távolról Csak azok, amelyek egy úgynevezett távoli interface-ben definiálva vannak. Fontos: Nem biztosítja az osztályok távoli elérését egy osztály konstruktor mőveletei nem lesznek használhatók. A rendszer teljesen transzparens: Távoli objektumok használata teljesen megegyezik a távolról nem hívható objektumokéval. A programozónak csak kevés helyen kell foglalkozni ezzel. RMI mőködése Az RMI nem nyelvi elem, hanem Java osztályok győjteménye. A hálózati kommunikációt végzı rész teljesen láthatatlan, ezért mégis annak tőnik: egy saját RMI rendszer implementálása Java nyelven tehát lehetséges A Java RMI saját szemétgyőjtı mechanizmussal rendelkezik. (A távoli objektumok miatt) Mőködése hasonló, mint a VM-é. A nyelvben nincsen olyan referencia, mely egy másik virtuális gépen elhelyezkedı objektumot címezne meg, ezért ehelyett egy úgynevezett csonkot kell használni. 3
A csonk A csonk egy olyan objektum, mely a lokális virtuális gépen helyezkedik el, és hasonlít a távoli objektumra. Különbség: nincs benne implementálva a távoli objektum metódusainak törzse. A metódushívás ekkor olyan, mint a csonk egy metódushívása. JRMP (Java Remote Method Protocol) protokollt használva továbbítja a hívást a távoli objektumnak, szerializája a paramétereket, blokkolva a végrehajtást ha visszaérkezik a visszatérési érték a hálózaton, deszerializálja azt, és visszaadja azt a hívó félnek. A csonk A csonk elkészítése kvázi automatikus, a Java biztosít eszközt a létrehozáshoz. A csonk használata teljesen transzparens, egyenértékő a távoli referenciával. A hívás során a hálózaton a következı információk mennek át: a hívott objektum azonosításához szükséges információk. a hívott metódus azonosításához szükséges információk. a metódushívás aktuális paraméterei szerializálva. Fontos: más-más virtuális gépen az ugyanarra az objektumhoz tartozó csonk igaz ugyan, hogy különbözı objektum, de ugyanarra az objektumra vonatkozó referencia A fogadó oldal A fogadó oldalon RMI háttérszálak futnak. Várják a beérkezı távoli metódushívásokat. Amint kapnak egy ilyet, továbbadják azt a megcímzett objektumnak, mely ugyanazon a virtuális gépen helyezkedik el. Itt van implementálva az adott metódus törzse, amely végrehajtódik. A visszatérési értéket aztán visszaküldi a hívó oldalon szereplı csonknak, mely továbbadja a hívónak. Rejtett információk a hálózaton: A távoli metódus visszatérési értéke, kivételek, melyet a távoli objektum dobott, vagy az RMI mőködése során lépett fel. A kivételek A kivételkezelés elosztott környezetben bonyolult probléma mindig a hívó oldalon kell lekezelni. Szerializálva mennek át a hálózaton objektumként. Az RMI rendszer mőködése közben fellépett hibák válthatják ki: A hálózat megszakadása vagy a hívott fél helytelen mőködése okozhatja. Egyéb dobott kivételeknél a szerializáció során elveszhetnek egyéb járulékos információk, melyek megkönnyíthetnék a hibakeresést. Ebbıl is látszik, hogy a paraméterként átadott objektumok nem mennek vissza a hívó félhez. Érték szerinti paraméterátadás. A deszerializáció során a hívott oldalon egy másolat keletkezik az eredeti objektumból 4
Exportálás Ha példányosítunk egy objektumot, ami távolról elérhetıvé akarunk tenni, közölni kell az RMI háttérszálakkal a készen állását: Ekkor már fogadhat távoli metódushívásokat erre az objektumra vonatkozólag. Azért, hogy tudja, hova kell a hívást továbbadni. A közlést exportálásnak nevezzük. Exportáláskor létrejön egy csonk példány is a hívott oldalon: használva a hívó oldalon érhetjük el az eredeti, távolról elérhetı objektumot. Fordítottja az unexportálás. RMI registry Ahhoz, hogy referenciához jussunk a távolról hívható objektumra, szükségünk van a hozzá tartozó csonkra. a csonk példány a hívott oldalon keletkezik. Ennek lekérése az RMI registry-n keresztül történik RMI technikával. A registry is egy távolról elérhetı objektum. A registry csonk és név párokat tartalmaz. Egy távoli objektum azonosítását egy speciális cím teszi lehetıvé: a számítógép neve, opcionálisan egy port, az objektum neve. RMI registry A fejlesztés lépései Java fejlesztı környezetben kapunk egy segédprogramot, mely létrehoz egy registry példányt és exportálja azt. Erre azért van szükség, mivel a registry is egy távolról elérhetı objektum. Viszont honnan tud a hívó fél referenciát szerezni a registry-re? Ismerjük a registry címét és a port számát, ezért csonkot generálhatunk anélkül, hogy kapcsolatba lépnénk az registry-t példányosító és azt exportáló virtuális géppel. Saját magunk is implementálhatunk RMI registry-t Mi is példányosíthatunk és exportálhatunk. 5
Lépések 1. Távoli interface definiálása: A távol objektum interface-ének definiálása Java interface- ként. a java.rmi.remote interface kiterjesztése szükséges, minden metódusnak dobnia kell egy java.rmi.remoteexception kivételt. Pl.: public interface TestServer extends java.rmi.remote { Lépések 2. Távoli interface implementálása: Az elsı lépésben definiált interface-t implementálni kell A Java 1.5 verziók esetén a java.rmi.unicastremoteobject osztály leszármazottja kell legyen. Az 5. verziótól kezdve ez nem szükséges már. 3. A szerver osztály lefordítása 3a. A stub compiler lefuttatása (csak 1.5 elıtti verziók esetén) A csonk lefordítása az rmic paranccsal, a paraméterei megegyeznek a javac-al al. Az rmic feladata a kliens csonk és a szerver oldali csonk generálása. Lépések 4. RMI registry indítása: rmiregistry parancs indítása a szerver gépen Minden szerver processz használhat saját registry-t t vagy akár egy közöset is. Kezdetben üres, a távoli objektumokat a szervernek kell bejegyeznie. 5. Szerver processz indítása A szerver processz létrehozza a szerver objektum példányát vagy példányait. Lépések 6. Távoli objektumok regisztrációja: A szerver processz bejegyzi a távoli objektumokat a registry-be. Ehhez felhasználja a java.rmi.naming osztály metódusait. A szerver ezzel képes fogadni a kliensek kapcsolódását. 7. Kliens kód megírása: A távoli objektum eléréséhez használni kell java.rmi.naming osztály metódusait. A távoli objektum használata ezután ugyanolyan, mint a helyi objektumé. 8. Kliens kód lefordítása 9. Kliens indítása 6
Példaprogram Távoli interface definiálása: package hello; import java.rmi.remote; import java.rmi.remoteexception; public interface Hello extends Remote { String sayhello() throws RemoteException; A szerver osztály public class HelloImpl extends UnicastRemoteObject implements Hello { public HelloImpl() throws RemoteException { super(); public String sayhello() { return "Hello World!"; public static void main(string args[]) { // Create and install a security manager if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); A szerver osztály Kliens applet public class HelloApplet extends Applet { String message = "blank"; try { HelloImpl obj = new HelloImpl(); // Bind this object instance to the name "HelloServer" Naming.rebind("//myhost/HelloServer", obj); System.out.println("HelloServer bound in registry"); catch (Exception e) { System.out.println("HelloImpl err: " + e.getmessage()); e.printstacktrace(); Hello obj = null; public void init() { try { obj = (Hello)Naming.lookup("//" + getcodebase().gethost() + "/HelloServer"); message = obj.sayhello(); catch (Exception e) { System.out.println("HelloApplet exception: " + e.getmessage()); e.printstacktrace(); public void paint(graphics g) { g.drawstring(message, 25, 50); 7
Köszönöm a figyelmet! 8