- 浏览: 365187 次
- 性别:
- 来自: 阿里巴巴
文章分类
- 全部博客 (207)
- Maven (5)
- Cassandra (2)
- Hadoop (3)
- LDAP (2)
- SOA (7)
- 认证、加密、安全 (6)
- 搜索引擎相关技术 (3)
- REST (7)
- 数据库 (11)
- Java 基础相关 (38)
- UML (1)
- Java NIO 框架 (3)
- javassist (1)
- Bean容器 (4)
- 网络编程 (1)
- NoSQL (4)
- XML、Json (1)
- JS (2)
- Google (6)
- Warp-MVC (2)
- 持久层 (2)
- sitebricks (1)
- MVC (6)
- CSS (2)
- JPA (2)
- RDBMS (5)
- cache (4)
- tomcat (1)
- 其它 (3)
- eclipse (1)
- bigpipe (1)
- RDBMS MySQL (1)
- MySQL (2)
- ant (1)
- 前端 (2)
- Groovy (1)
- linux (3)
- Scala (1)
- zookeeper (1)
- redis (2)
- 测试 (1)
- 监控 (1)
- mac (3)
- 区块链 (3)
- 工具 (1)
最新评论
-
masuweng:
好好好,辛苦了!!
Spring Data JPA 简单介绍 -
masuweng:
Spring Data JPA 简单介绍 -
zhangjianxinjava:
您好,大神本人小白一个最近在研究不知道可否 通过邮箱进行交流, ...
JAVA Metrics度量工具 - Metrics Core -
xzs603:
http://zhengdl126.iteye.com/blo ...
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 -
JavaStart:
运行mysql2redis 的install.sh 文件为何提 ...
mysql到redis的复制
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调用原理决定客户端与服务端使用的接口类全限定名不必相同,只需方法名字参数要相同。
评论
h = (IHessian) factory.create(IHessian.class, url);就是上面的IHessian.class我们怎么获取呢?谢谢
h = (IHessian) factory.create(IHessian.class, url);就是上面的IHessian.class我们怎么获取呢?谢谢
发表评论
-
浮点数计算
2020-08-25 16:15 320@Test public void test2() ... -
AQS、ReentrantLock、CLH锁 、MCS锁 分析
2018-12-25 23:45 6751. ReentrantLock的介绍 Reentran ... -
Java并发编程:CountDownLatch、CyclicBarrier、Semaphore、Phaser
2015-02-26 16:41 1362在java 1.5中,提供了 ... -
技术网站资料
2014-07-17 11:53 0http://javakaiyuan.com ht ... -
Java之死-前言
2014-07-15 10:14 747用了好多年的java之后越来越感觉其并不像 ... -
通过JVM获取相关的服务器信息 .
2013-01-07 20:18 2169http://blog.csdn.net/zgmzyr/art ... -
Java中使用OpenSSL生成的RSA公私钥进行数据加解密
2012-10-25 11:34 4373openssl genrsa -out rsa_pr ... -
java开源
2012-05-29 14:34 1490开源不是开放编译器的源代码,而是写了一个软 ... -
用Ant打Jar包--在Manifest中引用Classpath
2012-03-15 13:20 1588用Ant打Jar包--在Manifest ... -
分布式锁服务器
2011-11-07 22:14 1945在分布式系统中如何 ... -
Java 7 Fork/Join 并行计算框架概览
2011-11-05 16:26 1070http://www.iteye.com/topic/ ... -
Apache Jakarta Commons 工具集简介
2011-11-03 11:22 1584org.apache.commons.collectio ... -
JDBC batch批处理Statement executeBatch 详解
2011-09-28 13:25 2741http://blog.csdn.net/basene ... -
代码动态生成利器ASM
2011-09-22 20:02 1051前言 代码生成器(code generato ... -
Fastjson技术内幕
2011-09-13 23:51 1339文章来源:http://code.alibabatech.co ... -
基于Spring可扩展Schema提供自定义配置支持
2011-08-07 16:01 1226在很多情况下,我们需要为系统提供可配置化支持,简单的做法可以直 ... -
Mule 与 Spring2.0's extensible XML configuration mechanism
2011-08-07 15:50 1356mule2.2.1已经采用从sprin ... -
alibaba fastjson(json序列化器)序列化部分源码解析
2011-08-03 21:11 2016本文copy自http://www.flydmeng.co ... -
JVM 远程调试 参数
2011-07-28 09:49 1883远程调试 参数 -server -Xdebug -Xnoag ... -
Sequential Lock in Java
2011-07-03 16:22 13971 Overview Linux内核中常见的同步机制 ...
相关推荐
《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对象和方法调用,使得分布式应用间的通信变得更加简单和快速。在本文中,...
Java Hessian远程调用是一种高效的、轻量级的RPC(Remote Procedure Call)解决方案,它允许Java应用程序通过网络进行跨语言的通信。Hessian是BEA Systems开发的一种二进制Web服务协议,它提供了序列化和远程方法...
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...