天天看點

Java學習---RMI 技術分析[Hessian]

Java學習---RMI 技術分析[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 )

優點:

簡單易用,面向接口,通過接口暴露服務,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服務

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

Java學習---RMI 技術分析[Hessian]
Java學習---RMI 技術分析[Hessian]

View Code

HessianClient.java

Java學習---RMI 技術分析[Hessian]
Java學習---RMI 技術分析[Hessian]

服務端:

Java學習---RMI 技術分析[Hessian]
Java學習---RMI 技術分析[Hessian]

BasicService.java

Java學習---RMI 技術分析[Hessian]
Java學習---RMI 技術分析[Hessian]

 【更多參考】

Java學習---面向對象的遠端方法調用[RMI]

點選下載下傳

作者:小a玖拾柒