最近研究,得知他們在使用一種叫作Hessian的WebService實現方式實現遠程方法調用,是輕量級的,不依賴JavaEE容器,同時也是二進制數據格式傳輸,效率比SOAP的XML方式要高。感受像是RESTFUL方式相似,好奇之下到網上查閱相關資料,總結以下:html
簡介java
Hessian是由caucho提供的一個基於binary-RPC實現的遠程通信library。python
一、是基於什麼協議實現的?c++
基於Binary-RPC協議實現。api
二、怎麼發起請求?服務器
需經過Hessian自己提供的API來發起請求。網絡
三、怎麼將請求轉化爲符合協議的格式的?app
Hessian經過其自定義的串行化機制將請求信息進行序列化,產生二進制流。flex
四、使用什麼傳輸協議傳輸?this
Hessian基於Http協議進行傳輸。
五、響應端基於什麼機制來接收請求?
響應端根據Hessian提供的API來接收請求。
六、怎麼將流還原爲傳輸格式的?
Hessian根據其私有的串行化機制來將請求信息進行反序列化,傳遞給使用者時已經是相應的請求信息對象了。
七、處理完畢後怎麼迴應?
處理完畢後直接返回,hessian將結果對象進行序列化,傳輸至調用端。
Hessian 調用實例
a) 編寫服務端代碼
寫一個接口:
[java] view plain copy
public interface Hello {
public String seeHello();
}
編寫一個實現:
[java] view plain copy
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容器中:
[xhtml] view plain copy
<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,服務端代碼編寫完畢。
編寫客戶端代碼
[java] view plain copy
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調用只是對這個進行簡單的封裝,便於使用。
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
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端
注:Hessian for java的相關資料下載地址:http://hessian.caucho.com/#Java 。