1、Hessian入门
Hessian是一种binary-rpc。性能较高。主要使用在交互数据较小的场景中。hessian的数据交互基于http协议,通常hessian的server端设计须要使用到web server容器(比方servlet等)。使用也是很简单,只需要暴露方法给server,client就可以像调用本地方法一下调用暴露的远程方法。
示例demo如下:
(1)提供一个服务接口来给客户端调用
User类
(2)IServer的具体实现类
(3)web.xml配置
(4)客户端调用
2、Hesian基本原理
(1)客户端发起请求
Hessian的远程调用过程,客户端主要是通过 HessianProxyFactory 的 create 方法就是创建接口的代理类,该类实现了接口, JDK 的 proxy 类会自动用 InvocationHandler 的实现类—— HessianProxy 的 invoke 方法体来填充所生成代理类的方法体。
public Object create(Class<?> api, URL url, ClassLoader loader){
if (api == null)
throw new NullPointerException("api must not be null for HessianProxyFactory.create()");
InvocationHandler handler = null;
handler = new HessianProxy(url, this, api);
return Proxy.newProxyInstance(loader,
new Class[] { api,HessianRemoteObject.class },
handler);
}
那么在客户端调用Hessian服务时候
public Object invoke(Object proxy, Method method, Object []args){
String methodName = method.getName(); // 取得方法名
Object value = args[0]; // 取得传入参数
conn = sendRequest(mangleName, args) ; // 通过该方法和服务器端取得连接
httpConn = (HttpURLConnection) conn;
code = httpConn.getResponseCode(); // 发出请求
// 等待服务器端返回相应…………
is = conn.getInputStream();
Object value = in.readObject(method.getReturnType()); // 取得返回值
}
(2)服务器端接收请求并处理请求
服务器端截获相应请求交给:HessianServiceExporter这个类,这个类的doc文档说明如下:
/**
* Servlet-API-based HTTP request handler that exports the specified service bean
* as Hessian service endpoint, accessible via a Hessian proxy.
**/
开始判断是否是POST请求。然后调用invoke方法:
其中doInvoke里面主要:将输入输出封转化为转化为 Hessian 特有的 Hessian2Input 和 Hessian2Output
然后跳转到:
public void invoke(Object service, AbstractHessianInput in, AbstractHessianOutput out) throws Exception{
ServiceContext context = ServiceContext.getContext();
// 读取方法名
String methodName = in.readMethod();
Method method = getMethod(methodName + "__" + argLength);
//读取方法参数
Class<?> []args = method.getParameterTypes();
//执行相应方法并取得结果
try {
result = method.invoke(service, values);
} catch (Exception e) {
}
}
3、Hessian的序列化和反序列化
Hessian框架提供的序列化方式,在性能上优于java本身的序列化方式。他将对象序列化之后,生成的字节数组的数量要相对于Java自带的序列化方式要更简洁。
有人做过测试:一个UserData类,有一个字符串属性,一个日期属性,一个double属性,分别用java,hessian来序列化一百万次,结果让人吃,,不止是hessian序列化的速度要比java的快上一倍,而且hessian序列化后的字节数也要比java的少一倍。这要归功于它的序列化的实现机制。我们看一下它是如何来实现它的序列化的。
com.caucho.hessian.io这个包是hessian实现序列化与反序列化的核心包。它有如下几个核心类:AbstractSerializerFactory,AbstractHessianOutput,AbstractSerializer,AbstractHessianInput,AbstractDeserializer是hessian实现序列化和反序列化的核心结构代码
(1)AbstractSerializerFactory——一个抽象类,主要定义有序列化和反序列化抽象方法。
其中getSerializer和getDeserializer根据传入的参数类来决定使用哪种序列化和反序列化工具。
核心实现是:SerializerFactory继承AbstractSerializerFactory,而且在SerializerFactory有很多静态map用来存放类与序列化和反序列化工具类的映射,这样如果已经用过的序列化工具就可以直接拿出来用,不必再重新实例化工具类。 这就是hessian比java序列化性能高的原因。
2个静态大Map定义如下:
private static HashMap _staticSerializerMap;  
private static HashMap _staticDeserializerMap;  
然后它有一个addBasic函数用来给Map中存放需要序列化的类
然后把序列化后的对象在放入一个最终HashMap中。
private ConcurrentHashMap _cachedSerializerMap; //最终的HashMap
this.loadSerializer(cl)是序列化的具体实现。根据不同的需要被序列化的类来获得不同的序列化工具,数了一下,一共有17种序列化工具,hessian为不同的类型的java对象实现了不同的序列化工具,默认的序列化工具是JavaSerializer 。查看源码就很清楚了。
hessian序列化机制的性能比较:网上收集,没有实际测过
序列化数据对比:
bytes字节数对比

Hessian庖丁解牛相关推荐

  1. Hessian源码分析(java)

    个人博客: 戳我,戳我 先扯一扯 前一篇博文Hessian通信案例(java)简单实现了Java版的Hessian客户端和服务端的通信,总体看来,实现起来比较简单,整个基于Hessian的远程调用过程 ...

  2. Hessian通信案例(java)

    个人博客: 戳我,戳我 前言 由于工作的原因,接触到了hessain,项目需要做hessain和xml之间的报文转换.但是对于hessian是个什么东西一头雾水.于是接下来的时间了解了hessain协 ...

  3. AI领域真正最最最最最稀缺的人才是……会庖丁解牛的那个人

    图片来源:Wired [AI科技大本营导读]这里,就不卖关子了.AI领域最最最最最稀缺的人才应该为人工智能架构师.有过4次技术创业经历,如今做AI投资的星瀚资本创始合伙人杨歌如是说. 在杨歌的身上,传 ...

  4. 化繁为简,一张图看懂梯度、散度、旋度、Jacobian、Hessian和Laplacian

    来源|王赟 Maigo@知乎,https://zhuanlan.zhihu.com/p/35323714 本文仅作学术分享,如有侵权,请联系后台作删文处理. 一.入门 图中的细实线箭头表示了四种一阶微 ...

  5. Hessian矩阵在XGBoost算法的应用小结

    来源:机器学习算法那些事本文约1100字,建议阅读5分钟 本文深入浅出的总结了Hessian矩阵在XGboost算法中的两种应用,即权重分位点算法和样本权重和算法 . 前言 Hessian矩阵最常见的 ...

  6. Spring整合Hessian

    Spring整合Hessian from:http://lavasoft.blog.51cto.com/62575/191871 Spring让Hessian变得不但强大,而且易用,但是易用背后,却有 ...

  7. 跨语言RPC框架Hessian、Thrift、Protocol Buffer之间的选择

    为什么80%的码农都做不了架构师?>>>    总结在几者之间选择的考量: 1. 如果你不需要很多语言相互调用, 希望保持清晰的java接口代码(无任何业务不相关的接口继承和方法,属 ...

  8. RMI、Hessian、Burlap、Httpinvoker、WebService的比较

    RMI.Hessian.Burlap.Httpinvoker.WebService的比较 标签: webserviceservice数据结构spring通讯java 2011-08-24 16:46 ...

  9. Hessian RPC示例和基于Http请求的Hessian序列化对象传输

    本文主要介绍两个案例,第一个是使用Hessian来实现远程过程调用,第二个是通过Hessian提供的二进制RPC协议进行和Servlet进行数据交互,Hessian本身即是基于Http的RPC实现. ...

最新文章

  1. Django06:视图层/上传文件/request 方法补充/FBV与CBV
  2. Visual Studio下的PHP开发工具VS.PHP初探
  3. linux重定向到程序,技术|Linux I/O 重定向基础
  4. fiddler网站请求被拦截怎么恢复?
  5. sys.argv学习,通过运行py脚本,手动传入参数
  6. 基于matlab的捷联惯导算法编程(一)
  7. 强势入局,区块链专利将成为银行下一个战场?
  8. Pytorch Gradient Checkpoint使用示例
  9. ORACLE介质管理库MML
  10. Spring系列之静态代理、动态代理、cglib代理与Spring AOP的处理
  11. Linux IO体系、零拷贝和虚拟内存关系的重新思考
  12. 一个近乎完美的 Unity 全平台热更方案
  13. xp系统共享打印机服务器不可用,那种方式能够解决WinXP访问Win10共享打印机指定网络不可用的问题?...
  14. 【大数据开发】SparkStreaming——DStream输入源、原语、SparkStream与Kafka和Redis三者的交互
  15. matlab对矩阵自相关,自相关矩阵和互相关矩阵的matlab实现
  16. 程序员的十层楼及读后感
  17. 过来看~/(≧▽≦)/~啦啦啦!!各种书本课后答案!——第二部分:【化学物理】
  18. 尼玛,刚聊完就弹窗推荐,这些 APP 是在偷听吗?
  19. 深入理解--ES之倒排索引
  20. Linux第一课 了解Linux

热门文章

  1. 让CORTANA实现关机,打开你想要打开的应用程序
  2. 在Ubuntu上安装最新版本的Handbrake
  3. SHI借助Cloud Cruiser公司扩展其IaaS平台
  4. 【原创】项目估算-项目管理MSN群线上讨论(2009.6.30)
  5. 狂神网络编程学习笔记
  6. 如何用剪贴蒙版实现字体渐变
  7. IP65是什么意思?什么是IP等级?
  8. hdu 1069 Monkey and Banana dp
  9. java怎么做qq的聊天气泡_qq聊天气泡怎么自定义
  10. 附全文下载 |《数字中国指数报告2019》重磅发布!!