Java学习---RMI 技术分析[Hessian]
一、什么是Hessian
????? Hessian 是一個基于 binary-RPC 實現的遠程通訊 library。使用二進制傳輸數據。Hessian通常通過Web應用來提供服務,通過接口暴露。Servlet和Spring的DispatcherServlet都可以把請求轉發給Hessian服務。由以下兩種方式提供,分別為:com.caucho.hessian.server.HessianServlet、org.springframework.web.servlet.DispatcherServlet。
? ? ? Hessian是一個輕量級的remoting onhttp工具,使用簡單的方法提供了RMI(Java Remote Method Invocation?方法遠程調用 )的功能。 相比WebService,Hessian更簡單、快捷。采用的是二進制RPC((RemoteProcedureCallProtocol)——遠程過程調用協議)協議,因為采用的是二進制協議,所以它很適合于發送二進制數據。
? ? ? Dubbo是[3]阿里巴巴公司開源的一個高性能優秀的服務框架,使得應用可通過高性能的 RPC 實現服務的輸出和輸入功能,可以和 [4]Spring框架無縫集成。調用 淘寶和支付寶 的接口 ,通常使用 Dubbo ,Dubbo底層使用Hessian?
? ?下載網址: http://hessian.caucho.com/??hessian-4.0.33.jar?
關于hessian的7個問題:
1、是基于什么協議實現的?
??? 基于Binary-RPC協議實現。
2、怎么發起請求?
??? 需通過Hessian本身提供的API來發起請求。
3、怎么 將請求轉化為符合協議的格式的?
??? Hessian通過其自定義的串行化機制將請求信息進行序列化,產生二進制流。
4、使用什么 傳輸協議傳輸?
??? Hessian基于Http協議進行傳輸。
5、響應端基于什么機制來接收請求?
??? 響應端根據Hessian提供的API來接收請求。
6、怎么將流還原為傳輸格式的?
??? Hessian根據其私有的串行化機制來將請求信息進行反序列化,傳遞給使用者時已是相應的請求信息對象了。
7、處理完畢后怎么回應?
?? 處理完畢后直接返回,hessian將結果對象進行序列化,傳輸至調用端。
8、其他
? ? RMI 是 Java 首選遠程調用協議,非常高效穩定,特別是在數據結構復雜,數據量大的情況下,與其他通訊協議的差距尤為明顯。但不能跨語言
? ? HttpInvoker 使用 java 的序列化技術傳輸對象,與 RMI 在本質上是一致的,不能跨語言
? ? Hessian?性能比RMI 慢20% ,但是通過二進制傳輸,跨語言
? ? Burlap?采用 xml 格式傳輸。僅在傳輸 1 條數據時速度尚可,通常情況下,它的毫時是 RMI 的 3 倍。
? ? WebService通訊毫時是 RMI 的 10 倍,傳輸xml數據,基于soap協議 (Axis2、 CXF )
二、hessian的優缺點
優點:
簡單易用,面向接口,通過接口暴露服務,jar包只有200、300k,不需要配置防火墻
效率高,復雜對象序列化速度僅次于RMI,簡單對象序列化優于RMI,二進制傳輸
多語言支持:wiki、Java、Flash/Flex、Python、C++、.NET C#、PHP、Ruby、Objective-C
可與spring集成,配置簡單,HessianServiceExporte
缺點:
???? 缺乏安全機制,傳輸沒有加密處理
???? 異常機制不完善,總是報一些錯誤,錯誤原因也是千奇百怪,提示信息不足
???? 事務處理欠缺
???? 版本問題,spring 2.5.6對照3.1.3版,spring 3對照4.0及以上版本,需要使用spring MVC
部分內容
?
三、各個通訊協議對比:
?? 通訊效率測試結果:
?????? RMI > Httpinvoker >= Hessian >> Burlap >> Web service
?????? 1.RMI 是 Java 首選遠程調用協議,非常高效穩定,特別是在數據結構復雜,數據量大的情況下,與其他通訊協議的差距尤為明顯。但不能跨語言。
?????? 2.HttpInvoker 使用 java 的序列化技術傳輸對象,與 RMI 在本質上是一致的。從效率上看,兩者也相差無幾, HttpInvoker 與 RMI 的傳輸時間基本持平。
?????? 3.Hessian 在傳輸少量對象時,比 RMI 還要快速高效,但傳輸數據結構復雜的對象或大量數據對象時,較 RMI 要慢 20% 左右。但這只是在數據量特別大,
數據結構很復雜的情況下才能體現出來,中等或少量數據時, Hessian并不比RMI慢。 Hessian 的好處是精簡高效,可以跨語言使用,而且協議規范公開,
我們可以針對任意語言開發對其協議的實現。另外, Hessian與WEB服務器結合非常好,借助WEB服務器的成熟功能,在處理大量用戶并發訪問時會有很大優勢,在資源分配,
線程排隊,異常處理等方面都可以由成熟的WEB服務器保證。而 RMI 本身并不提供多線程的服務器。而且,RMI 需要開防火墻端口, Hessian 不用。
?????? 4.Burlap 采用 xml 格式傳輸。僅在傳輸 1 條數據時速度尚可,通常情況下,它的毫時是 RMI 的 3 倍。
?????? 5.Web Service 的效率低下是眾所周知的,平均來看, Web Service 的通訊毫時是 RMI 的 10 倍。
四、基本應用流程
客戶端必須具備以下幾點:
·java客戶端包含Hessian.jar的包。
·具有和服務器端結構一樣的接口。
?????? ·利用HessianProxyFactory調用遠程接口。
?????? ·使用spring方式需要配置HessianProxyFactoryBean
注意:使用resin容器時,resin已經包含了hessian.jar包
JAVA服務器端必須具備以下幾點:
·包含Hessian的jar包。
·設計一個接口,用來給客戶端調用。
·實現該接口的功能。
·配置web.xml,配好相應的servlet。
·對象必須實現Serializable 接口。
????? ·對于spring方式DispatcherServlet攔截url,HessianServiceExporter提供Bean服務
?
五、幾種Remoting實現的比較
Spring支持的Remoting實現技術是非常多的,雖然Spring屏蔽了這些技術使用上的差異,但是選擇一個合適的Remoting技術仍然對系統有非常積極的作用,下面就來講述這些實現技術的優缺點。
(1) RMI:
RMI使用Java的序列化機制實現調用及返回值的編組(marshal)與反編組(unmarshal),可以使用任何可序列化的對象作為參數和返回值。其缺點是RMI只能通過RMI協議來進行訪問,無法通過HTTP協議訪問,無法穿透防火墻。
(2) Hessian:
Hessian也是將網絡傳輸的對象轉換為二進制流通過Http進行傳遞,不過它是使用自己的序列化機制實現的編組與反編組,其支持的數據類型是有限制的,不支持復雜的對象。Hessian的優點是可以透過防火墻。
(3) Burlap:
Burlap是將網絡傳輸的對象轉換為XML文本格式通過Http進行傳遞,支持的對象與Hessian相比更少。XML一般比二進制流占 用空間大,在網絡上傳遞所需要的時間比二進制流長,XML的解析過程也會耗用更多的內存。Burlap可以穿透防火墻,而且由于傳輸的格式是XML文本, 可以與其他系統(比如.NET)集成,從某種程度來講,Burlap是一種不標準的WebService。
(4) HttpInvoker:
?????? HttpInvoker將參數和返回值通過Java的序列化機制進行編組和反編組,它具有RMI的支持所有可序列化對象的優點。 Http Invoker是使用Http協議傳輸二進制流的,而同時又具有Hessian、Burlap的優點。
六、代碼測試
客戶端:
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服務端:
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學習---面向對象的遠程方法調用[RMI]
點擊下載
轉載于:https://www.cnblogs.com/ftl1012/p/hessian.html
總結
以上是生活随笔為你收集整理的Java学习---RMI 技术分析[Hessian]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 中一些常用的内置函数
- 下一篇: android measure的时候报空