Java RMI介紹

RMI代表遠程方法調用。 這是一種允許位於在一個系統(JVM)中的對象訪問/調用在另一個JVM上運行的對象的機制。

RMI用於構建分佈式應用程序; 它提供Java程序之間的遠程通信。 它在java.rmi包中提供。

RMI應用程序的體系結構

RMI應用程序中,我們編寫了兩個程序,一個服務器程序(位於服務器上)和一個客戶機程序(位於客戶端上)。

  • 在服務器程序中,創建一個遠程對象,該對象的引用可被客戶端(使用註冊表)使用。
  • 客戶端程序請求服務器上的遠程對象,並嘗試調用其方法。

下圖顯示了RMI應用程序的體系結構。

Java

下面我們來討論這個架構的組件。

  • 傳輸層(Transport Layer) - 此層連接客戶端和服務器。它管理現有的連接,並設置新的連接。
  • 存根(Stub) - 存根是客戶端上的遠程對象的表示(代理)。 它位於客戶端系統中; 它作爲客戶端程序的網關。
  • 骨架(Skeleton) - 它位於服務器端的對象。 存根與此骨架通信以將請求傳遞給遠程對象。
  • RRL(遠程參考層) - 它是管理客戶端對遠程對象的引用的層。

RMI應用程序的工作

以下幾點總結了RMI應用程序的工作原理 -

  • 當客戶端調用遠程對象時,它被存根最終傳遞給RRL。
  • 當客戶端RRL接收到請求時,它會調用對象remoteRef的一個名爲invoke()的方法。 它將請求傳遞到服務器端的RRL。
  • 服務器端的RRL將請求傳遞到服務器上的最後調用所需對象的Skeleton(服務器上的代理)。
  • 結果一直傳遞給客戶端。

編組和解組

每當客戶端調用接受遠程對象上的參數的方法時,在通過網絡發送之前,將參數捆綁到消息中。 這些參數可能是原始類型或對象。 在原始類型的情況下,將參數放在一起並附加標題。 如果參數是對象,那麼它們被序列化。 這個過程被稱爲編組。

在服務器端,打包參數是未分組的,然後調用所需的方法。這個過程被稱爲解組。

RMI註冊表

RMI註冊表是放置所有服務器對象的命名空間。 每次服務器創建一個對象時,它會使用RMIregistry(使用bind()reBind()方法)註冊此對象。 這些使用叫作綁定名稱(bind name)的唯一名稱進行註冊。

要調用遠程對象,客戶端需要該對象的引用。客戶端使用其綁定名稱(使用lookup()方法)從註冊表中獲取對象。

下圖說明了整個過程 -

Java

RMI目標

以下是RMI的目標 -

  • 最小化應用程序的複雜性。
  • 保護類型安全。
  • 分佈式垃圾收集。
  • 最小化使用本地和遠程對象之間的區別。