`

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

 

package hessian;   
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.远程服务接口类

package hessian;     
     
public interface IHessian {      
    public String say(TradeItemDto tradeItemDto);     
}  

 

3.远程接口服务实现类

package hessian;     
import com.caucho.hessian.server.HessianServlet;     
public class HessianImpl extends HessianServlet implements IHessian{     
    public String say(TradeItemDto tradeItemDto) {      
        return "Hello " + tradeItemDto.toString();     
    }      
}  

 

4.通过servlet暴露远程服务

<?xml version="1.0" encoding="UTF-8"?>     
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     
    version="2.4"     
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
     
    <servlet>     
        <servlet-name>ihessian</servlet-name>     
        <servlet-class>hessian.HessianImpl</servlet-class>    
        <init-param>  
            <param-name>debug</param-name>  
            <param-value>true</param-value>  
        </init-param>  
    </servlet>     
    <servlet-mapping>     
        <servlet-name>ihessian</servlet-name>     
        <url-pattern>/test</url-pattern>           
    </servlet-mapping>     
</web-app> 

 

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

package hessian;    
import java.net.MalformedURLException;    
import com.caucho.hessian.client.HessianProxyFactory;    
public class TestHessian {    
    public static void main(String[] args) {    
        String url = "http://localhost:8080/hessian/test";    
        HessianProxyFactory factory = new HessianProxyFactory();    
        IHessian h = null;    
        try {    
            h = (IHessian) factory.create(IHessian.class, url);    
        } catch (MalformedURLException e) {    
            System.out.println("occur exception: " + e);    
        }    
        TradeItemDto tradeItemDto = new TradeItemDto();    
        tradeItemDto.setAmount(new java.math.BigDecimal(2999));    
        System.out.println(h.say(tradeItemDto));    
    }   
} 

 

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

Hello 2999

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

17:48:38,169 ERROR [STDERR] 2010-9-25 17:48:38 com.caucho.hessian.server.HessianSkeleton$LogWriter write   
良好: call 2.0  
17:48:38,170 ERROR [STDERR] 2010-9-25 17:48:38 com.caucho.hessian.server.HessianSkeleton$LogWriter write   
良好:   method "say"  
17:48:38,170 ERROR [STDERR] 2010-9-25 17:48:38 com.caucho.hessian.server.HessianSkeleton$LogWriter write   
良好:   map hessian.TradeItemDto (#0)   
17:48:38,171 ERROR [STDERR] 2010-9-25 17:48:38 com.caucho.hessian.server.HessianSkeleton$LogWriter write   
良好:     "amount" => map java.math.BigDecimal (#1)   
17:48:38,171 ERROR [STDERR] 2010-9-25 17:48:38 com.caucho.hessian.server.HessianSkeleton$LogWriter write   
良好:                   "scale" => 0  
17:48:38,171 ERROR [STDERR] 2010-9-25 17:48:38 com.caucho.hessian.server.HessianSkeleton$LogWriter write   
良好:                   "intVal" => null  
17:48:38,172 ERROR [STDERR] 2010-9-25 17:48:38 com.caucho.hessian.server.HessianSkeleton$LogWriter write   
良好: Hessian 2.0  
17:48:38,172 ERROR [STDERR] 2010-9-25 17:48:38 com.caucho.hessian.server.HessianSkeleton$LogWriter write   
良好: Reply   
17:48:38,173 ERROR [STDERR] 2010-9-25 17:48:38 com.caucho.hessian.server.HessianSkeleton$LogWriter write   
良好:   "Hello 2999"  
 

备注:

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

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

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

4)spring集成hessian

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

 

  • 大小: 36.6 KB
  • 大小: 45.7 KB
  • 大小: 78.5 KB
分享到:
评论
2 楼 wangjian95 2012-07-13  
IHessian  继承了jar包中的


lichuanbao 写道
您这是服务器端和客户端在一个工程里面。如果服务器端在其他的工程里面,那么我们调用服务器端服务时,服务端的类引用我们怎么实现呢?
 h = (IHessian) factory.create(IHessian.class, url);      
就是上面的IHessian.class我们怎么获取呢?谢谢

1 楼 lichuanbao 2012-03-23  
您这是服务器端和客户端在一个工程里面。如果服务器端在其他的工程里面,那么我们调用服务器端服务时,服务端的类引用我们怎么实现呢?
 h = (IHessian) factory.create(IHessian.class, url);      
就是上面的IHessian.class我们怎么获取呢?谢谢

相关推荐

    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