Hessian 分布式?

Hessian 是由 caucho 提供的一个基于 binary-RPC 实现的远程通讯 library 。
Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。同时又具有防火墙穿透能力。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
1 、是基于什么协议实现的?
基于 Binary-RPC 协议实现。
2 、怎么发起请求?
需通过 Hessian 本身提供的 API 来发起请求。
3 、怎么将请求转化为符合协议的格式的?
Hessian 通过其自定义的串行化机制将请求信息进行序列化,产生二进制流。
4 、使用什么传输协议传输?
Hessian 基于 Http 协议进行传输。
5 、响应端基于什么机制来接收请求?
响应端根据 Hessian 提供的 API 来接收请求。
6 、怎么将流还原为传输格式的?
Hessian 根据其私有的串行化机制来将请求信息进行反序列化,传递给使用者时已是相应的请求信息对象了。
7 、处理完毕后怎么回应? 处理完毕后直接返回, hessian 将结果对象进行序列化,传输至调用端。

客户端发起请求和服务器端接收处理请求都是通过 hessian 自己的 API 。输入输出流都要封装为 hessian 自己的 Hessian2Input 和 Hessian2Output

优点:简单易用,面向接口,通过接口暴露服务,jar包只有200、300k,不需要配置防火墙
效率高,复杂对象序列化速度仅次于RMI,简单对象序列化优于RMI,二进制传输多语言支持:wiki、Java、Flash/Flex、Python、C++、.NET C#、PHP、Ruby、Objective-C
可与spring集成,配置简单,HessianServiceExporte hessian类似于Webservice,但是它不使用soap协议,它把协议报文封装到http封包中,通过HTTP信道传输。是一种高效简洁的远程调用框架,它采用的是二进制RPC协议(Binary),具有轻量、传输量小、平台无关的特点,特别适合于目前网络带宽比较小的手机网络应用项目。Hessian是通过servlet提供远程服务,完全使用动态代理来实现的,推荐采用面向接口编程,因此,Hessian服务建议通过接口暴露。其中它不需要我们与xml“打交道”,直接操作对象,省去了很多麻烦。

缺点:如果service层中返回的对象是复杂对象,使用它就会削弱Hessian的传输量小的优点,而且也会增加Hessian客户端的代码量。既然它是把对象序列化为二进制流的形式在http信道中传输,缺乏安全机制,传输没有加密处理,那么对于安全性高的应用不应该采用hessian(比如网上支付等)异常机制不完善,总是报一些错误,错误原因也是千奇百怪,提示信息不足
事务处理欠缺

1 hession序列化 与 java 序列化
在远程调用中,需要把参数和返回值通过网络传输,这个使用就要用到序列化将对象转变成字节流,从一端到另一端之后再反序列化回来变成对象。
hessian序列化比Java序列化高效很多,而且生成的字节流也要短很多。但相对来说没有Java序列化可靠,而且也不如Java序列化支持的全面。而之所以会出现这样的区别,则要从它们的实现方式来看。

Java序列化,Java序列化会把要序列化的对象类的元数据和业务数据全部序列化从字节流,而且是把整个继承关系上的东西全部序列化了。它序列化出来的字节流是对那个对象结构到内容的完全描述,包含所有的信息,因此效率较低而且字节流比较大。但是由于确实是序列化了所有内容,所以可以说什么都可以传输,因此也更可用和可靠。
hessian序列化,它的实现机制是着重于数据,附带简单的类型信息的方法。就像Integer a = 1,hessian会序列化成I 1这样的流,I表示int or Integer,1就是数据内容。而对于复杂对象,通过Java的反射机制,hessian把对象所有的属性当成一个Map来序列化,产生类似M className propertyName1 I 1 propertyName S stringValue这样的流,包含了基本的类型描述和数据内容。而在序列化过程中,如果一个对象之前出现过,hessian会直接插入一个R index这样的块来表示一个引用位置,从而省去再次序列化和反序列化的时间。这样做的代价就是hessian需要对不同的类型进行不同的处理(因此hessian直接偷懒不支持short),而且遇到某些特殊对象还要做特殊的处理(比如StackTraceElement)。而且同时因为并没有深入到实现内部去进行序列化,所以在某些场合会发生一定的不一致,比如通过Collections.synchronizedMap得到的map。
2 hession与跨平台
hessian已经支持Java,Flash/Flex,Python,C++,.NET C#,D,Erlang,PHP,Ruby,Objective C,但是,不支持不同语言间的互相调用,你懂的。。原因是不同语言见类型转换的问题,如果要支持的话,那hessian就真的神了。。
貌似可以支持C#客户端调用我们使用JAVA编写的服务。
3 hession的适用场景
内网 分布式项目
手机项目
4 安全机制
hession安全机制比较差,可以采用数据byte[] 加密,如AES。
思路:客户端通过Hessian工厂获取到Hessian服务之后,将传入参数对象序列化成byte[],然后对byte[]进行加密,然后调用hessian服务的方法,服务端获取到客户端传过来的加密之后的byte[]参数,首先进行AES解密,然后将byte[]反序列化成参数对象,再调用相应的业务逻辑,再然后将返回结果进行序列化成byte[],然后进行AES加密,然后客户端获得返回结果之后进行AES解密,然后反序列化成结果对象,至此一轮调用完成

之前公司分布式应用 不同应用间用Hessian 通信,架构接口统一 ,返回参数为String 类型的json。这样避免了一些复杂的对象转化问题,提高了系统稳定性


猜你喜欢

转载自haidaoqi3630.iteye.com/blog/2179628