在分布式服務(wù)框架中,一個最基礎(chǔ)的問題就是遠(yuǎn)程服務(wù)是怎么通訊的,在Java領(lǐng)域中有很多可實(shí)現(xiàn)遠(yuǎn)程通訊的技術(shù),例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,這些名詞之間到底是些什么關(guān)系呢,它們背后到底是基于什么原理實(shí)現(xiàn)的呢,了解這些是實(shí)現(xiàn)分布式服務(wù)框架的基礎(chǔ)知識,而如果在性能上有高的要求的話,那深入了解這些技術(shù)背后的機(jī)制就是必須的了,在這篇blog中我們將來一探究竟,拋磚引玉,歡迎大家提供更多的實(shí)現(xiàn)遠(yuǎn)程通訊的技術(shù)和原理的介紹。
基本原理
要實(shí)現(xiàn)網(wǎng)絡(luò)機(jī)器間的通訊,首先得來看看計(jì)算機(jī)系統(tǒng)網(wǎng)絡(luò)通信的基本原理,在底層層面去看,網(wǎng)絡(luò)通信需要做的就是將流從一臺計(jì)算機(jī)傳輸?shù)搅硗庖慌_計(jì)算機(jī),基于傳輸協(xié)議和網(wǎng)絡(luò)IO來實(shí)現(xiàn),其中傳輸協(xié)議比較出名的有http、tcp、udp等等,http、tcp、udp都是在基于Socket概念上為某類應(yīng)用場景而擴(kuò)展出的傳輸協(xié)議,網(wǎng)絡(luò)IO,主要有bio、nio、aio三種方式,所有的分布式應(yīng)用通訊都基于這個原理而實(shí)現(xiàn),只是為了應(yīng)用的易用,各種語言通常都會提供一些更為貼近應(yīng)用易用的應(yīng)用層協(xié)議。
應(yīng)用級協(xié)議
遠(yuǎn)程服務(wù)通訊,需要達(dá)到的目標(biāo)是在一臺計(jì)算機(jī)發(fā)起請求,另外一臺機(jī)器在接收到請求后進(jìn)行相應(yīng)的處理并將結(jié)果返回給請求端,這其中又會有諸如one way request、同步請求、異步請求等等請求方式,按照網(wǎng)絡(luò)通信原理,需要實(shí)現(xiàn)這個需要做的就是將請求轉(zhuǎn)換成流,通過傳輸協(xié)議傳輸至遠(yuǎn)端,遠(yuǎn)端計(jì)算機(jī)在接收到請求的流后進(jìn)行處理,處理完畢后將結(jié)果轉(zhuǎn)化為流,并通過傳輸協(xié)議返回給調(diào)用端。 原理是這樣的,但為了應(yīng)用的方便,業(yè)界推出了很多基于此原理之上的應(yīng)用級的協(xié)議,使得大家可以不用去直接操作這么底層的東西,通常應(yīng)用級的遠(yuǎn)程通信協(xié)議會提供:
- 為了避免直接做流操作這么麻煩,提供一種更加易用或貼合語言的標(biāo)準(zhǔn)傳輸格式;
- 網(wǎng)絡(luò)通信機(jī)制的實(shí)現(xiàn),就是替你完成了將傳輸格式轉(zhuǎn)化為流,通過某種傳輸協(xié)議傳輸至遠(yuǎn)端計(jì)算機(jī),遠(yuǎn)端計(jì)算機(jī)在接收到流后轉(zhuǎn)化為傳輸格式,并進(jìn)行存儲或以某種方式通知遠(yuǎn)端計(jì)算機(jī)。
所以在學(xué)習(xí)應(yīng)用級的遠(yuǎn)程通信協(xié)議時,我們可以帶著這幾個問題進(jìn)行學(xué)習(xí):
- 傳輸?shù)臉?biāo)準(zhǔn)格式是什么?
- 怎么樣將請求轉(zhuǎn)化為傳輸?shù)牧鳎?
- 怎么接收和處理流?
- 傳輸協(xié)議是?
不過應(yīng)用級的遠(yuǎn)程通信協(xié)議并不會在傳輸協(xié)議上做什么多大的改進(jìn),主要是在流操作方面,讓應(yīng)用層生成流和處理流的這個過程更加的貼合所使用的語言或標(biāo)準(zhǔn),至于傳輸協(xié)議則通常都是可選的,在java領(lǐng)域中知名的有:RMI、XML-RPC、Binary-RPC、SOAP、CORBA、JMS,來具體的看看這些遠(yuǎn)程通信的應(yīng)用級協(xié)議:
RMI
RMI是個典型的為java定制的遠(yuǎn)程通信協(xié)議,我們都知道,在single vm中,我們可以通過直接調(diào)用java object instance來實(shí)現(xiàn)通信,那么在遠(yuǎn)程通信時,如果也能按照這種方式當(dāng)然是最好了,這種遠(yuǎn)程通信的機(jī)制成為RPC(Remote Procedure Call),RMI正是朝著這個目標(biāo)而誕生的。
來看下基于RMI的一次完整的遠(yuǎn)程通信過程的原理:
- 客戶端發(fā)起請求,請求轉(zhuǎn)交至RMI客戶端的stub類;
- stub類將請求的接口、方法、參數(shù)等信息進(jìn)行序列化;
- 基于socket將序列化后的流傳輸至服務(wù)器端;
- 服務(wù)器端接收到流后轉(zhuǎn)發(fā)至相應(yīng)的skelton類;
- skelton類將請求的信息反序列化后調(diào)用實(shí)際的處理類;
- 處理類處理完畢后將結(jié)果返回給skelton類;
- Skelton類將結(jié)果序列化,通過socket將流傳送給客戶端的stub;
- stub在接收到流后反序列化,將反序列化后的Java Object返回給調(diào)用者。
根據(jù)原理來回答下之前學(xué)習(xí)應(yīng)用級協(xié)議帶著的幾個問題:
- 傳輸?shù)臉?biāo)準(zhǔn)格式是什么?
是Java ObjectStream。
- 怎么樣將請求轉(zhuǎn)化為傳輸?shù)牧鳎?br>基于Java串行化機(jī)制將請求的java object信息轉(zhuǎn)化為流。
- 怎么接收和處理流?
根據(jù)采用的協(xié)議啟動相應(yīng)的監(jiān)聽端口,當(dāng)有流進(jìn)入后基于Java串行化機(jī)制將流進(jìn)行反序列化,并根據(jù)RMI協(xié)議獲取到相應(yīng)的處理對象信息,進(jìn)行調(diào)用并處理,處理完畢后的結(jié)果同樣基于java串行化機(jī)制進(jìn)行返回。
- 傳輸協(xié)議是?
Socket。
出處:CSDN
責(zé)任編輯:bluehearts
上一頁 下一頁 Java遠(yuǎn)程通訊可選技術(shù)及原理 [2]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|