Sekilas Tentang RMI
Asfira Sagitri – 13296060
Dosen: Onno W. Purbo

Sistem komputasi terdistribusi yang bekerja di banyak tempat mengharuskan beberapa komputer untuk bisa berkomunikasi satu sama lain. Untuk komunikasi, bahasa Java mendukung pemakaian socket yang sifatnya fleksibel dan mencukupi untuk keperluan komunikasi umum. Tapi di sisi lain, untuk membuat socket, klien dan server harus terhubung melalui protokol pada application level untuk meng-encode dan men-decode data-data yang akan dikirimkan. Protokol itu sendiri ternyata sulit untuk dibuat dan bisa menjadi rentan terhadap error.

Alternatif lain dari socket adalah dengan menggunakan Remote Procedure Call (RPC), yang mengabstraksi interface komunikasi ke level pemanggilan procedure. Programmer tidak akan menangani socket secara langsung, dan seolah-olah memanggil prosedur lokal, padahal argumen dari prosedur lokal tersebut dipaketkan dan dikirimkan ke tujuan jarak jauh. Tapi RPC tidak bisa langsung dipakai dalam sistem objek terdistribusi. Dalam sistem objek terdistribusi, diperlukan komunikasi antara objek-objek yang ada di level program, yang berada dibanyak tempat. Oleh karena itu, sistem objek terdistribusi memerlukan suatu Remote Method Invocation (RMI). Pada sistem yang memakai RMI, sebuah objek lokal yang dinamakan stub mengurus pemanggilan method pada objek jarak jauh.

RMI (Remote Method Invocation) adalah cara programmer Java untuk  membuat program aplikasi Java to Java yang terdistribusi. Program-program yang menggunakan RMI bisa menjalankan metode secara jarak jauh, sehingga program dari server bisa menjalankan method di komputer klien, dan begitu juga sebaliknya. 

Java RMI yang ada pada bahasa Java telah didesain khusus sehingga hanya bisa bekerja pada lingkungan Java. Hal ini berbeda dengan sistem RMI lainnya, misalnya CORBA, yang biasanya didesain untuk bekerja pada lingkungan yang terdiri dari banyak bahasa dan heterogen. Pemodelan objek pada CORBA tidak boleh mengacu pada bahasa tertentu.

Sistem RMI terdiri atas tiga layer/lapisan, yaitu 
1. stub/skeleton layer, yaitu stub pada sisi klien (berupa proxy), dan skeleton pada sisi server.
2. remote reference layer, yaitu perilaku remote reference (misalnya pemanggilan kepada suatu objek)
3. transport layer,  yaitu set up koneksi, pengurusannya dan remote object tracking.

Batas antar masing-masing layer disusun oleh interface dan protokol tertentu, yaitu tiap layer bersifat independen terhadap layer lainnya, dan bisa diganti oleh implementasi alternatif tanpa mengganggu layer lainnya. Sebagai contoh, implementasi transport yang digunakan RMI adalah yang berbasis TCP (menggunakan Java socket), tapi bisa digantikan dengan menggunakan UDP.

Layer application berada di atas sistem RMI. Hubungan antara layer-layer tersebut dapat dijelaskan pada gambar berikut :

Server

Klien

                Aplikasi 

     Stub            Skeleton
Remote Reference Layer
        Transport layer

             Sistem RMI               Stub            Skeleton

Sebuah remote method invocation dari klien ke remote server object akan melalui layer-layer pada sistem RMI dari layer transport pada sisi klien ke layer transport pada sisi server.

Sebuah klien yang menjalankan method pada remote server object sebenarnya menggunakan stub atau proxy yang berfungsi sebagai perantara untuk menuju remote server object tersebut. Pada sisi klien, reference ke remote object sebenarnya merupakan reference ke stub lokal. Stub ini adalah implementasi dari remote interface dari sebuah remote object, dan meneruskan panggilan ke server object melalui remote reference layer. Stub dibuat dengan menggunakan kompiler rmic.

Supaya sebuat panggilan method tersebut bisa sampai di remote object, panggilan tersebut diteruskan melalui remote reference layer.  Panggilan tersebut sebenarnya diteruskan ke skeleton yang berada di sisi server. Skeleton untuk remote object ini akan meneruskan panggilan ke kelas remote object implementation yang menjalankan method yang sebenarnya. Jawaban, atau return value dari method tersebut akan dikirim melalui skeleton, remote reference layer dan transport layer pada sisi klien, lalu melalui transport layer, remote reference layer, dan stub pada sisi klien.

Teknik dalam RMI salah satunya adalah dynamic stub loading, yang berfungsi untuk membuat klien me-load stub yang belum ada di komputernya. Stub mengimplementasi remote interface yang sama dengan yang diimplementasikan oleh remote object.
 
Dengan RMI, komputer klien bisa memanggil remote object yang berada di server. Server juga bisa  menjadi klien dari suatu remote object, sehingga komputer klien bisa menjalankan method-method tertentu di komputer server. Dengan menggunakan RMI, program yang dijalankan di komputer klien bisa berupa applet, maupun berupa aplikasi.
Program RMI memerlukan remote interface, kelas-kelas implementasi dari remote interface tesebut (implementation class), dan program rmiregistry yang sedang dijalankan di komputer server (rmiregistry terdapat dalam paket JDK).

Pada paket Whiteboard, RMI digunakan untuk program-program Chat, Whiteboard dan Projector. Dalam program Chat, RMI digunakan untuk memasukkan input dari para pengguna, baik dosen maupun mahasiswa, ke komputer server. Setelah itu, server akan mengeluarkan output berupa hasil percakapan antar pengguna kepada semua komputer klien.  Pada Whiteboard, penggunaan RMI terletak pada pengiriman graphics dan image antara komputer server dan klien. Sedangkan pada Projector, RMI digunakan agar dosen, sebagai klien, bisa mengatur indeks tampilan pada Projector yang berlangsung pada komputer mahasiswa, yang berfungsi sebagai klien lainnya.

Kelas WhiteboardClient adalah tampilan yang dimunculkan pada komputer klien, sedangkan penggunaan RMI dilakukan oleh kelas WhiteboardClientManifestImplementation. Kelas WhiteboardClientManifestImplementation merupakan kelas yang mengimplementasikan interface WhiteboardClientManifest. Dalam konsep RMI, interface WhiteboardClientManifest ini adalah remote interface untuk klien. Sedangkan pada server dijalankan program WhiteboardServer Implementation yang  berupa implementasi dari interface WhiteboardServer. WhiteboardServer juga merupakan remote interface. Program WhiteboardServer Implementation ini bersifat public, sehingga bisa diakses oleh klien.
Remote interface harus meng-extend interface java.rmi.Remote. Setiap method pada remote interface harus meng-throw java.rmi.RemoteException.

WhiteboardClientManifest	Implementation dan WhiteboardServer Implementation adalah implementation classes. Implementation class merupakan kelas yang mengimplementasikan remote interface. Implementation class perlu mendefinisikan konstruktor untuk remote object, sekaligus membuat instance dari remote object tersebut.  Implementation class juga menyediakan implementasi dari method yang bisa dijalankan secara remote. Selain itu implementation class juga perlu membuat dan menjalankan Security Manager. Tambahan lagi, implementation class juga harus me-register atau mendaftarkan paling tidak sebuah remote object pada RMI remote object registry. Pada program implementation class, semua argumen untuk remote method dan semua return value dari remote method bisa berupa object bertipe apa saja, asal object-object tersebut mengimplementasi interface java.io.Serializable. 

Untuk remote objects, penyampaiannya dilakukan dengan pass by reference. Referensi untuk suatu remote object sebenarnya merupakan referensi untuk sebuah stub, yaitu proxy pada sisi klien untuk remote object.
Pada method main di implementation class, diperlukan pembuatan dan pemasangan sebuah security manager, yang bisa berupa RMISecurityManager, ataupun security manager yang sebelumnya telah didefinisikan dulu secara khusus oleh sang programmer. Security manager ini diperlukan untuk menjaga agar kelas-kelas yang dipakai tidak melakukan operasi-operasi yang bisa mengancam keamanan sistem. Jika dalam method main tidak terdapat security manager, RMI tidak bisa digunakan karena kelas-kelas RMI tidak akann diijinkan untuk di-load.

Dalam method main, suatu instance dari remote object harus diciptakan. Konstruktor akan menghasilkan remote object, dan sebagai hasilnya, setelah konstruktor dipakai untuk menciptakan instance, sebuah remote object akan siap untuk mendengar method-method panggilan dari komputer klien.

Agar komputer klien bisa menjalankan method di remote object, klien sebelumnya harus membuat referensi kepada remote object tersebut. Biasanya referensi diambil dengan cara dijadikan parameter dari suatu remote method, ataupun diambil dari return value suatu remote method. 

Untuk keperluan bootstrapping, RMI menyediakan registry yang bisa mem-bind suatu URL ke remote object. Bentuk atau format dari URL tersebut adalah : //host/nama_object, dan nama_object harus berupa nama berbentuk string. Setelah suatu remote object diregistrasi di server, komputer-komputer klien bisa mencari nama objek tersebut, mengambil referensi ke remote-object, dan seterusnya menjalankan method pada objek tersebut.

RMI akan membuat referensi ke stub dari remote object dengan referensi yang ditentukan oleh argumen kedua dari perintah Naming.rebind(URL, argumen ke-2). Objek implementasi yang ada di komputer klien (remote implementation objects) akan selalu berada di komputer klien, jadi sewaktu klien melakukan pencarian ke remote object yang ada ada di registry di server, komputer server akan melakukan referensi ke stub yang berada di komputer klien.

Protokol yang dipakai oleh RMI adalah Java Object Serialization dan HTTP. Protokol Object Serialization digunakan unntuk meneruskan panggilan klien dan mentransfer data. Protokol HTTP digunakan untuk mem-"POST" sebuah remote method invocation dan mengembalikan data keluaran untuk situasi ketika komputer klien dan server dipisahkan oleh firewall.

Contoh implementasi dari RMI di antaranya :
•	Perusahaan programming Avitek yang berlokasi di Amerika Serikat, membuat program  sistem accounting untuk intranet yang memungkinkan klien untuk meng-update dan mengubah data dengan mudah. Tujuan dari proyek ini adalah untuk membuat dan mendukung pembuatan dari bukti nyata untuk konsep penggunaan Java yang dikombinasikan dengan database.
•	Perusahaan CEAS Consulting yang menyediakan jasa custom re-engineering dan otomasi proses untuk perusahaan-perusahaan manufakturing dan teknik, telah membuat program sistem terdistribusi untuk klien mereka. Gambaran program mereka adalah seperti berikut :