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调用原理决定客户端与服务端使用的接口类全限定名不必相同,只需方法名字参数要相同。
相关推荐
《Hessian轻量级RPC实现详解》 在分布式系统中,远程过程调用(Remote Procedure Call,简称RPC)是一种常用的技术,它使得客户端能够像调用本地方法一样调用远程服务器上的服务。Hessian,由Caucho Technology开发...
Hessian远程调用框架是基于Java的轻量级RPC(Remote Procedure Call)解决方案,它允许开发者在分布式系统中实现高效、便捷的跨网络对象方法调用。本教程将引导你入门Hessian,通过一个简单的JAVA demo来理解其工作...
Hessian是一种轻量级的远程方法调用(RPC)协议,它基于HTTP协议,以二进制序列化的方式传输数据,使得远程服务调用如同本地方法调用一样快速且高效。这个压缩包文件包含了关于Hessian的入门实例以及如何将其与...
Hessian框架是一款轻量级的Java远程方法调用(Remote Method Invocation, RMI)框架,由Caucho Technology公司开发。它主要应用于分布式系统中,允许应用程序通过HTTP协议进行高效、透明的远程调用,降低了分布式...
3. **Hessian**:Hessian是一种轻量级的二进制RPC协议,由Caucho公司开发。它减少了网络传输的数据量,提高了远程调用的效率。Spring通过HessianProtocolFactoryBean实现了Hessian服务的消费和发布,使得远程调用...
Hessian是一种基于二进制协议的轻量级远程方法调用(RMI)技术,由Caucho Technology开发。它的设计目标是提供一种高效、简洁的方式来传输Java对象和方法调用,使得分布式应用间的通信变得更加简单和快速。在本文中,...
Hessian是Apache项目下的一个轻量级的RPC(Remote Procedure Call,远程过程调用)框架,它提供了一种高效的二进制协议,用于在网络之间传递Java对象。下面我们将详细介绍Hessian的实现原理以及如何在实际开发中运用...
Hessian二进制Web服务协议(Hessian Binary Web Service Protocol)是一种高效的、轻量级的远程过程调用(RPC)协议,它主要用于提高Web服务之间的通信效率。Hessian由Caucho Technology公司开发,旨在解决XML-RPC在...
二进制Web服务Hessian是一种高效、轻量级的远程过程调用(RPC)协议,由Caucho Technology公司开发。这种协议主要用于提高网络通信效率,尤其在分布式系统中,它能够以二进制格式传输数据,从而比基于文本的协议(如...
Hessian是一种轻量级的远程方法调用(RMI)协议,它基于HTTP并采用二进制编码,使得网络传输效率更高。Hessian的目标是提供一种简单、快速的方式来进行跨网络的服务调用,尤其是在处理Java与Java之间或者Java与其他...
在本实例中,我们关注的是HTTP Invoker,这是一种基于HTTP的轻量级远程调用解决方案。HTTP Invoker不需要额外的二进制协议支持,而是利用Java序列化机制,将方法调用和参数以HTTP请求的形式发送到远程服务器,然后...
Hessian作为一种轻量级的远程调用解决方案,因其高效、简单和跨语言的特性,在许多分布式系统中得到了广泛应用。理解并掌握Hessian的工作原理和使用方法,能够帮助我们更好地设计和实现高性能的分布式服务。在选择...
Hessian是一种二进制Web服务协议,它由Caucho Technology公司开发,主要用于提供轻量级、高效的远程方法调用(Remote Method Invocation,RMI)服务。Hessian的目标是简化分布式系统之间的通信,通过减少网络传输的...
为了解决这一问题,一种轻量级的远程调用协议——Hessian应运而生。本学习笔记将深入探讨Hessian在WebService中的应用及其优势。 **一、Hessian简介** Hessian是由Caucho Technology公司开发的一种二进制RPC...
Hessian是一种二进制Web服务协议,由Caucho Technology公司开发,主要用于提供轻量级、高效的远程方法调用(Remote Method Invocation, RMI)机制。它结合了HTTP协议的可扩展性和Java序列化机制的易用性,使得在...
Hessian是一种二进制Web服务协议,它提供了一种轻量级、高效的远程方法调用方式。它基于HTTP协议,可以将Java对象序列化为二进制格式,减少了网络传输的数据量,从而提高了通信效率。 Spring框架提供了强大的依赖...
Hessian是一种高效的二进制RPC(Remote Procedure Call)协议,由Caucho Technology开发,旨在提供轻量级、高效的远程调用服务。在这个专题中,我们将以hessian-4.0.33.jar为例,详细探讨Hessian框架的核心特性和...
BRAP(Business Remote Application Protocol)是一个高性能、轻量级的Java远程调用框架,它旨在简化分布式系统中的服务调用,提高开发效率。这个压缩包包含的是一份完整的BRAP框架源码,对于深入理解Java远程调用...
在IT行业中,Hessian是一种轻量级的二进制序列化协议,主要用于远程方法调用(RMI)和Web服务。Hessian由Caucho Technology开发,它的设计目标是提供比XML更快、更简洁的数据传输方式,从而提高网络通信效率。在Java...
在IT领域,Hessian是一种二进制Web服务协议,它由Caucho Technology开发,主要用于提供轻量级、高效的远程过程调用(RPC)机制。Hessian的目标是简化分布式系统间的通信,减少网络传输的数据量,提高服务调用的性能...