這里簡單說一下RMI和RPC的區別。
什么是RMI
RMI(Remote Method Invocation,遠程方法調用),能夠讓在客戶端Java虛擬機上的對象像調用本地對象一樣調用服務端Java虛擬機中的對象上的方法,是Java在JDK1.1中實現的,大大增強了Java開發分布式應用的能力,使用的代表是EJB。
RMI是Java的一組用戶開發分布式應用程序的API。RMI使用Java語言接口定義了遠程對象,集合了Java序列化和Java遠程方法協議(Java Remote Method Protocol)。簡單來說,這樣使得原來的程序在同一操作系統的方法調用變成了不同操作系統之間程序的方法調用。由於J2EE是分布式程序平台,它以RMI機制實現了程序組件在不同的操作系統之間的通信。比如一個EJB可以通過RMI調用Web上另一台機器上的EJB遠程方法。

RMI遠程方法調用的步驟
1.客戶對象調用客戶端輔助對象stub上的方法。
2.客戶端輔助對象stub打包調用信息(變量、方法名),通過網絡發送給服務端輔助對象skeleton。
3.服務端輔助對象skeleton將客戶端輔助對象發送來的信息解包,找出真正被調用的方法以及該方法所在的對象。
4.調用真正服務對象上的真正方法,並將結果返回給服務端輔助對象skeleton。
5.服務端輔助對象將結果打包,發送給客戶端輔助對象stub。
6.客戶端輔助對象將返回值解包,返回給調用者。
7.客戶對象獲得返回值。
RMI的局限性
1.RMI對服務器的IP地址和端口依賴很緊密,但是在開發的時候卻可能不知道將來的服務器IP和端口如何,而客戶端程序調用是依賴這個IP和端口的。這個問題有兩種解決途徑:一是通過DNS來解決,二是通過封裝將IP暴露到程序代碼之外。注意:我們在實際開發中,我們是知道服務器IP和端口的。
2.RMI是Java語言的遠程調用,兩端的程序語言必須是Java實現,對於不同語言間的通訊可以考慮用WebService或者公用對象請求代理體系(CORBA)來實現。
什么是RPC
RPC(Remote Procedure Call Protocol,遠程過程調用協議),是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議,使用的代表是Dubbo。RPC不依賴於具體的網絡傳輸協議,TCP、UDP等都可以。
由於存在各式各樣的變換和細節差異,相應的RPC也派生出了各式遠程過程通信協議。RPC是跨語言的通信標准,SUN和微軟都有其實現。比如RMI可以被看作SUN對RPC的Java版本(實現),而微軟的DCOM就是建立在ORPC協議之上的。簡單理解就是,RPC是一個協議,無論是SUN的RMI還是微軟的DCOM都是對該協議的不同實現,二者都為編程人員提供了應用RC技術的程序接口(API)。
RPC遠程過程調用的步驟
1.執行客戶端調用語句,傳送參數。
2.調用本地系統發送網絡消息。
3.消息傳送到遠程主機。
4.服務器得到消息並獲得參數。
5.根據調用請求以及參數執行遠程過程(服務)。
6.執行過程完畢后,將結果返回服務器句柄。
7.服務器句柄返回結果,調用遠程主機的系統網絡服務發送結果。
8.消息傳回本地主機。
9.客戶端句柄從本地主機的網絡服務接收消息。
10.客戶端接收到調用語句返回的結果數據。
RMI與RPC的區別
1.方法調用的方式不同
RMI調用方法是通過在客戶端的Stub對象作為遠程接口進行遠程方法的調用。每個遠程方法都具有方法簽名。如果一個方法在服務器上執行,但是沒有相匹配的簽名被添加到這個遠程接口(Stub對象)上,那么這個新方法就不能被RMI客戶方所調用。簡單理解就是,遠程方法需要先在遠程接口上注冊才能使用。
RPC調用函數是通過網絡服務協議向遠程主機發送請求,請求包含了一個參數集和一個文本值,通常形成【classname.*methodname(參數集)】的形式。這就向RPC服務器表明了,被請求的方法是在classname類中,方法名是methodname。然后RPC服務器就會去搜索與之相匹配的類和方法,並把它作為方法參數類型的輸入。這里的參數類型是與PRC請求中的類型相匹配的,一旦匹配成功,這個方法就被調用了,並會將執行結果編碼后通過網絡協議發回。
2.適用語言的范圍不同
RMI只適用於Java並支持傳輸對象。
PRC是基於C語言的,並不支持傳輸對象,是網絡服務的協議,與操作系統和語言無關。
3.調用結果的返回形式不同
因為Java是面向對象的,所以RMI也是面向對象的,RMI的調用結果可以是對象類型或者是基本數據類型。
PRC的返回結果統一由外部數據表示(External Data Representation,XDR)語言表示,這種語言抽象了字節序類和數據類型結構之間的差異,只有由XDR定義的數據類型才能被傳遞,可以說RMI是面向對象方式的Java RPC。
擴展閱讀
Java作為一種風靡一時的網絡開發語言,其巨大的威力就體現在它強大的開發分布式網絡應用的能力上,而RMI就是開發百分之百純Java的網絡分布式應用系統的核心解決方案之一。其實RMI可以被看作是RPC的Java版本(實現)。
傳統RPC並不能很好地應用於分布式對象系統,而Java RMI 則支持存儲於不同地址空間的程序級對象之間彼此進行通信,實現遠程對象之間的無縫遠程調用。
RMI目前使用Java遠程消息交換協議(JRMP,Java Remote Messaging Protocol)進行通信。JRMP是專為Java的遠程對象制定的協議。因此,Java RMI具有Java的【Write Once,Run Anywhere】的優點,是分布式應用系統的百分之百純Java解決方案。用Java RMI開發的應用系統可以部署在任何支持JRE(Java Run Environment Java,Java運行環境)的平台上。但由於JRMP是專為Java對象制定的,因此RMI對於用非Java語言開發的應用系統的支持不足。不能與用非Java語言書寫的對象進行通信。
"我再也遇不到第二個你。"
