可選實現(xiàn)技術(shù)
當然,在上面的原理中并沒有介紹到所有的java領(lǐng)域可選的遠程通信協(xié)議了,例如還有EJB采用的ORMI、Spring自己定義的一個簡單的Http Invoker等等。 看完原理后我們再來看看目前java領(lǐng)域可用于實現(xiàn)遠程通訊的框架或library,知名的有:JBoss-Remoting、Spring-Remoting、Hessian、Burlap、XFire(Axis)、ActiveMQ、Mina、Mule、EJB3等等,來對每種做個簡單的介紹和評價,其實呢,要做分布式服務(wù)框架,這些東西都是要有非常深刻的了解的,因為分布式服務(wù)框架其實是包含了解決分布式領(lǐng)域以及應(yīng)用層面領(lǐng)域兩方面問題的。 當然,你也可以自己根據(jù)遠程網(wǎng)絡(luò)通信原理(transport protocol+Net IO)去實現(xiàn)自己的通訊框架或library。
那么在了解這些遠程通訊的框架或library時,會帶著什么問題去學(xué)習呢?
- 是基于什么協(xié)議實現(xiàn)的?
- 怎么發(fā)起請求?
- 怎么將請求轉(zhuǎn)化為符合協(xié)議的格式的?
- 使用什么傳輸協(xié)議傳輸?
- 響應(yīng)端基于什么機制來接收請求?
- 怎么將流還原為傳輸格式的?
- 處理完畢后怎么回應(yīng)?
JBoss-Remoting
Jboss-remoting是由jboss編寫的一個java領(lǐng)域的遠程通訊框架,基于此框架,可以很簡單的實現(xiàn)基于多種傳輸協(xié)議的java對象的RPC。
直接來回答問題:
- 是基于什么協(xié)議實現(xiàn)的?
JBoss-Remoting是個通訊框架,因此它支持多種協(xié)議方式的通信,例如純粹的socket+io方式、rmi方式、http+io方式等。
- 怎么發(fā)起請求?
在JBoss-Remoting中,只需將需要發(fā)起的請求參數(shù)對象傳入jboss-remoting的InvocationRequest對象即可,也可根據(jù)協(xié)議基于InvocationRequest封裝符合需求的InvocationRequest對象。
- 怎么將請求轉(zhuǎn)化為符合協(xié)議的格式的?
JBoss-Remoting基于Java串行化機制或JBoss自己的串行化實現(xiàn)來將請求轉(zhuǎn)化為對象字節(jié)流。
- 使用什么傳輸協(xié)議傳輸?
支持多種傳輸協(xié)議,例如socket、http等。
- 響應(yīng)端基于什么機制來接收請求?
響應(yīng)端只需將自己的處理對象注冊到JBoss-Remoting提供的server端的Connector對象中即可。
- 怎么將流還原為傳輸格式的?
JBoss-Remoting基于java串行化機制或jboss自己的串行化實現(xiàn)來將請求信息還原為java對象。
- 處理完畢后怎么回應(yīng)?
處理完畢后將結(jié)果對象直接返回即可,jboss-remoting會將此對象按照協(xié)議進行序列化,返回至調(diào)用端。
另外,jboss-remoting支持多種通信方式,例如同步/異步/單向通信等。
Spring-Remoting
Spring-remoting是Spring提供java領(lǐng)域的遠程通訊框架,基于此框架,同樣也可以很簡單的將普通的spring bean以某種遠程協(xié)議的方式來發(fā)布,同樣也可以配置spring bean為遠程調(diào)用的bean。
- 是基于什么協(xié)議實現(xiàn)的?
和JBoss-Remoting一樣,作為一個遠程通訊的框架,Spring通過集成多種遠程通訊的library,從而實現(xiàn)了對多種協(xié)議的支持,例如rmi、http+io、xml-rpc、binary-rpc等。
- 怎么發(fā)起請求?
在Spring中,由于其對于遠程調(diào)用的bean采用的是proxy實現(xiàn),發(fā)起請求完全是通過服務(wù)接口調(diào)用的方式。
- 怎么將請求轉(zhuǎn)化為符合協(xié)議的格式的?
Spring按照協(xié)議方式將請求的對象信息轉(zhuǎn)化為流,例如Spring Http Invoker是基于Spring自己定義的一個協(xié)議來實現(xiàn)的,傳輸協(xié)議上采用的為http,請求信息是基于java串行化機制轉(zhuǎn)化為流進行傳輸。
- 使用什么傳輸協(xié)議傳輸?
支持多種傳輸協(xié)議,例如rmi、http等等。
- 響應(yīng)端基于什么機制來接收請求?
響應(yīng)端遵循協(xié)議方式來接收請求,對于使用者而言,則只需通過spring的配置方式將普通的spring bean配置為響應(yīng)端或者說提供服務(wù)端。
- 怎么將流還原為傳輸格式的?
按照協(xié)議方式來進行還原。
- 處理完畢后怎么回應(yīng)?
處理完畢后直接返回即可,spring-remoting將根據(jù)協(xié)議方式來做相應(yīng)的序列化。
Hessian
Hessian是由caucho提供的一個基于binary-RPC實現(xiàn)的遠程通訊library。
- 是基于什么協(xié)議實現(xiàn)的?
基于Binary-RPC協(xié)議實現(xiàn)。
- 怎么發(fā)起請求?
需通過Hessian本身提供的API來發(fā)起請求。
- 怎么將請求轉(zhuǎn)化為符合協(xié)議的格式的?
Hessian通過其自定義的串行化機制將請求信息進行序列化,產(chǎn)生二進制流。
- 使用什么傳輸協(xié)議傳輸?
Hessian基于Http協(xié)議進行傳輸。
- 響應(yīng)端基于什么機制來接收請求?
響應(yīng)端根據(jù)Hessian提供的API來接收請求。
- 怎么將流還原為傳輸格式的?
Hessian根據(jù)其私有的串行化機制來將請求信息進行反序列化,傳遞給使用者時已是相應(yīng)的請求信息對象了。
- 處理完畢后怎么回應(yīng)?
處理完畢后直接返回,hessian將結(jié)果對象進行序列化,傳輸至調(diào)用端。
Burlap
Burlap也是有caucho提供,它和hessian的不同在于,它是基于XML-RPC協(xié)議的。
- 是基于什么協(xié)議實現(xiàn)的?
基于XML-RPC協(xié)議實現(xiàn)。
- 怎么發(fā)起請求?
根據(jù)Burlap提供的API。
- 怎么將請求轉(zhuǎn)化為符合協(xié)議的格式的?
將請求信息轉(zhuǎn)化為符合協(xié)議的XML格式,轉(zhuǎn)化為流進行傳輸。
- 使用什么傳輸協(xié)議傳輸?
Http協(xié)議。
- 響應(yīng)端基于什么機制來接收請求?
監(jiān)聽Http請求。
- 怎么將流還原為傳輸格式的?
根據(jù)XML-RPC協(xié)議進行還原。
- 處理完畢后怎么回應(yīng)?
返回結(jié)果寫入XML中,由Burlap返回至調(diào)用端。
XFire、Axis
XFire、Axis是Webservice的實現(xiàn)框架,WebService可算是一個完整的SOA架構(gòu)實現(xiàn)標準了,因此采用XFire、Axis這些也就意味著是采用webservice方式了。
- 是基于什么協(xié)議實現(xiàn)的?
基于SOAP協(xié)議。
- 怎么發(fā)起請求?
獲取到遠端service的proxy后直接調(diào)用。
- 怎么將請求轉(zhuǎn)化為符合協(xié)議的格式的?
將請求信息轉(zhuǎn)化為遵循SOAP協(xié)議的XML格式,由框架轉(zhuǎn)化為流進行傳輸。
- 使用什么傳輸協(xié)議傳輸?
Http協(xié)議。
- 響應(yīng)端基于什么機制來接收請求?
監(jiān)聽Http請求。
- 怎么將流還原為傳輸格式的?
根據(jù)SOAP協(xié)議進行還原。
- 處理完畢后怎么回應(yīng)?
返回結(jié)果寫入XML中,由框架返回至調(diào)用端。
ActiveMQ
ActiveMQ是JMS的實現(xiàn),基于JMS這類消息機制實現(xiàn)遠程通訊是一種不錯的選擇,畢竟消息機制本身的功能使得基于它可以很容易的去實現(xiàn)同步/異步/單向調(diào)用等,而且消息機制從容錯角度上來說也是個不錯的選擇,這是Erlang能夠做到容錯的重要基礎(chǔ)。
- 是基于什么協(xié)議實現(xiàn)的?
基于JMS協(xié)議。
- 怎么發(fā)起請求?
遵循JMS API發(fā)起請求。
- 怎么將請求轉(zhuǎn)化為符合協(xié)議的格式的?
不太清楚,猜想應(yīng)該是二進制流。
- 使用什么傳輸協(xié)議傳輸?
支持多種傳輸協(xié)議,例如socket、http等等。
- 響應(yīng)端基于什么機制來接收請求?
監(jiān)聽符合協(xié)議的端口。
- 怎么將流還原為傳輸格式的?
同問題3。
- 處理完畢后怎么回應(yīng)?
遵循JMS API生成消息,并寫入JMS Queue中。
基于JMS此類機制實現(xiàn)遠程通訊的例子有Spring-Intergration、Mule、Lingo等等。
Mina
Mina是Apache提供的通訊框架,在之前一直沒有提到網(wǎng)絡(luò)IO這塊,之前提及的框架或library基本都是基于BIO的,而Mina是采用NIO的,NIO在并發(fā)量增長時對比BIO而言會有明顯的性能提升,而java性能的提升,與其NIO這塊與OS的緊密結(jié)合是有不小的關(guān)系的。
- 是基于什么協(xié)議實現(xiàn)的?
基于純粹的Socket+NIO。
- 怎么發(fā)起請求?
通過Mina提供的Client API。
- 怎么將請求轉(zhuǎn)化為符合協(xié)議的格式的?
Mina遵循java串行化機制對請求對象進行序列化。
- 使用什么傳輸協(xié)議傳輸?
支持多種傳輸協(xié)議,例如socket、http等等。
- 響應(yīng)端基于什么機制來接收請求?
以NIO的方式監(jiān)聽協(xié)議端口。
- 怎么將流還原為傳輸格式的?
遵循java串行化機制對請求對象進行反序列化。
- 處理完畢后怎么回應(yīng)?
遵循Mina API進行返回。
MINA是NIO方式的,因此支持異步調(diào)用是毫無懸念的。
EJB
EJB最突出的在于其分布式,EJB采用的是ORMI協(xié)議,和RMI協(xié)議是差不多的,但EJB在分布式通訊的安全控制、transport pool、smart proxy等方面的突出使得其在分布式領(lǐng)域是不可忽視的力量。
- 是基于什么協(xié)議實現(xiàn)的?
基于ORMI協(xié)議。
- 怎么發(fā)起請求?
EJB調(diào)用。
- 怎么將請求轉(zhuǎn)化為符合協(xié)議的格式的?
遵循java串行化機制對請求對象進行序列化。
- 使用什么傳輸協(xié)議傳輸?
Socket。
- 響應(yīng)端基于什么機制來接收請求?
監(jiān)聽協(xié)議端口。
- 怎么將流還原為傳輸格式的?
遵循java串行化機制對請求對象進行反序列化。
- 處理完畢后怎么回應(yīng)?
直接返回處理對象即可。
在之前的分布式服務(wù)框架系列的文章中對于jndi有誤導(dǎo)的嫌疑,在這篇blog中也順帶的提下jndi的機制,由于JNDI取決于具體的實現(xiàn),在這里只能是講解下jboss的jndi的實現(xiàn)了。
在將對象實例綁定到j(luò)boss jnp server后,當遠程端采用context.lookup()方式獲取遠程對象實例并開始調(diào)用時,jboss jndi的實現(xiàn)方法是從jnp server上獲取對象實例,將其序列化回本地,然后在本地進行反序列化,之后在本地進行類調(diào)用。 通過這個機制,就可以知道了,本地其實是必須有綁定到j(luò)boss上的對象實例的class的,否則反序列化的時候肯定就失敗了,而遠程通訊需要做到的是在遠程執(zhí)行某動作,并獲取到相應(yīng)的結(jié)果,可見純粹基于JNDI是無法實現(xiàn)遠程通訊的。 但JNDI也是實現(xiàn)分布式服務(wù)框架一個很關(guān)鍵的技術(shù)點,因為可以通過它來實現(xiàn)透明化的遠端和本地調(diào)用,就像ejb,另外它也是個很好的隱藏實際部署機制(就像datasource)等的方案。
總結(jié)
由上一系列的分析可知,在遠程通訊領(lǐng)域中,涉及的知識點還是相當?shù)亩嗟模缬校和ㄐ艆f(xié)議(Socket/tcp/http/udp/rmi/xml-rpc etc.)、消息機制、網(wǎng)絡(luò)IO(BIO/NIO/AIO)、MultiThread、本地調(diào)用與遠程調(diào)用的透明化方案(涉及java classloader、Dynamic Proxy、Unit Test etc.)、異步與同步調(diào)用、網(wǎng)絡(luò)通信處理機制(自動重連、廣播、異常、池處理等等)、Java Serialization (各種協(xié)議的私有序列化機制等)、各種框架的實現(xiàn)原理(傳輸格式、如何將傳輸格式轉(zhuǎn)化為流的、如何將請求信息轉(zhuǎn)化為傳輸格式的、如何接收流的、如何將流還原為傳輸格式的等等),要精通其中的哪些東西,得根據(jù)實際需求來決定了,只有在了解了原理的情況下才能很容易的做出選擇,甚至可以根據(jù)需求做私有的遠程通訊協(xié)議,對于從事分布式服務(wù)平臺或開發(fā)較大型的分布式應(yīng)用的人而言,我覺得至少上面提及的知識點是需要比較了解的。
參考文檔(感謝這些文章) RMI原理及實現(xiàn):http://www.yesky.com/274/1625274.shtml Java NIO原理和使用: http://www.jdon.com/concurrent/nio%D4%AD%C0%ED%D3%A6%D3%C3.htm XML RPC協(xié)議:http://hedong.3322.org/archives/000470.html http://www.mengyan.org/blog/archives/2005/07/12/30.html Spring技術(shù)應(yīng)用中的遠程服務(wù)詳解:http://www.builder.com.cn/2007/1027/583384.shtml JAVA RPC通信機制之SOAP:http://www.java114.com/content16/content3826.html Java Remoting:Protocol BenchMarks:http://q.sohu.com/forum/5/topic/1148909 Evalution of RMI Alternative:https://www.jfire.org/modules/phpwiki/index.php/Evaluation%20of%20RMI%20Alternative Metaprotocol Taxonomy:http://hessian.caucho.com/doc/metaprotocol-taxonomy.xtp 什么是Webservice:http://www.vchome.net/dotnet/webservice/webservice15.htm
本文鏈接:http://www.95time.cn/tech/program/2008/5438.asp
出處:CSDN
責任編輯:bluehearts
上一頁 Java遠程通訊可選技術(shù)及原理 [2] 下一頁
◎進入論壇網(wǎng)絡(luò)編程版塊參加討論
|