1. 程式人生 > >RPC 通訊和 RMI 區別

RPC 通訊和 RMI 區別

RPC(Remote Procedure Call Protocol)遠端過程呼叫協議,通過網路從遠端計算機上請求呼叫某種服務。

一個RPC框架包含的要素

RMI (Remote Method Invocation) 遠端方法呼叫。能夠讓在客戶端Java虛擬機器上的物件像呼叫本地物件一樣呼叫服務端java 虛擬機器中的物件上的方法。是 Java 領域建立分散式應用的技術基石。後續的 EJB 技術,以及現代的分散式服務框架,其中的基本理念依舊是 Java RMI 的延續。使用的是JRMP(Java Remote Messaging Protocol)

在 RMI 呼叫中,有以下幾個核心的概念:

  1. 通過介面進行遠端呼叫
  2. 通過客戶端的 Stub 物件和服務端的 Skeleton 物件的幫助將遠端呼叫偽裝成本地呼叫
  3. 通過 RMI 註冊服務完成服務的註冊和發現

RPC與RMI的區別

 1:方法呼叫方式不同:

  RMI中是通過在客戶端的Stub物件作為遠端介面進行遠端方法的呼叫。每個遠端方法都具有方法簽名。如果一個方法在伺服器上執行,但是沒有相匹配的簽名被新增到這個遠端介面(stub)上,那麼這個新方法就不能被RMI客戶方所呼叫。

  RPC中是通過網路服務協議向遠端主機發送請求,請求包含了一個引數集和一個文字值,通常形成“classname.methodname(引數集)”的形式。RPC遠端主機就去搜索與之相匹配的類和方法,找到後就執行方法並把結果編碼,通過網路協議發回。

 2:適用語言範圍不同:

  RMI只用於Java;

  RPC是網路服務協議,與作業系統和語言無關。

 3:呼叫結果的返回形式不同:

  Java是面向物件的,所以RMI的呼叫結果可以是物件型別或者基本資料型別;

  RMI的結果統一由外部資料表示 (External Data Representation, XDR) 語言表示,這種語言抽象了位元組序類和資料型別結構之間的差異。

 

Java RMI 工作原理

一個典型的 RMI 呼叫如下圖所示:

  1. 服務端向 RMI 註冊服務繫結自己的地址;register
  2. 客戶端通過 RMI 註冊服務獲取目標地址;subscribe+notify
  3. 客戶端呼叫本地的 Stub 物件上的方法,和呼叫本地物件上的方法一致;
  4. 本地存根物件將呼叫資訊打包,通過網路傳送到服務端;
  5. 服務端的 Skeleton 物件收到網路請求之後,將呼叫資訊解包;
  6. 然後找到真正的服務物件發起呼叫,並將返回結果打包通過網路傳送回客戶端。

 

現實中不直接使用RMI作為遠端呼叫的原因:

  1. 底層是BIO、而不是NIO
  2. 其只能用於Java,不能擴充套件其他語言
  3. 底層序列化使用JDK的序列化機制,效率不高

其註冊中心是單點的,掛了的話整個系統不可用