大家好贷岸,我是IT修真院深圳分院第5期學(xué)員,一枚正直善良的JAVA程序員磷雇。
今天給大家分享一下偿警,修真院官網(wǎng)JAVA任務(wù)8中,什么是RMI唯笙?為什么要使用RMI框架螟蒸?
一、背景介紹
什么是RMI
RMI是Java的一組擁護(hù)開發(fā)分布式應(yīng)用程序的API崩掘。RMI使用Java語言接口定義了遠(yuǎn)程對象七嫌,它集合了Java序列化和Java遠(yuǎn)程方法協(xié)議(Java Remote Method Protocol)。
RMI有什么用
RMI用于不同Java虛擬機(jī)之間的通信苞慢,這些虛擬機(jī)可以在不同的主機(jī)上诵原、也可以在同一個主機(jī)上;一個虛擬機(jī)中的對象調(diào)用另一個虛擬上中的對象的方法,只不過是允許被遠(yuǎn)程調(diào)用的對象要通過一些標(biāo)志加以標(biāo)識绍赛。RMI中的核心是遠(yuǎn)程對象(remote object)蔓纠,除了對象本身所在的虛擬機(jī),其他虛擬機(jī)也可以調(diào)用此對象的方法吗蚌,而且這些虛擬機(jī)可以不在同一個主機(jī)上腿倚。每個遠(yuǎn)程對象都要實現(xiàn)一個或者多個遠(yuǎn)程接口來標(biāo)識自己,聲明了可以被外部系統(tǒng)或者應(yīng)用調(diào)用的方法
RMI的通信模型
從方法調(diào)用角度來看蚯妇,RMI要解決的問題敷燎,是讓客戶端對遠(yuǎn)程方法的調(diào)用可以相當(dāng)于對本地方法的調(diào)用而屏蔽其中關(guān)于遠(yuǎn)程通信的內(nèi)容,即使在遠(yuǎn)程上箩言,也和在本地上是一樣的懈叹。
實際上,客戶端只與代表遠(yuǎn)程主機(jī)中對象的Stub對象進(jìn)行通信分扎,絲毫不知道Server的存在澄成。客戶端只是調(diào)用Stub對象中的本地方法墨状,Stub對象是一個本地對象,它實現(xiàn)了遠(yuǎn)程對象向外暴露的接口菲饼,也就是說它的方法和遠(yuǎn)程對象暴露的方法的簽名是相同的肾砂。客戶端認(rèn)為它是調(diào)用遠(yuǎn)程對象的方法宏悦,實際上是調(diào)用Stub對象中的方法镐确。可以理解為Stub對象是遠(yuǎn)程對象在本地的一個代理饼煞,當(dāng)客戶端調(diào)用方法的時候源葫,Stub對象會將調(diào)用通過網(wǎng)絡(luò)傳遞給遠(yuǎn)程對象。
二砖瞧、知識剖析
RMI遠(yuǎn)程調(diào)用步驟
1息堂,客戶對象調(diào)用客戶端輔助對象上的方法
2,客戶端輔助對象打包調(diào)用信息(變量块促,方法名)荣堰,通過網(wǎng)絡(luò)發(fā)送給服務(wù)端輔助對象
3,服務(wù)端輔助對象將客戶端輔助對象發(fā)送來的信息解包竭翠,找出真正被調(diào)用的方法以及該方法所在對象
4振坚,調(diào)用真正服務(wù)對象上的真正方法,并將結(jié)果返回給服務(wù)端輔助對象
5斋扰,服務(wù)端輔助對象將結(jié)果打包渡八,發(fā)送給客戶端輔助對象
6啃洋,客戶端輔助對象將返回值解包,返回給客戶對象
7呀狼,客戶對象獲得返回值
如何實現(xiàn)一個RMI程序
1.創(chuàng)建遠(yuǎn)程接口, 并且繼承java.rmi.Remote接口损离。
2.實現(xiàn)遠(yuǎn)程接口哥艇,并且繼承:UnicastRemoteObject
3.創(chuàng)建服務(wù)器程序: createRegistry方法注冊遠(yuǎn)程對象,暴露一個監(jiān)聽
4.創(chuàng)建客戶端程序僻澎,通過ip和端口連接到指定的服務(wù)器貌踏,并且將數(shù)據(jù)做封裝(序列化)
5.服務(wù)器端收到請求,先反序列化窟勃。再進(jìn)行業(yè)務(wù)邏輯處理祖乳。把返回結(jié)果序列化返回
三、常見問題
1秉氧、數(shù)據(jù)的傳遞問題
我們都知道在Java程序中引用類型(不包括基本類型)的參數(shù)傳遞是按引用傳遞的眷昆,對于在同一個虛擬機(jī)中的傳遞時是沒有問題的,因為的參數(shù)的引用對應(yīng)的是同一個內(nèi)存空間汁咏,但是對于分布式系統(tǒng)中亚斋,由于對象不再存在于同一個內(nèi)存空間,虛擬機(jī)A的對象引用對于虛擬機(jī)B沒有任何意義攘滩,那么怎么解決這個問題呢?
2漂问、遠(yuǎn)程對象的發(fā)現(xiàn)問題
在調(diào)用遠(yuǎn)程對象的方法之前需要一個遠(yuǎn)程對象的引用,如何獲得這個遠(yuǎn)程對象的引用在RMI中是一個關(guān)鍵的問題
4.解決方案
a栏饮、將引用傳遞更改為值傳遞,也就是將對象序列化為字節(jié)磷仰,然后使用該字節(jié)的副本在客戶端和服務(wù)器之間傳遞抡爹,而且一個虛擬機(jī)中對該值的修改不會影響到其他主機(jī)中的數(shù)據(jù)芒划,在Java中一個對象如果能夠被序列化冬竟,需要滿足下面兩個條件之一:
1民逼、是Java的基本類型
2泵殴、實現(xiàn)java.io.Serializable接口(String類即實現(xiàn)了該接口)
b、在我們?nèi)粘J褂镁W(wǎng)絡(luò)時拼苍,基本上都是通過域名來定位一個網(wǎng)站笑诅,但是實際上網(wǎng)絡(luò)是通過IP地址來定位網(wǎng)站的,因此其中就需要一個映射的過程吆你,域名系統(tǒng)(DNS)就是為了這個目的出現(xiàn)的,在域名系統(tǒng)中通過域名來查找對應(yīng)的IP地址來訪問對應(yīng)的服務(wù)器伤哺。那么對應(yīng)的者祖,IP地址在這里就相當(dāng)于遠(yuǎn)程對象的引用,而DNS則相當(dāng)于一個注冊表(Registry)七问。而域名在RMI中就相當(dāng)于遠(yuǎn)程對象的標(biāo)識符,客戶端通過提供遠(yuǎn)程對象的標(biāo)識符訪問注冊表械巡,來得到遠(yuǎn)程對象的引用。這個標(biāo)識符是類似URL地址格式的.
五芦鳍、編碼實戰(zhàn)
六葛账、擴(kuò)展思考
RMI優(yōu)缺點是什么?
優(yōu)點:可以用于分布式開發(fā)籍琳,避免重復(fù)造輪子
缺點:調(diào)用過程很慢,而且該過程是不可靠的喝峦,容易發(fā)生不可預(yù)料的錯誤,比如網(wǎng)絡(luò)錯誤等
七谣蠢、參考文獻(xiàn)
1.CSDN博客:https://blog.csdn.net/u014001866/article/details/50936246
2.CSDN博客:https://blog.csdn.net/lmy86263/article/details/72594760
八查近、更多討論
Q1、RMI中 如何改變調(diào)用的IP霜威?
答:在服務(wù)器端可以自己設(shè)置
Q2、一般基于什么考慮來拆分婿禽?
答:參考web開發(fā)三層架構(gòu)
Q3、網(wǎng)絡(luò)通信是依靠什么完成的扭倾?
答:socket
今天的分享就到這里啦,歡迎大家提問和探討!
PPT:PPT
感謝大家觀看
今天的分享就到這里啦驾中,歡迎大家點贊恢筝、轉(zhuǎn)發(fā)巨坊、留言、拍磚~
技能樹.IT修真院
“我們相信人人都可以成為一個工程師趾撵,現(xiàn)在開始,找個師兄暂题,帶你入門究珊,掌控自己學(xué)習(xí)的節(jié)奏,學(xué)習(xí)的路上不再迷媒虽蹋”悬槽。
這里是技能樹.IT修真院瞬浓,成千上萬的師兄在這里找到了自己的學(xué)習(xí)路線猿棉,學(xué)習(xí)透明化,成長可見化萨赁,師兄1對1免費指導(dǎo)》醚快來與我一起學(xué)習(xí)吧~
作者:東
鏈接:http://www.reibang.com/p/1ebbafa093b6
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)臣缀,非商業(yè)轉(zhuǎn)載請注明出處。