简介
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方法,这样每次在调用方法)时,自动触发invoke方法,这样我们就可以封装方法和请求参数,建立http请求,接受响应。
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方法,部分代码如下:
首先是写入方法名称,如何写入方法参数,最后完成写入标识,
.startCall方法如下:
前三个自己分别写入了c major minor,后面写入自己m表示开始写入方法信息,包括长度和字符串信息;
.写入方法参数,遍历args[]使用writeObject写入,主要是对参数进行序列化操作,核心类Serializer,Hessian会根据参数的类型使用不同的序列化,具体有哪些类型可以查看包com.caucho.hessian.io中实现实现了Serializer的类;
.最后写入结束标识,写入了字符’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方法是服务器处理最重要的地方,按照Client中输出流的写入格式,通过Inputstream将Client写入的消息读取出来包括头字节信息,方法名,参数列表,部分代码如下:
.首先通过方法skipOptionalCall跳过了输入流中的前几个字节,接下来获取了MethodName,还有方法参数存放在了Object []values中;
.接下来就是result = method.invoke;反射调用,获取到我们需要的result
.out.writeReply,通过Hessian2Output回复消息,代码如下: