Java学习---RMI 技术分析[Hessian]
一、什么是Hessian
Hessian 是一个基于 binary-RPC 实现的远程通讯 library。使用二进制传输数据。Hessian通常通过Web应用来提供服务,通过接口暴露。Servlet和Spring的DispatcherServlet都可以把请求转发给Hessian服务。由以下两种方式提供,分别为:com.caucho.hessian.server.HessianServlet、org.springframework.web.servlet.DispatcherServlet。
Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI(Java Remote Method Invocation 方法远程调用 )的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC((RemoteProcedureCallProtocol)——远程过程调用协议)协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
Dubbo是[3]阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 [4]Spring框架无缝集成。调用 淘宝和支付宝 的接口 ,通常使用 Dubbo ,Dubbo底层使用Hessian
下载网址: http://hessian.caucho.com/ hessian-4.0.33.jar
关于hessian的7个问题:
1、是基于什么协议实现的?
基于Binary-RPC协议实现。
2、怎么发起请求?
需通过Hessian本身提供的API来发起请求。
3、怎么 将请求转化为符合协议的格式的?
Hessian通过其自定义的串行化机制将请求信息进行序列化,产生二进制流。
4、使用什么 传输协议传输?
Hessian基于Http协议进行传输。
5、响应端基于什么机制来接收请求?
响应端根据Hessian提供的API来接收请求。
6、怎么将流还原为传输格式的?
Hessian根据其私有的串行化机制来将请求信息进行反序列化,传递给使用者时已是相应的请求信息对象了。
7、处理完毕后怎么回应?
处理完毕后直接返回,hessian将结果对象进行序列化,传输至调用端。
8、其他
RMI 是 Java 首选远程调用协议,非常高效稳定,特别是在数据结构复杂,数据量大的情况下,与其他通讯协议的差距尤为明显。但不能跨语言
HttpInvoker 使用 java 的序列化技术传输对象,与 RMI 在本质上是一致的,不能跨语言
Hessian 性能比RMI 慢20% ,但是通过二进制传输,跨语言
Burlap 采用 xml 格式传输。仅在传输 1 条数据时速度尚可,通常情况下,它的毫时是 RMI 的 3 倍。
WebService通讯毫时是 RMI 的 10 倍,传输xml数据,基于soap协议 (Axis2、 CXF )
二、hessian的优缺点
优点:
简单易用,面向接口,通过接口暴露服务,jar包只有200、300k,不需要配置防火墙
效率高,复杂对象序列化速度仅次于RMI,简单对象序列化优于RMI,二进制传输
多语言支持:wiki、Java、Flash/Flex、Python、C++、.NET C#、PHP、Ruby、Objective-C
可与spring集成,配置简单,HessianServiceExporte
缺点:
缺乏安全机制,传输没有加密处理
异常机制不完善,总是报一些错误,错误原因也是千奇百怪,提示信息不足
事务处理欠缺
版本问题,spring 2.5.6对照3.1.3版,spring 3对照4.0及以上版本,需要使用spring MVC
部分内容
三、各个通讯协议对比:
通讯效率测试结果:
RMI > Httpinvoker >= Hessian >> Burlap >> Web service
1.RMI 是 Java 首选远程调用协议,非常高效稳定,特别是在数据结构复杂,数据量大的情况下,与其他通讯协议的差距尤为明显。但不能跨语言。
2.HttpInvoker 使用 java 的序列化技术传输对象,与 RMI 在本质上是一致的。从效率上看,两者也相差无几, HttpInvoker 与 RMI 的传输时间基本持平。
3.Hessian 在传输少量对象时,比 RMI 还要快速高效,但传输数据结构复杂的对象或大量数据对象时,较 RMI 要慢 20% 左右。但这只是在数据量特别大,
数据结构很复杂的情况下才能体现出来,中等或少量数据时, Hessian并不比RMI慢。 Hessian 的好处是精简高效,可以跨语言使用,而且协议规范公开,
我们可以针对任意语言开发对其协议的实现。另外, Hessian与WEB服务器结合非常好,借助WEB服务器的成熟功能,在处理大量用户并发访问时会有很大优势,在资源分配,
线程排队,异常处理等方面都可以由成熟的WEB服务器保证。而 RMI 本身并不提供多线程的服务器。而且,RMI 需要开防火墙端口, Hessian 不用。
4.Burlap 采用 xml 格式传输。仅在传输 1 条数据时速度尚可,通常情况下,它的毫时是 RMI 的 3 倍。
5.Web Service 的效率低下是众所周知的,平均来看, Web Service 的通讯毫时是 RMI 的 10 倍。
四、基本应用流程
客户端必须具备以下几点:
·java客户端包含Hessian.jar的包。
·具有和服务器端结构一样的接口。
·利用HessianProxyFactory调用远程接口。
·使用spring方式需要配置HessianProxyFactoryBean
注意:使用resin容器时,resin已经包含了hessian.jar包
JAVA服务器端必须具备以下几点:
·包含Hessian的jar包。
·设计一个接口,用来给客户端调用。
·实现该接口的功能。
·配置web.xml,配好相应的servlet。
·对象必须实现Serializable 接口。
·对于spring方式DispatcherServlet拦截url,HessianServiceExporter提供Bean服务
五、几种Remoting实现的比较
Spring支持的Remoting实现技术是非常多的,虽然Spring屏蔽了这些技术使用上的差异,但是选择一个合适的Remoting技术仍然对系统有非常积极的作用,下面就来讲述这些实现技术的优缺点。
(1) RMI:
RMI使用Java的序列化机制实现调用及返回值的编组(marshal)与反编组(unmarshal),可以使用任何可序列化的对象作为参数和返回值。其缺点是RMI只能通过RMI协议来进行访问,无法通过HTTP协议访问,无法穿透防火墙。
(2) Hessian:
Hessian也是将网络传输的对象转换为二进制流通过Http进行传递,不过它是使用自己的序列化机制实现的编组与反编组,其支持的数据类型是有限制的,不支持复杂的对象。Hessian的优点是可以透过防火墙。
(3) Burlap:
Burlap是将网络传输的对象转换为XML文本格式通过Http进行传递,支持的对象与Hessian相比更少。XML一般比二进制流占 用空间大,在网络上传递所需要的时间比二进制流长,XML的解析过程也会耗用更多的内存。Burlap可以穿透防火墙,而且由于传输的格式是XML文本, 可以与其他系统(比如.NET)集成,从某种程度来讲,Burlap是一种不标准的WebService。
(4) HttpInvoker:
HttpInvoker将参数和返回值通过Java的序列化机制进行编组和反编组,它具有RMI的支持所有可序列化对象的优点。 Http Invoker是使用Http协议传输二进制流的,而同时又具有Hessian、Burlap的优点。
六、代码测试
客户端:
Basic.java
1 package mytest; 2 3 public interface Basic { 4 public String hello(); 5 }
View Code
HessianClient.java
1 package mytest; 2 3 import java.net.MalformedURLException; 4 5 import com.caucho.hessian.client.HessianProxyFactory; 6 7 public class HessianClient { 8 public static void main(String[] args) throws MalformedURLException { 9 String url = "http://localhost:8080/hessian_server_test/hello"; 10 11 HessianProxyFactory factory = new HessianProxyFactory(); 12 Basic basic = (Basic) factory.create(Basic.class, url); 13 14 System.out.println("Hello: " + basic.hello()); 15 16 } 17 }
View Code
服务端:
Basic.java
1 package mytest; 2 3 public interface Basic { 4 public String hello(); 5 }
View Code
BasicService.java
1 package mytest; 2 3 public class BasicService implements Basic { 4 5 private String greeting = "hello,world!"; 6 7 @Override 8 public String hello() { 9 return greeting; 10 } 11 12 public void setGreeting(String greeting) { 13 this.greeting = greeting; 14 } 15 16 }
View Code
【更多参考】
Java学习---面向对象的远程方法调用[RMI]
点击下载
转载于:https://www.cnblogs.com/ftl1012/p/hessian.html
Java学习---RMI 技术分析[Hessian]相关推荐
- java超线程_超线程多核心下Java多线程编程技术分析
在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述超线程多核心下Java多线程编程技术分析,更多Java专业知识,广州疯狂 ...
- 深度学习Dropout技术分析
深度学习Dropout技术分析 什么是Dropout? dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃.注意是暂时,对于随机梯度下降来说,由于是随机 ...
- Android Java虚拟机拦截技术分析
2019独角兽企业重金招聘Python工程师标准>>> 最近反编译金山毒霸,分析其广告拦截功能是如何实现的.根据金山毒霸的介绍,采用了java虚拟机拦截技术,带着好奇去研究了一下.在 ...
- 深度学习基础技术分析2:神经网络(含代码分析)
1. 模型图示 感知机仅能解决线性的问题,这个局限性使得其无法适应多数的实际应用.因此人们提出了神经网络.如图2.1所示. 图2.1 神经网络 2. 相关技术 技术2.1 隐藏层 从结构上看,神经网络 ...
- 黄金投资技术分析入门的时候要学点什么
面对复杂的贵金属市场,你知道怎么去应对市场的变化吗?不管是活跃的走势还是平静的市场,投资者只要能够看准趋势,找到合适的做单机会,就可以赚到钱.在贵金属市场内,黄金投资的获利利润还是相当不错的.对于交易 ...
- Java 远程通讯技术及原理分析
转自:https://www.cnblogs.com/Luouy/p/7399918.html 消息模式 归根结底,企业应用系统就是对数据的处理,而对于一个拥有多个子系统的企业应用系统而言,它的基础支 ...
- Java定时任务技术分析
<从零打造项目>系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建 SpringBoot集成Mybatis项目实操 ...
- Java高级程序员需要学习哪些技术?
Java高级程序员具备的特点,首先Java高级程序员必须具有一定的业务分析和流程意识.性能优化经验,大数据设计处理和功能开发.会语言设计和技能开发.很强的学习能力.具备Java内存模型.GC工作原理. ...
- java 学习写架构必会几大技术点
java 学习写架构必会几大技术点 关于学习架构,必须会的几点技术 1. java反射技术 2. xml文件处理 3. properties属性文件处理 4. 线程安全机制 5. annoc ...
最新文章
- C语言\b回退一格!多点的!_只愿与一人十指紧扣_新浪博客
- 2020年必学的 10 大算法
- STM32串口使用详解
- python入门学习课程推荐
- 容器网络|深入理解Cilium
- C++喜欢收录和反链都保持增长的态势
- Spark快速大数据分析——Spark的Hadoop配置(肆)
- My97datepicker时间控件的简单使用
- html水晶按钮图片,20个纯CSS3实现的彩色透明水晶按钮
- Pr 入门教程:如何调整音频轨道音量?
- html给页面加背景特效怎么加,给网页加上js特效
- 社会保险费的缴费基数与缴费比例
- java小游戏实训目的_Java弹球小游戏实验报告.doc
- Problem Set 1
- [硫化铂]treecnt
- 问题:The given artifact contains a string literal with a package reference 'andro
- 手机ANR问题处理方法及策略
- AI Challenger 全球AI挑战赛[二]——场景分类比赛介绍(附数据集和基线模型百度云下载)
- 2020年中国电影市场票房全球最高;辛芷蕾成为瑞士莲亚太区品牌代言人 | 美通企业日报...
- SQL 面试题:WHERE 和 HAVING、ON 有什么区别?