Hessian实现原理

Hessian的设计很轻巧,代码也不复杂,Jar包只有几百K,很合适二次开发。

  1. Hessian的服务是以Servlet的方式暴露。

    所有服务提供者都需要继承HessianServlet,HessianServlet又继承HttpServlet,HessianServlet重写public void service(ServletRequest request, ServletResponse response)方法处理远程调用,而request和response传输的数据格式则由hessian内部设计。

    客户端同样由Hessian包装,使用Java代理的方式暴露为接口,其实质操作是构造request参数向服务器端发出请求。

    这是一种以http和servlet为承载的方式,非常容易和其他标准的框架融合。例如整合到Spring和Tomcat容器中,这是一种好的设计方向。

  2. 客户端和服务器之间传输的数据是Hessian设计的协议。

    协议数据格式是不重要的,数据格式肯定是紧凑的,重要的是知道协议包含了哪些信息:

    • 方法名(如果客户端设置setOverloadEnabled为true,那么传递过来的方法是方法名_参数1类型_参数2类型...,这样就可以区分重装方法了)以找到Method。

    • 根据Method的参数列表及类型读取参数值,然后反射调用方法,最后按格式将返回值序列化成二进制写回去。

      在信息的交互过程中,因为接口在客户端和服务器端都有,所以双方都是知道Class类型的,而Class类型的序列化是统一由hessian进行的,只有做到对Serializable对象序列化向下兼容,即可。

SOA上下文传递

SOA调用属于应用间调用,信息是从方法的参数传递过去,但有一些信息,是希望在调用时自动传递过去,无论什么方法、无论调用多少次。例如登录态信息,A应用获得了登录态,A应用调用了B应用,如果没有在参数中传递过去,B应用是无法拿到登录信息的。因此,如果增加一个上下文传递功能,那么登录拦截器完成登录校验后,登录态就可以放在SOA上下文中传递过去了。

SOA上下文传递功能,在记录SOA调用链这个非常实用的运维功能时,也非常好用。

Hessian的上下文传递特性可以加在Http头部,该功能已经在Hessoa中实现。

文档更新时间: 2018-11-10 20:17   作者:nick