WebService另外一種輕量級實現—Hessian 學習筆記

最近研究,得知他們在使用一種叫作Hessian的WebService實現方式實現遠程方法調用,是輕量級的,不依賴JavaEE容器,同時也是二進制數據格式傳輸,效率比SOAP的XML方式要高。感受像是RESTFUL方式相似,好奇之下到網上查閱相關資料,總結以下:html

  1. 簡介java

       Hessian是由caucho提供的一個基於binary-RPC實現的遠程通信library。python

  一、是基於什麼協議實現的?c++

           基於Binary-RPC協議實現。api

  二、怎麼發起請求?服務器

           需經過Hessian自己提供的API來發起請求。網絡

  三、怎麼將請求轉化爲符合協議的格式的?app

           Hessian經過其自定義的串行化機制將請求信息進行序列化,產生二進制流。flex

  四、使用什麼傳輸協議傳輸?this

           Hessian基於Http協議進行傳輸。

  五、響應端基於什麼機制來接收請求?

           響應端根據Hessian提供的API來接收請求。

  六、怎麼將流還原爲傳輸格式的?

           Hessian根據其私有的串行化機制來將請求信息進行反序列化,傳遞給使用者時已經是相應的請求信息對象了。

  七、處理完畢後怎麼迴應?

           處理完畢後直接返回,hessian將結果對象進行序列化,傳輸至調用端。

  1. Hessian 調用實例

  2. a)         編寫服務端代碼

寫一個接口:

[java] view plain copy

  1. public interface Hello {  

  2.     public String seeHello();  

  3. }  

 

編寫一個實現:

[java] view plain copy

  1. public class HelloImpl implements Hello {  

  2.    

  3.     private String helloStr = 「Hello World」;  

  4.    

  5.     public String getHelloStr() {  

  6.        return helloStr;  

  7.     }  

  8.    

  9.     public void setHelloStr(String helloStr) {  

  10.        this.helloStr = helloStr;  

  11.     }  

  12.    

  13.     public String seeHello() {  

  14.        return helloStr;  

  15.     }  

  16.    

  17. }  

 

配置WEB-INF.xml 部署到Web容器中:

[xhtml] view plain copy

  1. <servlet>    

  2.             <servlet-name>hello</servlet-name>    

  3.             <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>    

  4.             <init-param>    

  5.                 <param-name>home-class</param-name>    

  6.                 <param-value>com.alisoft.enet.hessian.HelloImpl</param-value>    

  7.             </init-param>    

  8.             <init-param>    

  9.                 <param-name>home-api</param-name>    

  10.                 <param-value>com.alisoft.enet.hessian.Hello</param-value>    

  11.             </init-param>    

  12.         </servlet>         

  13.    

  14.         <servlet-mapping>    

  15.             <servlet-name>hello</servlet-name>    

  16.             <url-pattern>/hello.xsp</url-pattern>    

  17.         </servlet-mapping>   

 

 Ok,服務端代碼編寫完畢。

        

  1.          編寫客戶端代碼

 

[java] view plain copy

  1. public class HelloServiceTest {  

  2.    

  3.   public static void main(String[] args) throws Exception {  

  4.       

  5.      String url = 「http://localhost/hessian/hello.xsp」;  

  6.    

  7.      HessianProxyFactory factory = new HessianProxyFactory();  

  8.      Hello hello = (Hello) factory.create(Hello.class, url);  

  9.    

  10.      System.out.println(「遠程調用結果: 「 + hello.seeHello());  

  11.    

  12.   }  

  13. }  

 

 

         執行客戶端,便可返回相應的結果:

                   遠程調用結果: Hello World        

         上面的例子是基於 caucho 提供的Hessian 包的基礎上作的,實際上Spring的Hessian調用只是對這個進行簡單的封裝,便於使用。

  

3、Hessian機制

 

 

 

  那麼Hessian就是把Java對象轉變成 字節序列,而後經過Http傳輸到 目標服務器上(主機2),主機2收到這個字節序列後,按照必定的協議標準進行反序列,提交給對應的服務處理。處理完成之後以一樣的方式返回數據。

 

如今咱們回頭看看例子中的配置(WEB-INF.XML):

配置的Servlet: com.caucho.hessian.server.HessianServlet

對應的參數:接口(home-api):com.alisoft.enet.hessian.Hello

                            實現(home-class): com.alisoft.enet.hessian.HelloImpl

 

 

 

HessianServlet 中的實現代碼以下(略過部分代碼):

 

[java] view plain copy

  1. HttpServletRequest req = (HttpServletRequest) request;  

  2. HttpServletResponse res = (HttpServletResponse) response;  

  3. InputStream is = request.getInputStream();  

  4. OutputStream os = response.getOutputStream();  

  5. //輸入流  

  6. Hessian2Input in = new Hessian2Input(is);  

  7. SerializerFactory serializerFactory = getSerializerFactory();  

  8. in.setSerializerFactory(serializerFactory);  

  9. //輸出流  

  10. AbstractHessianOutput out;  

  11. int major = in.read();  

  12. int minor = in.read();  

  13. out = new Hessian2Output(os);  

  14. out.setSerializerFactory(serializerFactory);  

  15. _homeSkeleton.invoke(in, out);  

 

 

整個執行步驟以下:

l  接收輸入流,並經過SerializerFactory轉化爲 Hessian 特有的 Hessian2Input

l  設置輸出流,並經過SerializerFactory轉化爲 Hessian 特有的 Hessian2Output

l  根據配置的接口和實現參數,調用服務,並把結果寫入到輸出流 Hessian2Output中

l   Out.close()

 

Hessian遠程訪問基於序列化和反序列化的方式。當程序運行時,程序所建立的各類對象都位於內存中,當程序運行結束,這些對象就結束了生命週期。對象的序列化主要有兩種用途:

l  把對象的字節序列永久地保存到硬盤上,一般是放在一個文件中。

l  在網絡上傳輸對象的字節序列

 

四.Hessian的優勢:

1- 整個jar很小,200多K,3.1版本的,固然,我下載的for java的版本.

2- 配置很簡單,基本上不須要花什麼經歷就配置出來了

3- 功能強大,能夠將soap拋開,也能夠把EJB拋開,採用二進制來傳遞對象

4- 擁有多種語言支持,python c++  .net 甚至 flex 均可以作爲client端

 

注:Hessian for java的相關資料下載地址:http://hessian.caucho.com/#Java 。

相關文章
相關標籤/搜索