WebService另一种轻量级实现—Hessian 学习笔记

最近和同事聊天,得知他们在使用一种叫做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)         编写服务端代码

写一个接口:

[java] view plaincopy

  1. public interface Hello {  
  2.     public String seeHello();  
  3. }  

 

编写一个实现:

[java] view plaincopy

  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容器中:

[xhtml] view plaincopy

  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)         编写客户端代码

[java] view plaincopy

  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 中的实现代码如下(略过部分代码):

[java] view plaincopy

  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 。

时间: 2024-11-10 01:13:03

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

关于Redis五种类型对象的学习笔记

我们在使用Redis的时候,直接接触到的是字符串对象(String),列表对象(List),哈希对象(Hash),集合对象(Set),有序集合对象(SortedSet)这五种类型的对象,基本的命令如:String(get set) List(lpush rpush lpop rpop lrange) Hash(hget hset hlen hgetall) Set(sadd smembers smov) SortedSet(Zadd Zrange)等. 我们首先看一下redis对象的数据结构:

MyBatis MapperScannerConfigurer配置――MyBatis学习笔记之八

MyBatis MapperScannerConfigurer配置——MyBatis学习笔记之八 2012-09-02 20:01:42 标签:Spring MyBatis MapperScannerConfigurer bean默认命名 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://legend2011.blog.51cto.com/3018495/980150 在上一篇博文的示例中,我们在beans.xml中配置了stu

Hessian学习总结(一)——Hessian入门 (来源于网络分享)

Hessian学习总结(一)——Hessian入门 一.远程通讯协议的基本原理 网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http . tcp . udp 等等, http . tcp . udp 都是在基于 Socket 概念上为某类应用场景而扩展出的传输协议,网络 IO ,主要有 bio . nio . aio 三种方式,所有的分布式应用通讯都基于这个原理而实现,只是为了应用的易用,各种语言通常都会提供一些更为贴近应

JavaScript 一种轻量级的编程语言

 JavaScript 一种轻量级的编程语言 作为一名计算机应用专业的学生,大一上学期开始接触了网页设计和制作,刚开始时感觉做网页很不错,简单地写几行代码就能做出效果来,当时感觉很兴奋,渐渐的喜欢上它了.那时还不知道其他的编程语言(例如后台编程语言).那是就觉得学好HTML,就能把网页做好.大一下学期开了css,并且还开设了一门C#,,本人通过学习感觉比较难,原因是也没有好好的学习,所以我也决定向Web前端开发方向发展.直到大二上学期,我们开始学习了javascript 这门轻量级的编程语言.刚

LoadRunner测试WebService的3种方式

LR在WebService虚拟用户协议中支持两种方式测试WebService,一种是通过“Add Service Call”的方式,一种是Import SOAP的方式. Import SOAP的方式需要导入定义好的XML请求文件. 取到WebService返回的XML数据后,可以使用XPath的方式验证数据,LR提供了几个处理XML的函数: lr_xml_get_values()  //Retrieves values of XML elements found by a query lr_xm

WebService的几种验证方式

转 http://www.cnblogs.com/yoshiki1895/archive/2009/06/03/1495440.html WebService的几种验证方式 1.1      WebService设计 1.1.1   传输基本参数 1.1.2   传输数据集合 (1)     数组 (2)     DataSet 1.2      WebService异常处理 1.3      WebService性能 1.4      WebService认证 请参考WebService认证学

Web Service学习笔记:动态调用WebService

原文:Web Service学习笔记:动态调用WebService 多数时候我们通过 "添加 Web 引用..." 创建客户端代理类的方式调用WebService,但在某些情况下我们可能需要在程序运行期间动态调用一个未知的服务.在 .NET Framework 的 System.Web.Services.Description 命名空间中有我们需要的东西. 具体步骤: 1. 从目标 URL 下载 WSDL 数据. 2. 使用 ServiceDescription 创建和格式化 WSDL

WebServices学习笔记(四)使用services.xml文件发布WebService

四.使用services.xml文件发布WebService 前面发布webservices所建立的java类都不能有包名,这里用配置文件services.xml搭建能有包名的webservice 首先创建MyService类,在service包下 package service; import javax.jws.WebParam; public class MyService { public String getGreeting(@WebParam(name="name")Str

Web Service学习笔记(webservice、soap、wsdl、jws详细分析) (转)

Web Service概述 Web Service的定义 W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执行远程系统的请求服务. 这里我们从一个程序员的视角来观察web service.在传统的程序编码中,存在这各种的函数方法调用.通常,我们知道一个程序模块M中的方法A,向其发出调用请求,并传入A方法需要的参数P,方法A执行完毕后,返回处理结果R.这种函数或方法调用通常发