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