一、什么是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

 package mytest;

 public interface Basic {
public String hello();
}

HessianClient.java

 package mytest;

 import java.net.MalformedURLException;

 import com.caucho.hessian.client.HessianProxyFactory;

 public class HessianClient {
public static void main(String[] args) throws MalformedURLException {
String url = "http://localhost:8080/hessian_server_test/hello"; HessianProxyFactory factory = new HessianProxyFactory();
Basic basic = (Basic) factory.create(Basic.class, url); System.out.println("Hello: " + basic.hello()); }
}

服务端:

Basic.java

 package mytest;

 public interface Basic {
public String hello();
}

BasicService.java

 package mytest;

 public class BasicService implements Basic {

     private String greeting = "hello,world!";

     @Override
public String hello() {
return greeting;
} public void setGreeting(String greeting) {
this.greeting = greeting;
} }

【更多参考】

Java学习---面向对象的远程方法调用[RMI]

点击下载

Java学习---RMI 技术分析[Hessian]的更多相关文章

  1. 深度学习Dropout技术分析

    深度学习Dropout技术分析 什么是Dropout? dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃.注意是暂时,对于随机梯度下降来说,由于是随机 ...

  2. Java学习---面向对象的远程方法调用[RMI]

    基础知识 分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果. 常见的分 ...

  3. Java 远程通讯技术及原理分析

    在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些 ...

  4. Java远程通讯技术及原理分析

    在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些 ...

  5. (转)如何学习Java技术?谈Java学习之路

    51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领 ...

  6. Java学习笔记(十六)——Java RMI

    [前面的话] 最近过的好舒服,每天过的感觉很充实,一些生活和工作的技巧注意了就会发现,其实生活也是可以过的如此的有滋有味,满足现在的状况,并且感觉很幸福. 学习java RMI的原因是最近在使用dub ...

  7. Java分布式处理技术(RMI,JDNI)

    http://hedaoyuan.blog.51cto.com/4639772/813702 1.1 RMI的基本概念 1.1.1 什么是RMI RMI(Remote Method Invocatio ...

  8. Java学习路线图分析

     Java学习路线分析图 第一阶段 技术名称 技术内容 J2SE(java基础部分) java开发前奏 计算机基本原理,Java语言发展简史以及开发环境的搭建,体验Java程序的开发,环境变量的设置, ...

  9. Java安全之RMI协议分析

    Java安全之RMI协议分析 0x00 前言 在前面其实有讲到过RMI,但是只是简单描述了一下RMI反序列化漏洞的利用.但是RMI底层的实现以及原理等方面并没有去涉及到,以及RMI的各种攻击方式.在其 ...

随机推荐

  1. First Android application

    In eclipse ADT : 1.创建一个新工程 File -> New -> Android Application Project 2.三个主要的文件 /src/MainActiv ...

  2. 10 阻塞队列 & 生产者-消费者模式

    原文:http://www.cnblogs.com/dolphin0520/p/3932906.html 在前面我们接触的队列都是非阻塞队列,比如PriorityQueue.LinkedList(Li ...

  3. c之指针与数组(2)Dynamic Data Structures: Malloc and Free--转载

    http://www.howstuffworks.com/c29.htm http://computer.howstuffworks.com/c.htm Dynamic Data Structures ...

  4. switch case :在JDK 7中,又加入了对String类型的支持,从此不用再写If-Else来判断字符串了

    switch的case语句可以处理int,short,byte,char类型的值, 因为short,byte,char都会转换成int进行处理,这一点也可以从生成的字节码看出. char a = 'e ...

  5. 打乱数组——shuffle

    在学习vue移动端音乐项目时,看到一个打乱数组函数,感觉很有意思就记录一下(意外发现:slice是个有趣的知识点) 原理:遍历数组,(let i = 0; i < _arr.length; i+ ...

  6. Idea软件Vim插件问题

    人家说用webstorm是纯前端,用Idea是java+前端,好,那就用Idea,装上试试,全选所有插件安装,奇迹出现了,选中一行代码,backspace,删不了,我的天,好吧,复制粘贴的快捷键也不行 ...

  7. 如何在service实现弹出对话框

           因为一些需求,我想在service处理后台运行时候,会弹出对话框,但是对话框的建立需要传入Context的值,我试过传入this,也就是service自己的context,还有 传入ge ...

  8. SQL Server将DataTable传入存储过程(Table Value Parameter)

    博主在做毕业设计的时候,需要用到事务处理和多次将数据写入不同的表中,但是 SQL Server 数据库是不支持数组类型变量的,想要实现数组的功能,可以通过 XML 和数据表的方法实现,但是实现方法非常 ...

  9. Spring------约束导入和application.xml的引入方式

    1.spring约束的导入 2.SSH常用约束 3.application.xml的引入方式 <1.通过ClassPathXmlApplicationContext引入配置文件applicati ...

  10. java类加载机制及方法调用

    类加载机制 概述 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading).验证(Verification).准备(Preparation).解析(Resoluti ...