Java学习---RMI 技术分析[Hessian]
一、什么是Hessian
????? Hessian 是一個(gè)基于 binary-RPC 實(shí)現(xiàn)的遠(yuǎn)程通訊 library。使用二進(jìn)制傳輸數(shù)據(jù)。Hessian通常通過(guò)Web應(yīng)用來(lái)提供服務(wù),通過(guò)接口暴露。Servlet和Spring的DispatcherServlet都可以把請(qǐng)求轉(zhuǎn)發(fā)給Hessian服務(wù)。由以下兩種方式提供,分別為:com.caucho.hessian.server.HessianServlet、org.springframework.web.servlet.DispatcherServlet。
? ? ? Hessian是一個(gè)輕量級(jí)的remoting onhttp工具,使用簡(jiǎn)單的方法提供了RMI(Java Remote Method Invocation?方法遠(yuǎn)程調(diào)用 )的功能。 相比WebService,Hessian更簡(jiǎn)單、快捷。采用的是二進(jìn)制RPC((RemoteProcedureCallProtocol)——遠(yuǎn)程過(guò)程調(diào)用協(xié)議)協(xié)議,因?yàn)椴捎玫氖嵌M(jìn)制協(xié)議,所以它很適合于發(fā)送二進(jìn)制數(shù)據(jù)。
? ? ? Dubbo是[3]阿里巴巴公司開(kāi)源的一個(gè)高性能優(yōu)秀的服務(wù)框架,使得應(yīng)用可通過(guò)高性能的 RPC 實(shí)現(xiàn)服務(wù)的輸出和輸入功能,可以和 [4]Spring框架無(wú)縫集成。調(diào)用 淘寶和支付寶 的接口 ,通常使用 Dubbo ,Dubbo底層使用Hessian?
? ?下載網(wǎng)址: http://hessian.caucho.com/??hessian-4.0.33.jar?
關(guān)于hessian的7個(gè)問(wèn)題:
1、是基于什么協(xié)議實(shí)現(xiàn)的?
??? 基于Binary-RPC協(xié)議實(shí)現(xiàn)。
2、怎么發(fā)起請(qǐng)求?
??? 需通過(guò)Hessian本身提供的API來(lái)發(fā)起請(qǐng)求。
3、怎么 將請(qǐng)求轉(zhuǎn)化為符合協(xié)議的格式的?
??? Hessian通過(guò)其自定義的串行化機(jī)制將請(qǐng)求信息進(jìn)行序列化,產(chǎn)生二進(jìn)制流。
4、使用什么 傳輸協(xié)議傳輸?
??? Hessian基于Http協(xié)議進(jìn)行傳輸。
5、響應(yīng)端基于什么機(jī)制來(lái)接收請(qǐng)求?
??? 響應(yīng)端根據(jù)Hessian提供的API來(lái)接收請(qǐng)求。
6、怎么將流還原為傳輸格式的?
??? Hessian根據(jù)其私有的串行化機(jī)制來(lái)將請(qǐng)求信息進(jìn)行反序列化,傳遞給使用者時(shí)已是相應(yīng)的請(qǐng)求信息對(duì)象了。
7、處理完畢后怎么回應(yīng)?
?? 處理完畢后直接返回,hessian將結(jié)果對(duì)象進(jìn)行序列化,傳輸至調(diào)用端。
8、其他
? ? RMI 是 Java 首選遠(yuǎn)程調(diào)用協(xié)議,非常高效穩(wěn)定,特別是在數(shù)據(jù)結(jié)構(gòu)復(fù)雜,數(shù)據(jù)量大的情況下,與其他通訊協(xié)議的差距尤為明顯。但不能跨語(yǔ)言
? ? HttpInvoker 使用 java 的序列化技術(shù)傳輸對(duì)象,與 RMI 在本質(zhì)上是一致的,不能跨語(yǔ)言
? ? Hessian?性能比RMI 慢20% ,但是通過(guò)二進(jìn)制傳輸,跨語(yǔ)言
? ? Burlap?采用 xml 格式傳輸。僅在傳輸 1 條數(shù)據(jù)時(shí)速度尚可,通常情況下,它的毫?xí)r是 RMI 的 3 倍。
? ? WebService通訊毫?xí)r是 RMI 的 10 倍,傳輸xml數(shù)據(jù),基于soap協(xié)議 (Axis2、 CXF )
二、hessian的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
簡(jiǎn)單易用,面向接口,通過(guò)接口暴露服務(wù),jar包只有200、300k,不需要配置防火墻
效率高,復(fù)雜對(duì)象序列化速度僅次于RMI,簡(jiǎn)單對(duì)象序列化優(yōu)于RMI,二進(jìn)制傳輸
多語(yǔ)言支持:wiki、Java、Flash/Flex、Python、C++、.NET C#、PHP、Ruby、Objective-C
可與spring集成,配置簡(jiǎn)單,HessianServiceExporte
缺點(diǎn):
???? 缺乏安全機(jī)制,傳輸沒(méi)有加密處理
???? 異常機(jī)制不完善,總是報(bào)一些錯(cuò)誤,錯(cuò)誤原因也是千奇百怪,提示信息不足
???? 事務(wù)處理欠缺
???? 版本問(wèn)題,spring 2.5.6對(duì)照3.1.3版,spring 3對(duì)照4.0及以上版本,需要使用spring MVC
部分內(nèi)容
?
三、各個(gè)通訊協(xié)議對(duì)比:
?? 通訊效率測(cè)試結(jié)果:
?????? RMI > Httpinvoker >= Hessian >> Burlap >> Web service
?????? 1.RMI 是 Java 首選遠(yuǎn)程調(diào)用協(xié)議,非常高效穩(wěn)定,特別是在數(shù)據(jù)結(jié)構(gòu)復(fù)雜,數(shù)據(jù)量大的情況下,與其他通訊協(xié)議的差距尤為明顯。但不能跨語(yǔ)言。
?????? 2.HttpInvoker 使用 java 的序列化技術(shù)傳輸對(duì)象,與 RMI 在本質(zhì)上是一致的。從效率上看,兩者也相差無(wú)幾, HttpInvoker 與 RMI 的傳輸時(shí)間基本持平。
?????? 3.Hessian 在傳輸少量對(duì)象時(shí),比 RMI 還要快速高效,但傳輸數(shù)據(jù)結(jié)構(gòu)復(fù)雜的對(duì)象或大量數(shù)據(jù)對(duì)象時(shí),較 RMI 要慢 20% 左右。但這只是在數(shù)據(jù)量特別大,
數(shù)據(jù)結(jié)構(gòu)很復(fù)雜的情況下才能體現(xiàn)出來(lái),中等或少量數(shù)據(jù)時(shí), Hessian并不比RMI慢。 Hessian 的好處是精簡(jiǎn)高效,可以跨語(yǔ)言使用,而且協(xié)議規(guī)范公開(kāi),
我們可以針對(duì)任意語(yǔ)言開(kāi)發(fā)對(duì)其協(xié)議的實(shí)現(xiàn)。另外, Hessian與WEB服務(wù)器結(jié)合非常好,借助WEB服務(wù)器的成熟功能,在處理大量用戶并發(fā)訪問(wèn)時(shí)會(huì)有很大優(yōu)勢(shì),在資源分配,
線程排隊(duì),異常處理等方面都可以由成熟的WEB服務(wù)器保證。而 RMI 本身并不提供多線程的服務(wù)器。而且,RMI 需要開(kāi)防火墻端口, Hessian 不用。
?????? 4.Burlap 采用 xml 格式傳輸。僅在傳輸 1 條數(shù)據(jù)時(shí)速度尚可,通常情況下,它的毫?xí)r是 RMI 的 3 倍。
?????? 5.Web Service 的效率低下是眾所周知的,平均來(lái)看, Web Service 的通訊毫?xí)r是 RMI 的 10 倍。
四、基本應(yīng)用流程
客戶端必須具備以下幾點(diǎn):
·java客戶端包含Hessian.jar的包。
·具有和服務(wù)器端結(jié)構(gòu)一樣的接口。
?????? ·利用HessianProxyFactory調(diào)用遠(yuǎn)程接口。
?????? ·使用spring方式需要配置HessianProxyFactoryBean
注意:使用resin容器時(shí),resin已經(jīng)包含了hessian.jar包
JAVA服務(wù)器端必須具備以下幾點(diǎn):
·包含Hessian的jar包。
·設(shè)計(jì)一個(gè)接口,用來(lái)給客戶端調(diào)用。
·實(shí)現(xiàn)該接口的功能。
·配置web.xml,配好相應(yīng)的servlet。
·對(duì)象必須實(shí)現(xiàn)Serializable 接口。
????? ·對(duì)于spring方式DispatcherServlet攔截url,HessianServiceExporter提供Bean服務(wù)
?
五、幾種Remoting實(shí)現(xiàn)的比較
Spring支持的Remoting實(shí)現(xiàn)技術(shù)是非常多的,雖然Spring屏蔽了這些技術(shù)使用上的差異,但是選擇一個(gè)合適的Remoting技術(shù)仍然對(duì)系統(tǒng)有非常積極的作用,下面就來(lái)講述這些實(shí)現(xiàn)技術(shù)的優(yōu)缺點(diǎn)。
(1) RMI:
RMI使用Java的序列化機(jī)制實(shí)現(xiàn)調(diào)用及返回值的編組(marshal)與反編組(unmarshal),可以使用任何可序列化的對(duì)象作為參數(shù)和返回值。其缺點(diǎn)是RMI只能通過(guò)RMI協(xié)議來(lái)進(jìn)行訪問(wèn),無(wú)法通過(guò)HTTP協(xié)議訪問(wèn),無(wú)法穿透防火墻。
(2) Hessian:
Hessian也是將網(wǎng)絡(luò)傳輸?shù)膶?duì)象轉(zhuǎn)換為二進(jìn)制流通過(guò)Http進(jìn)行傳遞,不過(guò)它是使用自己的序列化機(jī)制實(shí)現(xiàn)的編組與反編組,其支持的數(shù)據(jù)類型是有限制的,不支持復(fù)雜的對(duì)象。Hessian的優(yōu)點(diǎn)是可以透過(guò)防火墻。
(3) Burlap:
Burlap是將網(wǎng)絡(luò)傳輸?shù)膶?duì)象轉(zhuǎn)換為XML文本格式通過(guò)Http進(jìn)行傳遞,支持的對(duì)象與Hessian相比更少。XML一般比二進(jìn)制流占 用空間大,在網(wǎng)絡(luò)上傳遞所需要的時(shí)間比二進(jìn)制流長(zhǎng),XML的解析過(guò)程也會(huì)耗用更多的內(nèi)存。Burlap可以穿透防火墻,而且由于傳輸?shù)母袷绞荴ML文本, 可以與其他系統(tǒng)(比如.NET)集成,從某種程度來(lái)講,Burlap是一種不標(biāo)準(zhǔn)的WebService。
(4) HttpInvoker:
?????? HttpInvoker將參數(shù)和返回值通過(guò)Java的序列化機(jī)制進(jìn)行編組和反編組,它具有RMI的支持所有可序列化對(duì)象的優(yōu)點(diǎn)。 Http Invoker是使用Http協(xié)議傳輸二進(jìn)制流的,而同時(shí)又具有Hessian、Burlap的優(yōu)點(diǎn)。
六、代碼測(cè)試
客戶端:
Basic.java
1 package mytest; 2 3 public interface Basic { 4 public String hello(); 5 } View CodeHessianClient.java
1 package mytest; 2 3 import java.net.MalformedURLException; 4 5 import com.caucho.hessian.client.HessianProxyFactory; 6 7 public class HessianClient { 8 public static void main(String[] args) throws MalformedURLException { 9 String url = "http://localhost:8080/hessian_server_test/hello"; 10 11 HessianProxyFactory factory = new HessianProxyFactory(); 12 Basic basic = (Basic) factory.create(Basic.class, url); 13 14 System.out.println("Hello: " + basic.hello()); 15 16 } 17 } View Code服務(wù)端:
Basic.java
1 package mytest; 2 3 public interface Basic { 4 public String hello(); 5 } View CodeBasicService.java
1 package mytest; 2 3 public class BasicService implements Basic { 4 5 private String greeting = "hello,world!"; 6 7 @Override 8 public String hello() { 9 return greeting; 10 } 11 12 public void setGreeting(String greeting) { 13 this.greeting = greeting; 14 } 15 16 } View Code?【更多參考】
Java學(xué)習(xí)---面向?qū)ο蟮倪h(yuǎn)程方法調(diào)用[RMI]
點(diǎn)擊下載
轉(zhuǎn)載于:https://www.cnblogs.com/ftl1012/p/hessian.html
總結(jié)
以上是生活随笔為你收集整理的Java学习---RMI 技术分析[Hessian]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python 中一些常用的内置函数
- 下一篇: 【转】Java学习---Java Web