Java RMI - 簡介



RMI 代表 **遠端方法呼叫** (Remote Method Invocation)。它是一種機制,允許駐留在一個系統 (JVM) 中的物件訪問/呼叫執行在另一個 JVM 上的物件。

RMI 用於構建分散式應用程式;它提供 Java 程式之間的遠端通訊。它位於 **java.rmi** 包中。

RMI 應用程式的架構

在 RMI 應用程式中,我們編寫兩個程式,一個 **伺服器程式**(駐留在伺服器上)和一個 **客戶端程式**(駐留在客戶端上)。

  • 在伺服器程式內部,建立了一個遠端物件,並使該物件的引用可供客戶端使用(使用登錄檔)。

  • 客戶端程式請求伺服器上的遠端物件,並嘗試呼叫其方法。

下圖顯示了 RMI 應用程式的架構。

RMI Architecture

現在讓我們討論一下此架構的元件。

  • **傳輸層** - 此層連線客戶端和伺服器。它管理現有連線,並建立新的連線。

  • **存根** - 存根是客戶端遠端物件的表示(代理)。它駐留在客戶端系統中;它充當客戶端程式的閘道器。

  • **骨架** - 這是駐留在伺服器端的物件。**存根**與這個骨架通訊,將請求傳遞給遠端物件。

  • **RRL(遠端引用層)** - 它是一個管理客戶端對遠端物件引用的層。

RMI 應用程式的工作原理

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

  • 當客戶端對遠端物件進行呼叫時,存根會接收該呼叫,並最終將此請求傳遞給 RRL。

  • 當客戶端 RRL 接收請求時,它會呼叫物件 **remoteRef** 的名為 **invoke()** 的方法。它將請求傳遞給伺服器端的 RRL。

  • 伺服器端的 RRL 將請求傳遞給 Skeleton(伺服器上的代理),Skeleton 最終呼叫伺服器上的所需物件。

  • 結果被一路回傳給客戶端。

編組和反編組

每當客戶端呼叫遠端物件上接受引數的方法時,引數都會被打包成訊息,然後透過網路傳送。這些引數可以是基本型別或物件。對於基本型別,引數會被組合在一起,並附加一個標題。如果引數是物件,則會對其進行序列化。此過程稱為 **編組**。

在伺服器端,打包的引數會被解包,然後呼叫所需的方法。此過程稱為 **反編組**。

RMI 登錄檔

RMI 登錄檔是一個名稱空間,所有伺服器物件都放置在此名稱空間中。伺服器每次建立物件時,都會使用 **bind()** 或 **reBind()** 方法將此物件註冊到 RMI 登錄檔中。這些是使用稱為 **繫結名稱** 的唯一名稱進行註冊的。

要呼叫遠端物件,客戶端需要該物件的引用。此時,客戶端使用其繫結名稱(使用 **lookup()** 方法)從登錄檔中獲取物件。

下圖說明了整個過程:

Registry

RMI 的目標

以下是 RMI 的目標:

  • 最大程度地降低應用程式的複雜性。
  • 保持型別安全。
  • 分散式垃圾回收。
  • 最大程度地減少使用本地物件和遠端物件之間的差異。
廣告

© . All rights reserved.