RMI的簡單使用?

【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴展思考】【更多討論】【參考文獻】html

八個方面深度解析後端知識/技能,本篇分享的是:java

【RMI的簡單使用?】程序員

你們好,我是IT修真院鄭州分院第十期學員,一枚正直純潔善良的JAVA程序員。spring

今天給你們分享一下,修真院官網JAVA任務七,擴展思考中的知識點——RMI的簡單使用?後端

1、背景介紹
     RPC (Remote Procedure Call):遠程過程調用,用於一個進程調用另外一個進程中的過程,從而提供了過程的分佈能力。服務器

     RMI(Remote Method Invocation):遠程方法調用,即在RPC的基礎上有向前邁進了一步,提供分佈式對象間的通信。容許運行在一個java 虛擬機的對象調用運行在另外一個java虛擬機上對象的方法。這兩個虛擬機能夠是運行在相同計算機上的不一樣進程中,也能夠是運行在網絡上的不一樣計算機中。網絡

2、知識剖析
     RMI的大體工做原理:框架

     服務器端提供服務,服務中要暴露能夠調用的遠程方法,以接口的形式表現,這樣在客戶端能夠經過服務接口來調用遠程方法,實現複雜的業務邏輯。在服務器端,首先要對接口中提供的方法實現,以便客戶端調用可以完成必定的業務邏輯;接着須要生成Skeleton,在Skeleton中真正地實現了對商業方法的調用,完成了客戶請求的調用的過程,將獲取到的調用方法的結果經過序列化機制返回給客戶端,進行應答。在客戶端,經過Stub來接收服務器返回的數據(對象),即在這裏進行了反序列化,也就是讀取網絡傳輸的字節流,進而進行重構。在Skeleton和Stub中,都對網絡通訊進行了處理,例如創建套接字,創建網絡鏈接,爲實際的業務須要作好準備。分佈式

     RMI使用過程當中須要注意的問題:測試

    1.數據傳值問題:咱們都知道在Java程序中引用類型(不包括基本類型)的參數傳遞是按引用傳遞的,對於在同一個虛擬機中的傳遞時是沒有問題的,由於的參數的引用對應的是同一個內存空間,可是對於分佈式系統中,因爲對象再也不存在於同一個內存空間,虛擬機A的對象引用對於虛擬機B沒有任何意義,這時候咱們就要將引用傳遞更改成值傳遞,也就是將對象序列化爲字節,而後使用該字節的副本在客戶端和服務器之間傳遞;

     2.遠程對象的發現問題:在調用遠程對象的方法以前須要一個遠程對象的引用,如何得到這個遠程對象的引用在RMI中是一個關鍵的問題,若是將遠程對象的發現類比於IP地址的發現可能比較好理解一些。在咱們平常使用網絡時,基本上都是經過域名來定位一個網站,可是實際上網絡是經過IP地址來定位網站的,所以其中就須要一個映射的過程,域名系統(DNS)就是爲了這個目的出現的,在域名系統中經過域名來查找對應的IP地址來訪問對應的服務器。那麼對應的,IP地址在這裏就至關於遠程對象的引用,而DNS則至關於一個註冊表(Registry)。而域名在RMI中就至關於遠程對象的標識符,客戶端經過提供遠程對象的標識符訪問註冊表,來獲得遠程對象的引用。這個標識符是相似URL地址格式的:rmi://host:port/name。

3、常見問題
     1.如何使用rmi完成遠程對象的調用
     2.如何使用springrmi完成遠程對象的調用

4、編碼實戰
       詳見視頻。

5、擴展思考
      RPC和RMI的區別:

     一、方法調用方式不一樣:RMI中是經過在客戶端的Stub對象做爲遠程接口進行遠程方法的調用。每一個遠程方法都具備方法簽名。若是一個方法在服務器上執行,可是沒有相匹配的簽名被添加到這個遠程接口(stub)上,那麼這個新方法就不能被RMI客戶方所調用;PC中是經過網絡服務協議向遠程主機發送請求,請求包含了一個參數集和一個文本值,一般造成「classname.methodname(參數集)」的形式。RPC遠程主機就去搜索與之相匹配的類和方法,找到後就執行方法並把結果編碼,經過網絡協議發回。 

     二、適用語言範圍不一樣:RMI只用於Java;RPC是網絡服務協議,與操做系統和語言無關。

 6、參考文獻
http://www.cnblogs.com/ygj093...

https://blog.csdn.net/lmy8626...
https://blog.csdn.net/shan9li...

7、更多討論
     1.rmi註冊服務的方式有哪些?

     LocateRegistry 類、 java.rmi.Naming 類、 java.naming.InitialContext 類均可以註冊服務。

     2.java.rmi.Naming類扮演了什麼樣的角色?

     java.rmi.Naming類用來存儲和獲取在遠程對象註冊表裏面的遠程對象的引用。Naming類的每個方法接收一個URL格式的String對象做爲它的參數。

     3.rmi的開發流程?

       1) 定義遠程接口  2) 實現遠程接口  3) 準備遠程調用的服務器對象  4) 生成殘根Stub(客戶代理)和框架Skeleton(服務器實體)  5) 用rmiregistry找到遠程對象  6) 運行測試RMI分佈式應用

相關文章
相關標籤/搜索