zoukankan      html  css  js  c++  java
  • 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)         编写服务端代码

    写一个接口:

     

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

     

    编写一个实现:

     

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

    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.    
    14.         <servlet-mapping>    
    15.             <servlet-name>hello</servlet-name>    
    16.             <url-pattern>/hello.xsp</url-pattern>    
    17.         </servlet-mapping>   

     Ok,服务端代码编写完毕。

            

    b)         编写客户端代码

     

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

    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 。

  • 相关阅读:
    Intellij IDEA 打开文件tab数量限制的调整
    Mysql处理中文乱码的问题
    MIT算法导论笔记
    算法导论-排序(一)-插入排序、归并排序
    leetcode题解:Search for a Range (已排序数组范围查找)
    leetcode 题解:Merge Sorted Array(两个已排序数组归并)
    leetcode题解:Construct Binary Tree from Inorder and Postorder Traversal(根据中序和后序遍历构造二叉树)
    leetcode题解:Construct Binary Tree from Preorder and Inorder Traversal (根据前序和中序遍历构造二叉树)
    c++11 std::prev、std::next、std::advance与auto 使用
    (转)指针的引用(*&)与指针的指针(**)
  • 原文地址:https://www.cnblogs.com/firstdream/p/4820580.html
Copyright © 2011-2022 走看看