1. 程式人生 > >Hession與webservice呼叫之間的區別與聯絡

Hession與webservice呼叫之間的區別與聯絡

最近和同事聊天,得知他們在使用一種叫做Hessian的WebService實現方式實現遠端方法呼叫,是輕量級的,不依賴JavaEE容器,同時也是二進位制資料格式傳輸,效率比SOAP的XML方式要高。感覺像是RESTFUL方式類似,好奇之下到網上查閱相關資料,總結如下:

一、簡介

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

  1、是基於什麼協議實現的?

           基於Binary-RPC協議實現。

  2、怎麼發起請求?

           需通過Hessian本身提供的API來發起請求。

  3、怎麼將請求轉化為符合協議的格式的?

           Hessian通過其自定義的序列化機制將請求資訊進行序列化,產生二進位制流。

  4、使用什麼傳輸協議傳輸?

           Hessian基於Http協議進行傳輸。

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

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

  6、怎麼將流還原為傳輸格式的?

           Hessian根據其私有的序列化機制來將請求資訊進行反序列化,傳遞給使用者時已是相應的請求資訊物件了。

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

           處理完畢後直接返回,hessian將結果物件進行序列化,傳輸至呼叫端。

二、Hessian 呼叫例項

a)         編寫服務端程式碼

寫一個介面:

  1. public interface Hello {  
  2.     public String seeHello();  
  3. }  

編寫一個實現:

  1. public class HelloImpl implements Hello {  
  2.     private String helloStr = “Hello World”;  
  3.     public String getHelloStr() {  
  4.        return helloStr;  
  5.     }  
  6.     public void setHelloStr(String helloStr) {  
  7.        this.helloStr = helloStr;  
  8.     }  
  9.     public String seeHello() {  
  10.        return helloStr;  
  11.     }  
  12. }  

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

  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.         <servlet-mapping>    
  14.             <servlet-name>hello</servlet-name>    
  15.             <url-pattern>/hello.xsp</url-pattern>    
  16.         </servlet-mapping>   
 

 Ok,服務端程式碼編寫完畢。

b)         編寫客戶端程式碼

  1. public class HelloServiceTest {  
  2.   public static void main(String[] args) throws Exception {  
  3.      String url = “http://localhost/hessian/hello.xsp”;  
  4.      HessianProxyFactory factory = new HessianProxyFactory();  
  5.      Hello hello = (Hello) factory.create(Hello.class, url);  
  6.      System.out.println(“遠端呼叫結果: “ + hello.seeHello());  
  7.   }  
  8. }  

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

                   遠端呼叫結果: Hello World        

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

三、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 中的實現程式碼如下(略過部分程式碼):

  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端