Hessian体验与分析【面试+工作】

简介

Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能;相比WebService,Hessian更简单、快捷。

官网地址:http://hessian.caucho.com/index.xtp

下面主要针对Hessian入门级使用,以及进行部门源码分析。

简单使用

提供三个模拟块,分别模拟client,server以及被依赖的jar;对应的模块名称分别是:hessianClient,hessianServer以及hessianJar

代码结构如下图所示:

1.hessianJar介绍

hessianJar主要提供被hessianClient和hessianServer依赖的公共类,这里主要提供了接口类IHessianService和pojo对象Bean

IHessianService类:

对象Bean:

2.hessianSever介绍

hessianServer主要用来对外提供服务的,因为hessian本身是基于http协议的,所以可以直接部署到web容器中比如tomcat,http协议解析可以直接交给web容器;当然这里hessianServer本身是一个web项目,除了对外提供的服务类HessianServiceImpl,还需要配置web.xml文件。

web.xml:

服务类HessianServiceImpl:

3.hessianClient介绍

hessianClient模拟客户端的调用,对hessianSever发起请求,并且接受回复;提供HessianClient类

HessianClient:

部署测试

1.首先将hessianJar打包安装,maven命令:clean install

2.将hessianServer打包发布,maven命令:clean package,然后部署到tomcat中,启动tomcat

3.将hessianClient打包运行,maven命令:clean package,然后运行HessianClient类

结果如下:

hessianClient流程分析

1.代理类HessianProxy

很多开源的RPC框架,用来实现远程方法调用,其实核心思想都是动态代理,代理类封装了对消息的序列化,远程的连接以及消息的接受,Hessian也不列外,提供了HessianProxy类,部分代码如下:

HessianProxy实现了invoke方法,这样每次在调用方法(如:hessianService.getString(“zhaohui”))时,自动触发invoke方法,这样我们就可以封装方法和请求参数,建立http请求(sendRequest方法),接受响应(getInputStream方法)。

2.http请求类

既然Hessian本身是基于http协议的,对http的请求我们会想到HttpURLConnection类,Hessian也不例外,只是被包装成了HessianConnection类,代码结构如下:

里面提供了一些常用的方法,添加http头文件addHeader(),获取输出流getOutputStream(),获取输入流getInputStream()等;

3.发送请求

有了HessianConnection就可以发送http请求了,HessianProxy中提供了sendRequest方法,部分代码如下:

首先在请求中添加了http请求头分别是:Content-Type,Accept-Encoding以及Authorization,如下所示:

然后通过OutputStream向服务器发送请求,Hessian把OutputStream封装在HessianOutput中,所以可以查看HessianOutput中call方法,部分代码如下:

首先是写入方法名称,如何写入方法参数,最后完成写入标识,

(1).startCall方法如下:

前三个自己分别写入了c major minor,后面写入自己m表示开始写入方法信息,包括长度和字符串信息;

(2).写入方法参数,遍历args[]使用writeObject写入,主要是对参数进行序列化操作,核心类Serializer,Hessian会根据参数的类型使用不同的序列化,具体有哪些类型可以查看包com.caucho.hessian.io中实现实现了Serializer的类;

(3).最后写入结束标识,写入了字符’z’。

发送请求通过out.flush()方法,至此大概是客户端请求的整个流程,下面介绍一下服务器接受消息,处理消息以及回复消息

4.服务器端接受消息

web.xml中配置了处理消息的servlet:HessianServlet,并且配置了真实处理业务逻辑的api和class类,HessianServlet继承了两个核心的方法init和service,分别用来初始化数据和处理业务逻辑。

init()方法

init方法中加载了配置在web.xml中的HessianServiceImpl和IHessianService,并且封装到HessianSkeleton中

service()方法

通过HttpServletRequest和HttpServletResponse对象分别获取了我们需要的输入和输出流,如下:

InputStream is = request.getInputStream();

OutputStream os = response.getOutputStream();

接下来把InputStream和OutputStream传入HessianSkeleton中,消息的读取和回复都交给HessianSkeleton来处理

HessianSkeleton的invoke方法:

又进一步的将Inputstream封装入HessianInput中,将Outputstream封装入Hessian2Output中;

最下面的invoke(_service, in, out)方法是服务器处理最重要的地方,按照Client中输出流的写入格式,通过Inputstream将Client写入的消息读取出来包括头字节信息,方法名,参数列表,部分代码如下:

(1).首先通过方法skipOptionalCall()跳过了输入流中的前几个字节,接下来获取了MethodName,还有方法参数存放在了Object []values中;

(2).接下来就是result = method.invoke(service, values);反射调用,获取到我们需要的result

(3).out.writeReply(result),通过Hessian2Output回复消息,代码如下:

回复消息也指定了对应的格式,消息头+消息体+消息结束标识,具体内容可以自行去查看。

5.Client接受服务器的回复

再次回到Client端,在介绍HessianProxy类的时候提到了两个主要的方法分别是:sendRequest发送消息,getInputStream获取输入流,通过输入流来获取服务器端的回复。

同样的Inputstream也被封装成了Hessian2Input对象,通过Hessian2Input的readReply获取回复,和服务器读取客户端消息类似,此处不在详细介绍,可以直接查看readReply方法

总结

本文通过hessianJar,hessianClient已经hessianServer三个模块,提供了简单的入门实例;然后从代码层面介绍了整个消息的流程,从创建代理类HessianProxy到提供http连接的HessianConnection,然后发送http请求到服务器端接受http请求,反射调用业务逻辑类获取处理结果,然后封装消息回复Client,最后Client接受消息,输出消息;当然代码层面的介绍还是比较笼统的,很多细节还需要进一步了解。

原文发布于微信公众号 - Java帮帮(javahelp)

原文发表时间:2018-10-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏塔奇克马敲代码

Windows环境下的RTKPlot_Qt版本编译时遇到的问题和解决方法

1855
来自专栏坚毅的PHP

my linux FAQ

用命令查询系统是32位还是64位 getconf LONG_BIT or getconf WORD_BIT 例如: [root@sy02 /]# getconf...

3513
来自专栏北京马哥教育

零基础用Python | 实现12306火车票实时查询

大家都用过12306,今天我们来学习写一个Python程序,要求在命令行敲一行命令来获得你想要的火车票信息。 1 接口设置 先给这个小应用起个名字吧,既然及查询...

3329
来自专栏云计算教程系列

如何在Debian 9上使用mod_rewrite为Apache重写URL

Apache的mod_rewrite模块允许您以更干净的方式重写URL,将人类可读的路径转换为代码友好的查询字符串。它还允许您根据条件重写URL。

1724
来自专栏Java帮帮-微信公众号-技术文章全总结

集群间如何实现session共享【面试+工作】

3.7K8
来自专栏跟着阿笨一起玩NET

asp.net中使用swfupload上传大文件

转载:http://www.cnblogs.com/niunan/archive/2012/01/12/2320705.html

1224
来自专栏北京马哥教育

ElasticSearch ——单台服务器部署多个节点

一般情况下单台服务器只会部署一个 ElasticSearch node,但是在学习过程中,很多情况下会需要实现 ElasticSearch 的分布式效果,所以需...

1410
来自专栏玄魂工作室

Hacker基础之Linux篇:基础Linux命令五

1. vi vi命令是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器。 Linux中一般默认安装的的编辑器叫vi,而vim是vi的增强版(vi...

2856
来自专栏从零开始学自动化测试

python测试开发django-1.开始hello world!

当你想走上测试开发之路,用python开发出一个web页面的时候,需要找一个支持python语言的web框架。django框架有丰富的文档和学习资料,也是非常成...

1863
来自专栏张善友的专栏

Service Fabric 与 Ocelot 集成

云应用程序通常都需要使用前端网关,为用户、设备或其他应用程序提供同一个入口点。 在 Service Fabric 中,网关可以是任意无状态服务(如 ASP.NE...

2473

扫码关注云+社区

领取腾讯云代金券