Hessian学习总结

一.     Hessian 简介

 

Hessian 是由 caucho 提供的一种开源的远程通讯协议。 Hessian 采用二进制 RPC 协议,基于 HTTP 传输,服务器端不用开放防火墙端口。 Hessian 协议的规范是公开的,可以用于任意语言。

二.        Hessian 实现

a)        基本实现

服务器端:

定义接口: Hello, World API

public interface BasicAPI {

  public String hello();

}

接口实现: Hello, World Service

public class BasicService implements BasicAPI {

  private String _greeting = "Hello, world";

 

  public void setGreeting(String greeting)

  {

    _greeting = greeting;

  }

 

  public String hello()

  {

    return _greeting;

  }

}

配置 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.xiaonei.jebe.hessian.BasicService</param-value>  

             </init-param>  

             <init-param>  

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

                 <param-value>com.xiaonei.jebe.hessian.BasicAPI</param-value>  

              </init-param>

         </servlet>

  

         <servlet-mapping>  

             <servlet-name>hello</servlet-name>  

             <url-pattern>/hello.htm</url-pattern>  

         </servlet-mapping>

客户端:

String url = "http://hessian.caucho.com/hessian/hello.htm";

 

HessianProxyFactory factory = new HessianProxyFactory();

BasicAPI basic = (BasicAPI) factory.create(BasicAPI.class, url);

 

System.out.println("hello(): " + basic.hello());

b)       spring 的整合

Hessian 通过 Servlet 提供远程服务。需要将匹配某个模式的请求映射到 Hessian 服务。 Spring DispatcherServlet 可以完成该功能, DispatcherServlet 可将匹配模式的请求转发到 Hessian 服务, web.xml 只是定义了“请求转发器”,该转发器将匹配 /remoting/* 的请求截获,转发给 context bean 处理。而 HessianServiceExporter 提供 bean 服务。

可以总结为两步:

1.      拦截 url 请求

2.      HessianServiceExporter 提供 bean 服务, Spring 使用 HessianServiceExporter ,将一个常规 bean 导出成 Hessian 服务。

 

服务器端设置:

web.xml 的详细配置

<servlet>

           <servlet-name>remoting</servlet-name>

  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

           <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

           <servlet-name>remoting</servlet-name>

           <url-pattern>/remoting/*</url-pattern>

</servlet-mapping>

配置 remoting-servlet.xml 文件

<!--  定义普通 bean 实例 -->

    <bean id="hello" class=" com.xiaonei.jebe.hessian.BasicService "/>

    <!--  使用 HessianServiceExporter 将普通 bean 导出成 Hessian 服务 -->

    <bean name="/hello" class="org.springframework.remoting.caucho.HessianServiceExporter">

           <!--  需要导出的目标 bean-->

           <property name="service" ref="hello"/>

           <!--  Hessian 服务的接口 -->

            <property name="serviceInterface" value=" com.xiaonei.jebe.hessian.BasicAPI "/>

</bean>

 

客户端设置:

客户端定义一个 remoting-client.xml 文件

<bean id="myServiceClient" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">

<property name="serviceUrl">

<value> http://hessian.caucho.com/hessian/hello.htm</value>

</property>

<property name="serviceInterface">

<value> com.xiaonei.jebe.hessian.BasicAPI </value>

</property>

</bean>

c)        OSGi spring dm server )的整合

请参见文档 Hessian OSGi spring dm server)的整合

三.        Hessian 原理

请参见文档 Hessian原理分析》

四.        Hessian 和其他远程调用实现的比较

1.       常见远程通讯协议:

RMI Httpinvoker Hessian Burlap Web service

通讯效率测试结果:

RMI > Httpinvoker >= Hessian >> Burlap >> Web service

2.       各个通讯协议的分析:

RMI Java 首选远程调用协议,非常高效稳定,特别是在数据结构复杂,数据量大的情况下,与其他通讯协议的差距尤为明显。

HttpInvoker 使用 java 的序列化技术传输对象,与 RMI 在本质上是一致的。从效率上看,两者也相差无几, HttpInvoker RMI 的传输时间基本持平。

Hessian 在传输少量对象时,比 RMI 还要快速高效,但传输数据结构复杂的对象或大量数据对象时,较 RMI 要慢 20% 左右。但这只是在数据量特别大,数据结构很复杂的情况下才能体现出来,中等或少量数据时, Hessian 并不比 RMI 慢。 Hessian 的好处是精简高效,可以跨语言使用,而且协议规范公开,我们可以针对任意语言开发对其协议的实现。

另外, Hessian WEB 服务器结合非常好,借助 WEB 服务器的成熟功能,在处理 大量用户并发访问时会有很大优势,在资源分配,线程排队,异常处理等方面都可以由成熟的 WEB 服务器保证。而 RMI 本身并不提供多线程的服务器。而 且, RMI 需要开防火墙端口, Hessian 不用。

Burlap 采用 xml 格式传输。仅在传输 1 条数据时速度尚可,通常情况下,它的毫时是 RMI 3 倍。

Web Service 的效率低下是众所周知的,平均来看, Web Service 的通讯毫时是 RMI 10 倍。

 

五.        Hessian 使用感受

在本次的系统中大量使用 hessian 进行远程通讯。系统环境是 OSGi 实现 spring dm server

在使用中,我们发现 hessian 的确精简很容易使用,而且效率很高,基本可以满足系统需求。但是我们也发现了很多不足,有 hessian 特有的也有 hessian OSGi spring dm server )整合后造成的。

 

优点:

1.         简单易用

2.         效率高

缺点:

1.         报错机制不够完善。在开发过程中发现 hessian 总是报一些错误,错误原因也是千奇百怪。当然,有可能是前期大家对 hessian 理解不够深刻,但是也确实暴露出来 hessian 的一些问题。

解决方案有:加深对 hessian 实现机制的理解;总结 hessian 出错的原因,每种错误可以列举出几种原因,便于以后查找。

2.         事务处理。至今还没有针对 hessian 服务的有效的事务处理机制,大家提出了几种实现方案,但都不是很合适,需要继续研究。

3.         版本问题:在开发过程中,发现 springsource bundle 库中最新的版本是 3.2.1 ,但是 3.2.1 spring2.5 存在兼容问题,现在可用的版本有 3.1.5 3.1.6 3.2.0 。而在 hessian 官网发现最新版本为 4.0.1 ,但 4.0.1 没有 bundle 形式 jar 包。

 

 

参考文献:

1.         hessian binary web service protocol http://hessian.caucho.com/

2.         《几种通讯协议的比较》 http://javag.javaeye.com/blog/319285

3.         Spring 2.0 宝典》 14.5.1 Hessian 介绍

http://book.csdn.net/bookfiles/126/1001264302.shtml

4.         Hessian 学习笔记》 http://www.alisdn.com/wordpress/?p=478

5.         Hessian 学习记录》 http://www.javaeye.com/topic/212028

 

                                                                                                        2009-10-19

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值