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) 編寫服務端程式碼
寫一個介面:
- public interface Hello {
- public String seeHello();
- }
編寫一個實現:
- public class HelloImpl implements Hello {
- private String helloStr = “Hello World”;
- public String getHelloStr() {
- return helloStr;
- }
- public void setHelloStr(String helloStr) {
- this.helloStr = helloStr;
- }
- public String seeHello() {
- return helloStr;
- }
- }
配置WEB-INF.xml 部署到Web容器中:
- <servlet>
- <servlet-name>hello</servlet-name>
- <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
- <init-param>
- <param-name>home-class</param-name>
- <param-value>com.alisoft.enet.hessian.HelloImpl</param-value>
- </init-param>
- <init-param>
- <param-name>home-api</param-name>
- <param-value>com.alisoft.enet.hessian.Hello</param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>hello</servlet-name>
- <url-pattern>/hello.xsp</url-pattern>
- </servlet-mapping>
Ok,服務端程式碼編寫完畢。
b) 編寫客戶端程式碼
- public class HelloServiceTest {
- public static void main(String[] args) throws Exception {
- String url = “http://localhost/hessian/hello.xsp”;
- HessianProxyFactory factory = new HessianProxyFactory();
- Hello hello = (Hello) factory.create(Hello.class, url);
- System.out.println(“遠端呼叫結果: “ + hello.seeHello());
- }
- }
執行客戶端,即可返回相應的結果:
遠端呼叫結果: 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 中的實現程式碼如下(略過部分程式碼):
- HttpServletRequest req = (HttpServletRequest) request;
- HttpServletResponse res = (HttpServletResponse) response;
- InputStream is = request.getInputStream();
- OutputStream os = response.getOutputStream();
- //輸入流
- Hessian2Input in = new Hessian2Input(is);
- SerializerFactory serializerFactory = getSerializerFactory();
- in.setSerializerFactory(serializerFactory);
- //輸出流
- AbstractHessianOutput out;
- int major = in.read();
- int minor = in.read();
- out = new Hessian2Output(os);
- out.setSerializerFactory(serializerFactory);
- _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端