最近和同事聊天,得知他们在使用一种叫做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.    
  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容器中:

  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.    
  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调用只是对这个进行简单的封装,便于使用。

三、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端

注:Hessian for java的相关资料下载地址:http://hessian.caucho.com/#Java 。

WebService另一种轻量级实现—Hessian 学习笔记的更多相关文章

  1. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

  2. 轻量级远程调用框架-Hessian学习笔记-Demo实现

    Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单.快捷.采用的是二进制RPC协议,因为采用的是二进制协 ...

  3. hessian学习笔记

    一.hessian是什么 Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单.快捷.采用的是二进制RPC ...

  4. 23种设计模式+J2EE设计模式学习笔记-初识设计模式

    设计模式简介: 设计模式是一套被反复使用的.多数人知晓的.经过分类编目的.代码设计经验的总结.(个人理解:设计模式是不关乎业务,逻辑实现,针对普遍问题的一种解决方案). 设计模式的类型: 传统23种设 ...

  5. Metasploit和python两种安全工具的学习笔记

    Metasploit是个好东西 主要参考了<Metasploit渗透测试魔鬼训练营>这本书. 一.先用自己的靶机感受一下该工具的强大 linux靶机的ip如图 按照书上写的配置,如图 然后 ...

  6. GOF 的23种JAVA常用设计模式 学习笔记 持续更新中。。。。

    前言: 设计模式,前人总结下留给后人更好的设计程序,为我们的程序代码提供一种思想与认知,如何去更好的写出优雅的代码,23种设计模式,是时候需要掌握它了. 1.工厂模式 大白话:比如你需要一辆汽车,你无 ...

  7. Android按钮单击事件处理的几种方法(Android学习笔记)

    方法一:匿名内部类实现按钮事件处理 this.btnButton=(Button)super.findViewById(R.id.mybtn); this.btnButton.setOnClickLi ...

  8. Linux五种IO模型 ——Java学习笔记

    本文摘自网络:     1.阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样: 图1 阻塞IO 当用户进程调用了re ...

  9. 【MyBatis学习笔记】

    [MyBatis学习笔记]系列之预备篇一:ant的下载与安装 [MyBatis学习笔记]系列之预备篇二:ant入门示例 [MyBatis学习笔记]系列之一:MyBatis入门示例 [MyBatis学习 ...

随机推荐

  1. Android -- Webview自适应屏幕

    第一种                                                                                          WebSett ...

  2. 任务:写一个tomcat自启动脚本

    写一篇<gitlab无法启动了应该怎么办>

  3. 命令学习:iftop

    iftop显示带宽使用情况 http://riobard.com/2010/04/30/l2tp-over-ipsec-ubuntu/ http://jaseywang.me/2011/12/19/i ...

  4. appium for windows 环境搭建

    服务环境: 1 安装Nodejs 下载nodejs安装包(http://nodejs.org/download/)安装 测试安装是否成功:运行cmd,输入node -v 2 安装android的SKD ...

  5. CocoaPods最佳实践探讨

    近期在项目中首次使用了CocoaPods.从软件工程的角度来看,我对目前常见的CocoaPods使用方法有些意见,建议做一些改进.先说一下我建议的最佳实践,后面再分析为什么要这样做.并且希望大家根据自 ...

  6. SPOJ - DQUERY 主席树

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32356 Given a sequence of n numbers ...

  7. 日志:slf4j+log4j+maven配置

    代码的日志输出,前前后后折腾了我好几次. 本着会用,快速配置的原则,还是将配置过程记录下来,以便复用. 参考:http://blog.csdn.net/anialy/article/details/8 ...

  8. js添加事件、移除事件、阻止冒泡、阻止浏览器默认行为等写法(兼容IE/FF/CHROME)

    转自:http://blog.csdn.net/itchiang/article/details/7769341 添加事件   var addEvent = function( obj, type, ...

  9. openOffice将doc在线预览

    最近,有个项目要用到类似DOCIN的文档转换和阅读的功能,于是就开始找相关的资料,最后总结出2种解决办法,以下就来探讨下两种方法的各自实现. 第一种:通过FLASH PAPER来转换DOC文档直接生成 ...

  10. Web Component 文章

    周末无意中了解了Web Component的概念. http://blog.amowu.com/2013/06/web-components.html http://www.v2ex.com/t/69 ...