WebService另一种轻量级实现—Hessian 学习笔记
2010-09-26 16:44
507 查看
最近和同事聊天,得知他们在使用一种叫做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) 编写服务端代码
写一个接口:
public interface Hello { public String seeHello(); }
编写一个实现:
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容器中:
<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,服务端代码编写完毕。
b) 编写客户端代码
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调用只是对这个进行简单的封装,便于使用。
三、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 中的实现代码如下(略过部分代码):
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 。
相关文章推荐
- WebService另一种轻量级实现—Hessian 学习笔记
- WebService另一种轻量级实现—Hessian 学习笔记
- WebService另一种轻量级实现—Hessian 学习笔记
- 轻量级远程调用框架-Hessian学习笔记-Demo实现
- 轻量级远程调用框架-Hessian学习笔记-Demo实现
- 轻量级远程调用框架-Hessian学习笔记-Demo实现
- 轻量级远程调用框架-Hessian学习笔记-Demo实现
- java学习笔记之webservice(五)--实现手机号归属地的WebService调用
- Android 学习笔记之WebService实现远程调用+内部原理分析...
- Web Service学习笔记:WebService特性和数组类型解析
- 【学习笔记】DM9000裸机驱动(三)之简单ARP协议的实现
- webservice学习笔记
- boost.asio 学习笔记05——asio的windows实现
- Andorid学习笔记:实现图片选择器功能(上)
- (转)【D3D11游戏编程】学习笔记二十二:Cube Mapping应用之二:反射的实现
- 安卓学习笔记---实现简易播放器(带有进度条,开始与结束时间,暂停与播放)
- 持续集成学习笔记-入门篇(5)持续集成自动化(二):具体实现方式一
- 《PID控制算法的C语言实现》学习笔记
- OpenLayers源码学习笔记---OpenLayers中的继承实现
- JS DOM编程艺术——用JS实现动画效果—— JS学习笔记2015-7-22(第89天)