Hessian原理与程序设计

一、Hessian定义

  Hessian与WebService一样,可以完成远程方法调用。Hessian的接口调用基于Http,是基于Binary-RPC协议实现,是一种二进制数据格式的交互方式,所以可以跨不同的语言平台。

 

二、效率比较

 RMI(Java Remote Method Invocation) Java远程方法调用,是Java自带的,只能用于Java程序之间的远程访问。

 Httpinvoker使用Java的序列化技术传输对象,与RMI本质上是一样的,从效率上看,二者也相差无几。

 RMI > Httpinvoker >= Hessian >> WebService

Hessian在传输少量对象的时候,比RMI还要快速,但传输数据结构复杂的对象或大量数据对象的时候,比RMI要慢20%左右,但只是在数据量特别大的时候。

效率最低的就是WebService,使用的是XML,协议标准。

 

三、Hessian原理与协议简析

1、Hessian中Client与Server的交互是基于Http-post方式。

2、Hessian将辅助信息封装在Http-header中,比如授权token等,我们可以基于Http-header来封装关于"安全校验""meta数据"等hessian提供了简单的"校验"机制。

3、关于Hessian的交互核心数据,比如调用方法和参数列表信息,将通过post请求的body体直接发送,格式为字节流。

4、对于hessian的Server端响应数据,将在Response中通过字节流的方式直接输出。

 

Client端:

在Client端,核心API为:

1) HessianProxyFactory: 负责托管"远程接口"和"远程hessian服务的URL",并生成代理类(Java Proxy实例)。

2) HessianProxy当代理实例的方法调用时,HessianProxy负责序列化"方法名"/"参数列表"等,并调用远程URL获取响应数据;同时也负责反序列化。

3) HessianOutput: 输出流控制,用来序列化请求的数据。负责将序列化的字节数据,按照协议,写入inputStream,并通过URL Connection发送给远端。

4) HessianInput: 输入流控制,用来反序列化响应的结果,其中包括remote端的异常栈(在client端将会被重新抛出),“Fault”信息(remote端的失败信息,比如格式错误等);很多时候,你可以通过指定http response-code值来实现特定的请求失败信号。

 

四、代码示例

 Hessian一个入门案例:https://blog.csdn.net/xzm_rainbow/article/details/17040953

 参考以上链接写了两个spring-boot工程:hessian-server、hessian-client

 FIXME具体示例代码已传到码云上:https://gitee.com/xmy_open_project/hessian

 分别启动hessian-server、hessian-client的ApplicationMain方法

 在浏览器中输入http://localhost:8080/getUser可以看到返回{"id":1,"name":"我是id:1对应的用户"}

 

 

 

参考文献
微信收藏:https://mp.weixin.qq.com/s/GaoEw-LmcFCgK0k097Pfbg
原文地址:https://blog.csdn.net/zhaifengmin/article/details/45166151

https://blog.csdn.net/xzm_rainbow/article/details/17040953

http://www.leftso.com/blog/337.html

posted @ 2018-05-10 16:08  喝酒骑驴撞城管  阅读(278)  评论(0编辑  收藏  举报