`

Hessian轻量级二进制远程调用框架

 
阅读更多

Hessian是一个轻量级的二进制远程调用框架,官方文档地址,它主要包括Hessian远程调用协议、Hessian序列化协议以及客户端服务端代理等几部分,关于Hessian协议可以看下另外一篇文章Hessian远程调用及序列化协议。Hessian远程调用框架构建在Http协议之上,下面是示意图。

 

 

 

 

 

下面这个图是一次远程调用的过程

 

 

其中步骤3、4、5、6是核心过程,还要细化下,

 

步骤3:将远程方法调用转换为hessian调用,具体为,客户端首先要先和服务器端建立Socket连接,然后发送Http请求,hessian远程调用及经过Hessian序列化的参数等二进制数据作为http请求的数据部分被提交到服务端,并且目前只支持Post提交方法。

 

步骤4:将hessian调用转换为本地方法调用,步骤3里请求的url是暴露服务时映射好的,也即指定的服务端代理对象会解析客户端服务代理对象进行的hessian远程调用,然后反序列化参数,找到被代理的服务类(暴露服务时指定的服务类),通过反射调用服务类中的相应服务方法。

 

步骤5:返回远程调用返回值给服务调用者,步骤4里调用服务类的方法会返回具体值,经过Hessian序列化后作为hessian调用的返回值,被放在http响应的body部分被返回给客户端。

 

步骤6:客户端代理对象解析body部分hessian调用返回reply,解析出远程调用返回值再反序列化,最终得到结果。

 

再此举例说明:

先看一下demo中涉及到的对象,其中灰色部分Proxy$N、HessianSkeleton分别对应第一张图里面的客户端远程代理对象和服务端代理对象。深绿色部分HessianProxy是创建动态代理时所需的InvocationHandler,HessianProxy和HessianSkeleton是hessian框架的核心类。一般都是在客户端通过HessianProxyFactory创建一个动态代理,将远程方法调用转为http请求携带hessian调用数据,并接受相应的返回值。HessianSkeleteton代理具体的服务类比如HessianImpl,最终一个远程方法调用都会转换为对HessianImpl中的本地方法调用。

 

 

1.实体类TradeItemDto

  1. package hessian;  
  2. import java.math.BigDecimal;  
  • public class TradeItemDto implements java.io.Serializable {  
  •     private static final long serialVersionUID = -1074152706947019647L;  
  •     private BigDecimal amount;  
  •     public BigDecimal getAmount(){  
  •         return amount;  
  •     }     
  •     public void setAmount(java.math.BigDecimal amount) {  
  •         this.amount = amount;  
  •     }     
  •     public String toString() {  
  •         return this.amount.toString();    
  •     }     
  • }  

 

 

2.远程服务接口类

 

  1. package hessian;    
  2.     
  3. public interface IHessian {     
  4.     public String say(TradeItemDto tradeItemDto);    
  5. }  

 

 

 

 

3.远程接口服务实现类

  1. package hessian;    
  2.     
  3. import com.caucho.hessian.server.HessianServlet;    
  4.     
  5. public class HessianImpl extends HessianServlet implements IHessian{    
  6.     
  7.     public String say(TradeItemDto tradeItemDto) {     
  8.         return "Hello " + tradeItemDto.toString();    
  9.     }     
  10. }  

 

 

4.通过servlet暴露远程服务

 

  1. <?xml version="1.0" encoding="UTF-8"?>    
  2. <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
  3.     version="2.4"    
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  5.     
  6.     <servlet>    
  7.         <servlet-name>ihessian</servlet-name>    
  8.         <servlet-class>hessian.HessianImpl</servlet-class>   
  9.         <init-param>  
  10.             <param-name>debug</param-name>  
  11.             <param-value>true</param-value>  
  12.         </init-param>  
  13.     </servlet>    
  14.     <servlet-mapping>    
  15.         <servlet-name>ihessian</servlet-name>    
  16.         <url-pattern>/test</url-pattern>          
  17.     </servlet-mapping>    
  18. </web-app>  

 

 

5.客户端远程服务调用类

 

  1. package hessian;   
  2. import java.net.MalformedURLException;   
  3. import com.caucho.hessian.client.HessianProxyFactory;   
  4. public class TestHessian {   
  5.     public static void main(String[] args) {   
  6.         String url = "http://localhost:8080/hessian/test";   
  7.         HessianProxyFactory factory = new HessianProxyFactory();   
  8.         IHessian h = null;   
  9.         try {   
  10.             h = (IHessian) factory.create(IHessian.class, url);   
  11.         } catch (MalformedURLException e) {   
  12.             System.out.println("occur exception: " + e);   
  13.         }   
  14.         TradeItemDto tradeItemDto = new TradeItemDto();   
  15.         tradeItemDto.setAmount(new java.math.BigDecimal(2999));   
  16.         System.out.println(h.say(tradeItemDto));   
  17.     }  
  18. }  

 

 

 

客户端结果及服务端Debug输出

Hello 2999

下面是Debug输出,打印了hessian调用过程,我们说Hessian是二进制协议,它输出到流里面的都是二进制协议内容或者数据内容,区别于文本协议及文本数据内容。下面是hessian协议及hessian序列化的可视化,是为了帮助我们理解hessian调用过程。

 

  1. 17:48:38,169 ERROR [STDERR] 2010-9-25 17:48:38 com.caucho.hessian.server.HessianSkeleton$LogWriter write  
  2. 良好: call 2.0  
  3. 17:48:38,170 ERROR [STDERR] 2010-9-25 17:48:38 com.caucho.hessian.server.HessianSkeleton$LogWriter write  
  4. 良好:   method "say"  
  5. 17:48:38,170 ERROR [STDERR] 2010-9-25 17:48:38 com.caucho.hessian.server.HessianSkeleton$LogWriter write  
  6. 良好:   map hessian.TradeItemDto (#0)  
  7. 17:48:38,171 ERROR [STDERR] 2010-9-25 17:48:38 com.caucho.hessian.server.HessianSkeleton$LogWriter write  
  8. 良好:     "amount" => map java.math.BigDecimal (#1)  
  9. 17:48:38,171 ERROR [STDERR] 2010-9-25 17:48:38 com.caucho.hessian.server.HessianSkeleton$LogWriter write  
  10. 良好:                   "scale" => 0  
  11. 17:48:38,171 ERROR [STDERR] 2010-9-25 17:48:38 com.caucho.hessian.server.HessianSkeleton$LogWriter write  
  12. 良好:                   "intVal" => null  
  13. 17:48:38,172 ERROR [STDERR] 2010-9-25 17:48:38 com.caucho.hessian.server.HessianSkeleton$LogWriter write  
  14. 良好: Hessian 2.0  
  15. 17:48:38,172 ERROR [STDERR] 2010-9-25 17:48:38 com.caucho.hessian.server.HessianSkeleton$LogWriter write  
  16. 良好: Reply  
  17. 17:48:38,173 ERROR [STDERR] 2010-9-25 17:48:38 com.caucho.hessian.server.HessianSkeleton$LogWriter write  
  18. 良好:   "Hello 2999"  

 

 

 

备注:

1)3.13 以上版本支持debug,可以输出协议内容及序列化流

2)可以打开或者关闭远程调用方法是否可重载标志,方法参数个数必须固定,不支持变长参数

3) 注意客户端与服务端使用hessian.jar包版本

4)spring集成hessian

5)hessian调用原理决定客户端与服务端使用的接口类全限定名不必相同,只需方法名字参数要相同。

分享到:
评论

相关推荐

    hessian轻量级 rpc实现

    《Hessian轻量级RPC实现详解》 在分布式系统中,远程过程调用(Remote Procedure Call,简称RPC)是一种常用的技术,它使得客户端能够像调用本地方法一样调用远程服务器上的服务。Hessian,由Caucho Technology开发...

    Hessian远程调用框架学习一

    Hessian远程调用框架是基于Java的轻量级RPC(Remote Procedure Call)解决方案,它允许开发者在分布式系统中实现高效、便捷的跨网络对象方法调用。本教程将引导你入门Hessian,通过一个简单的JAVA demo来理解其工作...

    轻量级远程服务调用Hessian的入门实例和与Spring整合的实例.zip

    Hessian是一种轻量级的远程方法调用(RPC)协议,它基于HTTP协议,以二进制序列化的方式传输数据,使得远程服务调用如同本地方法调用一样快速且高效。这个压缩包文件包含了关于Hessian的入门实例以及如何将其与...

    hessian框架应用,实现远程调用,分布式开发

    Hessian框架是一款轻量级的Java远程方法调用(Remote Method Invocation, RMI)框架,由Caucho Technology公司开发。它主要应用于分布式系统中,允许应用程序通过HTTP协议进行高效、透明的远程调用,降低了分布式...

    远程调用服务框架

    3. **Hessian**:Hessian是一种轻量级的二进制RPC协议,由Caucho公司开发。它减少了网络传输的数据量,提高了远程调用的效率。Spring通过HessianProtocolFactoryBean实现了Hessian服务的消费和发布,使得远程调用...

    hessian示例远程轻量级传输

    Hessian是一种基于二进制协议的轻量级远程方法调用(RMI)技术,由Caucho Technology开发。它的设计目标是提供一种高效、简洁的方式来传输Java对象和方法调用,使得分布式应用间的通信变得更加简单和快速。在本文中,...

    java+hessian 远程调用

    Java Hessian远程调用是一种高效的、轻量级的RPC(Remote Procedure Call)解决方案,它允许Java应用程序通过网络进行跨语言的通信。Hessian是BEA Systems开发的一种二进制Web服务协议,它提供了序列化和远程方法...

    hessian实现远程调用

    Hessian是Apache项目下的一个轻量级的RPC(Remote Procedure Call,远程过程调用)框架,它提供了一种高效的二进制协议,用于在网络之间传递Java对象。下面我们将详细介绍Hessian的实现原理以及如何在实际开发中运用...

    Hessian Binary Web Service Protocol远程接口调用入门Demo

    Hessian二进制Web服务协议(Hessian Binary Web Service Protocol)是一种高效的、轻量级的远程过程调用(RPC)协议,它主要用于提高Web服务之间的通信效率。Hessian由Caucho Technology公司开发,旨在解决XML-RPC在...

    二进制Web服务Hessian刘骥讲座--(附源码)

    二进制Web服务Hessian是一种高效、轻量级的远程过程调用(RPC)协议,由Caucho Technology公司开发。这种协议主要用于提高网络通信效率,尤其在分布式系统中,它能够以二进制格式传输数据,从而比基于文本的协议(如...

    Hessian:轻量级的remoting onhttp工具介绍及基于Spring2的完整实例

    Hessian是一种轻量级的远程方法调用(RMI)协议,它基于HTTP并采用二进制编码,使得网络传输效率更高。Hessian的目标是提供一种简单、快速的方式来进行跨网络的服务调用,尤其是在处理Java与Java之间或者Java与其他...

    spring远程调用简单实例

    在本实例中,我们关注的是HTTP Invoker,这是一种基于HTTP的轻量级远程调用解决方案。HTTP Invoker不需要额外的二进制协议支持,而是利用Java序列化机制,将方法调用和参数以HTTP请求的形式发送到远程服务器,然后...

    hession远程调用分享

    Hessian作为一种轻量级的远程调用解决方案,因其高效、简单和跨语言的特性,在许多分布式系统中得到了广泛应用。理解并掌握Hessian的工作原理和使用方法,能够帮助我们更好地设计和实现高性能的分布式服务。在选择...

    Hessian

    Hessian是一种二进制Web服务协议,它由Caucho Technology公司开发,主要用于提供轻量级、高效的远程方法调用(Remote Method Invocation,RMI)服务。Hessian的目标是简化分布式系统之间的通信,通过减少网络传输的...

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

    为了解决这一问题,一种轻量级的远程调用协议——Hessian应运而生。本学习笔记将深入探讨Hessian在WebService中的应用及其优势。 **一、Hessian简介** Hessian是由Caucho Technology公司开发的一种二进制RPC...

    hessian

    Hessian是一种二进制Web服务协议,由Caucho Technology公司开发,主要用于提供轻量级、高效的远程方法调用(Remote Method Invocation, RMI)机制。它结合了HTTP协议的可扩展性和Java序列化机制的易用性,使得在...

    spring整合hessian进行远程通讯

    Hessian是一种二进制Web服务协议,它提供了一种轻量级、高效的远程方法调用方式。它基于HTTP协议,可以将Java对象序列化为二进制格式,减少了网络传输的数据量,从而提高了通信效率。 Spring框架提供了强大的依赖...

    hessian-4.0.33.jar

    Hessian是一种高效的二进制RPC(Remote Procedure Call)协议,由Caucho Technology开发,旨在提供轻量级、高效的远程调用服务。在这个专题中,我们将以hessian-4.0.33.jar为例,详细探讨Hessian框架的核心特性和...

    java源码:brap(Java远程调用框架 BRAP).rar

    BRAP(Business Remote Application Protocol)是一个高性能、轻量级的Java远程调用框架,它旨在简化分布式系统中的服务调用,提高开发效率。这个压缩包包含的是一份完整的BRAP框架源码,对于深入理解Java远程调用...

    hessian使用小例子

    在IT行业中,Hessian是一种轻量级的二进制序列化协议,主要用于远程方法调用(RMI)和Web服务。Hessian由Caucho Technology开发,它的设计目标是提供比XML更快、更简洁的数据传输方式,从而提高网络通信效率。在Java...

Global site tag (gtag.js) - Google Analytics