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的目標 -

  • 最小化應用程式的複雜性。
  • 保護型別安全。
  • 分散式垃圾收集。
  • 最小化使用本地和遠端物件之間的區別。