`
czltx224
  • 浏览: 17798 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

hessian杂篇

阅读更多
一、简介
Hessian是caucho公司提供的开源协议,基于HTTP传输,服务端不用开防火墙端口。协议的规范公开,可以用于任意语言。Hessian也是一个轻量级的,自定义描述的二进制RPC协议。Hessian的好处是精简高效,可以跨语言使用,我们可以针对任意语言开发对其协议的实现。目前已有实现的语言有:Java、Flash、Python、C++、.NET C#、D、Erlang、PHP、Ruby。还没有Delphi的实现。
http://blog.csdn.net/turkeyzhou/article/details/5867543

二、 为什么选择Hessian
   1.  Hessian是一个轻量级的RPC协议,数据以二进制方式存储传输。所以简洁、高效。相比web service的SOAP协议的复杂、数据冗余。Hessian的性能要高出很多。
   2.  协议规范公开,很多语言都已实现。

Hessian
Hessian 是由caucho提供的一个基于binary-RPC实现的远程通讯library。
1、是基于什么协议实现的?
基于Binary-RPC协议实现。
2、怎么发起请求?
需通过Hessian本身提供的API来发起请求。
3、怎么 将请求转化为符合协议的格式的?
Hessian通过其自定义的串行化机制将请求信息进行序列化,产生二进制流。
4、使用什么 传输协议传输?
Hessian基于Http协议进行传输。
5、响应端基于什么机制来接收请求?
响应端根据Hessian提供的API来接收请求。
6、怎么将流还原为传输格式的?
Hessian根据其私有的串行化机制来将请求信息进行反序列化,传递给使用者时已是相应的请求信息对象了。
7、处理完毕后怎么回应?
处理完毕后直接返回,hessian将结果对象进行序列化,传输至调用端。

使用Hessian的利弊:
• 优势:使用简单,速度快;跨语言,跨平台;可以用来兼容legacy系统的功能。
• 劣势:安全性的支持不够强,不支持两阶段事务。



Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据

RMI(Remote Method Invocation,远程方法调用)

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。



相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议(Binary),因为采用的是二进制协议,所以它很适合于发送二进制数据。Hessian通常通过Web应用来提供服务,因此非常类似于WebService。只是它不使用SOAP协议。
Hessian通过Servlet提供远程服务。需要将匹配某个模式的请求映射到Hessian服务。Spring的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务。Hessian的server端提供一个servlet基类, 用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的,,推荐采用面向接口编程,因此,Hessian服务建议通过接口暴露。
Hessian处理过程示意图:
客户端——>序列化写到输出流——>远程方法(服务器端)——>序列化写到输出流 ——>客户端读取输入流——>输出结果
环境搭建
Hessian的下载和安装请按如下步骤进行:
(1)登http://www.caucho.com/hessian/下载Hessian。
(2)把Hessian相应的Jar包放到Web应用下,所有的jar文件都应该放在WEB-INF/lib下,该文件也不例外。
两种方式
纯Hessian
这种方式主要是适用于工程中没有适用像spring框架的情况下,好处是配置方便,但是当内容多的情况下,配置的内容很多。
下面我就把我在做实例的一些相关步骤描述如下:
1:把Hessian相应jar包放入至工程中。
2:由于Hessian是采用面向接口编程的,所以编写一个接口,因为客户端仅仅需要接口,而无须真实的实现类。
package jzh.demo;
public interface IHello {
String sayHello();
}
3:编写一个类实现这个接口。
package jzh.demo.impl;
import jzh.demo.IHello;
import com.caucho.hessian.server.HessianServlet;
public class Hello extends HessianServlet implements IHello {
public String sayHello() {
return "Hello world";
}
}
4:web.xml的详细配置
<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>jzh.demo.imple.Hello</param-value>
</init-param>
<init-param>
<param-name>home-api</param-name>
<param-value>jzh.demo.IHello</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>

5:客户端远程调用服务器端提供的接口,利用的就是Hessian的HessianProxyFactory,来实现远程代理。
1) 把服务器端的生成的jar包,放入工程中。
2) 相应的片段程序如下:
String url = "http://220.114.108.185:8080/Hessian/Hello";
HessianProxyFactory factory = new HessianProxyFactory();
try {
IHello hello =(IHello)factory.create(IHello.class,url);
System.out.println(hello.sayHello());
} catch (MalformedURLException e) {
e.printStackTrace();
}
6:功能完成。

Hessian与Spring整合
相比上一种方式,这个方式就有点麻烦了。Hessian通过Servlet提供远程服务。需要将匹配某个模式的请求映射到Hessian服务。Spring的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务,web.xml只是定义了“请求转发器”,该转发器将匹配/remoting/*的请求截获,转发给context的bean处理。而HessianServiceExporter提供bean服务。
所以Hessian与Spring整合主要就是一下两个工作:
1:通过DispatcherServlet来拦截URL请求。
2:HessianServiceExporter提供bean服务,Spring使用HessianServiceExporter,将一个常规bean导出成Hessian服务。
下面我就把我在做实例的一些相关步骤描述如下:
1:和上面的一样。
2:和上面的一样。
3:和上面的一样。
4:web.xml的详细配置
<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>namespace</param-name> 
<param-value>hessian/hessian-server</param-value> 
</init-param>    
namespace  这个是尼玛坑爹的,看源代码了解namespace默认为 ${servlet-name}-servlet
它要求在WEB-INF下建立一个  ${namespace}.xml的spring配置
(实际上这里配置contextConfigLocation参数,value配置路径也可以)
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>remoting</servlet-name>
<url-pattern>/remoting/*</url-pattern>
</servlet-mapping>
5:配置remoting-servlet.xml文件
<!-- 定义普通bean实例-->
<bean id="hello" class="jzh.demospring.impl.Hello"/>
<!-- 使用HessianServiceExporter 将普通bean导出成Hessian服务-->
<bean name="/HessianRemoting" class="org.springframework.remoting.caucho.HessianServiceExporter">
<!-- 需要导出的目标bean-->
<property name="service" ref="hello"/>
<!-- Hessian服务的接口-->
<property name="serviceInterface" value="jzh.demospring.IHello"/>
</bean>
6:客户端定义一个remote-client.xml文件
<bean id="myServiceClient" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<property name="serviceUrl">
<value>http://220.114.99.62:8080/HessianSpring/remoteing/HessianRemoting</value>
</property>
<property name="serviceInterface">
<value>jzh.demospring.IHello</value>
</property>
</bean>
7:客户端调用。
try
{
ApplicationContext context = new ClassPathXmlApplicationContext("remote-client.xml");

IHello hello =(IHello)context.getBean("myServiceClient");

System.out.println(hello.sayHello());
}
catch (Exception e)
{
e.printStackTrace();
}



注意:
1. spring2.5.6不支持hessian4.0
2. 在客戶端的bean中配置overloadEnabled屬性為true可以解決重載問題
<!-- 解決重載問題 -->
<property name="overloadEnabled" value="true"></property>
3. 注意hessian3.2接收集合与自定义pojo时可能会出错数据格式错误
解决方法在accountService中添加属性
<propertyname="hessian2Reply" value="false" />
4. 今天做了个测试,hessian-3.1.5、hessian-3.1.6、hessian-3.2.0和spring2.5.6使用没有问题,hessian-3.2.1、hessian-4.0.1、hessian-4.0.3、hessian-4.0.6、hessian-4.0.7使用是有问题的。

一、首先先说Hessian是什么?
    Hessian:hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能,相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用了二进制协议,所以它很适合于发送二进制数据,Hessian主要作面向对象的消息通信。Hessian的初衷就是支持动态类型,格式紧凑,跨语言Hessian是使用自己的序列化机制实现的编组和反编组,其支持的数据类型是有限制的,不支持复杂的对象,可以穿透防火墙,在这里不得不说一下RMI:RMI是一组用户开发分布式应用程序的API。他使用的是java序列化机制实现调用及返回值的编组于反编组。它使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。他可以被看做是RPC的Java版本,因为传统的RPC并不能很好的应用于分布式对象系统。而Java RMI则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。他也有它的缺点,他只能通过RMI协议来进行访问无法通过HTTP协议访问,无法穿透防火墙。
    还有一种远程调用方法就是HttpInvoker:他也是将参数和返回值通过Java的序列化机制进行编组和反编组,它具有RMI的支持所有可序列化对象的优点。试使用Http协议传输二进制流的,同时又具有Hessian、Burlap(传输xml文本)的优点。
二、写一个简单的hessian通信所需要知道写哪些内容?
Hessian:写一个Hessian需要注意的问题:
     1、JAVA服务器端必须具备以下几点:
        包含Hessian的jar包
        设计一个接口,用来给客户端调用
        实现该接口的动能
        配置web.xml,配置相应的servlet
        对象必须实现Serializable接口
        对于复杂对象可以使用Map的方法传递
     2、客户端必须具备以下几点:
        java客户端包含Hessian.jar包
        具有和服务器端结构一样的接口和实体类。包括命名空间都最好一样。利用HessianProxyFactory调用远程接口



一、什么是Hessian
      Hessian 是一个基于 binary-RPC 实现的远程通讯 library。使用二进制传输数据。Hessian通常通过Web应用来提供服务,通过接口暴露。Servlet和Spring的DispatcherServlet都可以把请求转发给Hessian服务。由以下两种方式提供,分别为:com.caucho.hessian.server.HessianServlet、org.springframework.web.servlet.DispatcherServlet。

关于hessian的7个问题:

1、是基于什么协议实现的?
基于Binary-RPC协议实现。

2、怎么发起请求?
需通过Hessian本身提供的API来发起请求。

3、怎么 将请求转化为符合协议的格式的?
Hessian通过其自定义的串行化机制将请求信息进行序列化,产生二进制流。

4、使用什么 传输协议传输?
Hessian基于Http协议进行传输。

5、响应端基于什么机制来接收请求?
响应端根据Hessian提供的API来接收请求。

6、怎么将流还原为传输格式的?
Hessian根据其私有的串行化机制来将请求信息进行反序列化,传递给使用者时已是相应的请求信息对象了。

7、处理完毕后怎么回应?
处理完毕后直接返回,hessian将结果对象进行序列化,传输至调用端。

二、hessian的优缺点

       优点:

简单易用,面向接口,通过接口暴露服务,jar包只有200、300k,不需要配置防火墙
效率高,复杂对象序列化速度仅次于RMI,简单对象序列化优于RMI,二进制传输
    多语言支持:wiki、Java、Flash/Flex、Python、C++、.NET C#、PHP、Ruby、Objective-C
可与spring集成,配置简单,HessianServiceExporte

缺点:

缺乏安全机制,传输没有加密处理
异常机制不完善,总是报一些错误,错误原因也是千奇百怪,提示信息不足
事务处理欠缺
版本问题,spring 2.5.6对照3.1.3版,spring 3对照4.0及以上版本,需要使用spring MVC部分内容
三、各个通讯协议对比:
通讯效率测试结果:
RMI > Httpinvoker >= Hessian >> Burlap >> Web service

1.RMI 是 Java 首选远程调用协议,非常高效稳定,特别是在数据结构复杂,数据量大的情况下,与其他通讯协议的差距尤为明显。但不能跨语言。
2.HttpInvoker 使用 java 的序列化技术传输对象,与 RMI 在本质上是一致的。从效率上看,两者也相差无几, HttpInvoker 与 RMI 的传输时间基本持平。
3.Hessian 在传输少量对象时,比 RMI 还要快速高效,但传输数据结构复杂的对象或大量数据对象时,较 RMI 要慢 20% 左右。但这只是在数据量特别大,
数据结构很复杂的情况下才能体现出来,中等或少量数据时, Hessian并不比RMI慢。 Hessian 的好处是精简高效,可以跨语言使用,而且协议规范公开,
我们可以针对任意语言开发对其协议的实现。另外, Hessian与WEB服务器结合非常好,借助WEB服务器的成熟功能,在处理大量用户并发访问时会有很大优势,在资源分配,
线程排队,异常处理等方面都可以由成熟的WEB服务器保证。而 RMI 本身并不提供多线程的服务器。而且,RMI 需要开防火墙端口, Hessian 不用。
4.Burlap 采用 xml 格式传输。仅在传输 1 条数据时速度尚可,通常情况下,它的毫时是 RMI 的 3 倍。
5.Web Service 的效率低下是众所周知的,平均来看, Web Service 的通讯毫时是 RMI 的 10 倍。

四、基本流程

客户端必须具备以下几点:
   •java客户端包含Hessian.jar的包。
   •具有和服务器端结构一样的接口。
•利用HessianProxyFactory调用远程接口。
•使用spring方式需要配置HessianProxyFactoryBean

JAVA服务器端必须具备以下几点:
  •包含Hessian的jar包。
  •设计一个接口,用来给客户端调用。
  •实现该接口的功能。
  •配置web.xml,配好相应的servlet。
  •对象必须实现Serializable 接口。
  •对于spring方式DispatcherServlet拦截url,HessianServiceExporter提供Bean服务

先简单看下hessian的整体流程,下一篇中详细分析一个小DEMO来看hessian的具体应用。不过应用hessian时有几个问题需要注意:
    1.实体类必须实现序列化接口

                    2.远程对象有重载方法时,setOverloadEnabled(true),否则回报异常

                    3.和spring集成时注意版本冲突问题

                    4.配置文件名称与路径问题,默认${servlet-name}-servlet,想要更改时需配置namespace

                    5.没有超时处理

Web services優勢:
1. 标准统一
2. 2、架构成熟
3. 3、性能较高
4. 4、有很多大型应用的成熟经验,网上资料比较多,各种解决方案都有



用Web服务器来实现Remoting,确实很神奇!
如果需要改用Burlap,则将上面的HessianServiceExporter改成BurlapServiceExporter,HessianProxyFactory改成BurlapProxyFactory就可以,接口和实现类的代码均不需要修改;同样如果要改用HttpInoker,只要将上面的HessianServiceExporter改成HttpInvokerService- Exporter,将HessianProxyFactory改成HttpInvokerProxyFactoryBean就可以了。

1.概述
Hessian是一个轻量级的,自定义描述的二进制RPC协议。Hessian主要用作面向对象的消息通信。

2.设计目标
Hessian的初衷是支持动态类型,格式紧凑,跨语言.
Hessian协议的设计目标如下:
  可序列化类型必须是可以自描述的, i.e. 不需要额外的模式(schema)或接口定义.
  必须是语言独立的, 包括对脚本语言的支持.
  It must be readable or writable in a single pass.
  必须设计紧凑.
  必须足够简单,以便测试和实现.
  高效率.
  必须支持Unicode字符集.
  支持8-bit二进制数据,without escaping or using attachments.
  必须支持加密, 压缩, 签名 and transaction context envelopes.


hessian优点
1、目前的WEB容器都支持hessian,hessian本身就是使用http的传输协议,可以通过容器来保证安全性和稳定性
2、通信速度不错
3、spring提供了hessian插件,便于开发
4、支持大量并发请求
5、可以以对象方式接受数据,而NIO以字节方式传输
參考資料:
http://hessian.caucho.com/
http://www.iteye.com/topic/129194
http://kfliyangfan.iteye.com/blog/1197553
http://blog.sina.com.cn/s/blog_7f73e06d0100xn9j.html
http://lnj2050.blog.163.com/blog/static/27982768200791791312653/
http://blog.csdn.net/xpspace/article/details/1811603
http://www.iteye.com/topic/245238
http://blog.csdn.net/zhtang0526/article/details/4788879
http://java.chinaitlab.com/base/740383.html
http://blog.sina.com.cn/s/blog_56fd58ab0100mrl6.html
http://newslxw.iteye.com/blog/1009178
http://a123159521.iteye.com/blog/742718
http://marsvaadin.iteye.com/blog/1140097
http://san-yun.iteye.com/blog/1628350
http://a123159521.iteye.com/blog/741820
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics