RPC 通訊和 RMI 區別
RPC(Remote Procedure Call Protocol)遠端過程呼叫協議,通過網路從遠端計算機上請求呼叫某種服務。
一個RPC框架包含的要素
RMI (Remote Method Invocation) 遠端方法呼叫。能夠讓在客戶端Java虛擬機器上的物件像呼叫本地物件一樣呼叫服務端java 虛擬機器中的物件上的方法。是 Java 領域建立分散式應用的技術基石。後續的 EJB 技術,以及現代的分散式服務框架,其中的基本理念依舊是 Java RMI 的延續。使用的是JRMP(Java Remote Messaging Protocol)
在 RMI 呼叫中,有以下幾個核心的概念:
- 通過介面進行遠端呼叫
- 通過客戶端的 Stub 物件和服務端的 Skeleton 物件的幫助將遠端呼叫偽裝成本地呼叫
- 通過 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 呼叫如下圖所示:
- 服務端向 RMI 註冊服務繫結自己的地址;register
- 客戶端通過 RMI 註冊服務獲取目標地址;subscribe+notify
- 客戶端呼叫本地的 Stub 物件上的方法,和呼叫本地物件上的方法一致;
- 本地存根物件將呼叫資訊打包,通過網路傳送到服務端;
- 服務端的 Skeleton 物件收到網路請求之後,將呼叫資訊解包;
- 然後找到真正的服務物件發起呼叫,並將返回結果打包通過網路傳送回客戶端。
現實中不直接使用RMI作為遠端呼叫的原因:
- 底層是BIO、而不是NIO
- 其只能用於Java,不能擴充套件其他語言
- 底層序列化使用JDK的序列化機制,效率不高
其註冊中心是單點的,掛了的話整個系統不可用