Java RMI介紹
RMI代表遠程方法調用。 這是一種允許位於在一個系統(JVM)中的對象訪問/調用在另一個JVM上運行的對象的機制。
RMI用於構建分佈式應用程序; 它提供Java程序之間的遠程通信。 它在java.rmi
包中提供。
RMI應用程序的體系結構
在RMI應用程序中,我們編寫了兩個程序,一個服務器程序(位於服務器上)和一個客戶機程序(位於客戶端上)。
- 在服務器程序中,創建一個遠程對象,該對象的引用可被客戶端(使用註冊表)使用。
- 客戶端程序請求服務器上的遠程對象,並嘗試調用其方法。
下圖顯示了RMI應用程序的體系結構。
下面我們來討論這個架構的組件。
- 傳輸層(Transport Layer) - 此層連接客戶端和服務器。它管理現有的連接,並設置新的連接。
- 存根(Stub) - 存根是客戶端上的遠程對象的表示(代理)。 它位於客戶端系統中; 它作爲客戶端程序的網關。
- 骨架(Skeleton) - 它位於服務器端的對象。 存根與此骨架通信以將請求傳遞給遠程對象。
- RRL(遠程參考層) - 它是管理客戶端對遠程對象的引用的層。
RMI應用程序的工作
以下幾點總結了RMI應用程序的工作原理 -
- 當客戶端調用遠程對象時,它被存根最終傳遞給RRL。
- 當客戶端RRL接收到請求時,它會調用對象
remoteRef
的一個名爲invoke()
的方法。 它將請求傳遞到服務器端的RRL。 - 服務器端的RRL將請求傳遞到服務器上的最後調用所需對象的Skeleton(服務器上的代理)。
- 結果一直傳遞給客戶端。
編組和解組
每當客戶端調用接受遠程對象上的參數的方法時,在通過網絡發送之前,將參數捆綁到消息中。 這些參數可能是原始類型或對象。 在原始類型的情況下,將參數放在一起並附加標題。 如果參數是對象,那麼它們被序列化。 這個過程被稱爲編組。
在服務器端,打包參數是未分組的,然後調用所需的方法。這個過程被稱爲解組。
RMI註冊表
RMI註冊表是放置所有服務器對象的命名空間。 每次服務器創建一個對象時,它會使用RMIregistry
(使用bind()
或reBind()
方法)註冊此對象。 這些使用叫作綁定名稱(bind name)的唯一名稱進行註冊。
要調用遠程對象,客戶端需要該對象的引用。客戶端使用其綁定名稱(使用lookup()
方法)從註冊表中獲取對象。
下圖說明了整個過程 -
RMI目標
以下是RMI的目標 -
- 最小化應用程序的複雜性。
- 保護類型安全。
- 分佈式垃圾收集。
- 最小化使用本地和遠程對象之間的區別。