Hessian简要入门
原本系统之间通信采用Restful Web Service,但其中没有考虑安全性问题,因此决定使用稍微复杂点的二进制协议,Hessian服务。
Hessian是一个轻量级的Remoting On HTTP工具,使用简单的方法提供了RMI的功能,相比Web Service,Hessian更简单,快捷,采用的是二进制RPC协议。
Hessian处理过程的简要流程:
客户端 - 序列化写到输出流 - 远程方法(服务器端) - 序列化写到输出流 - 客户端读取输入流 - 输出结果
Hessian通过Servlet提供远程服务,需要将匹配某个模式的请求映射到Hessian服务。如果集成到Spring中,可以通过DispatcherServlet完成此功能,DispatcherServlet可以将匹配模式的请求转发到Hessian服务。
<servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring-mvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
配置web.xml,将任意请求都映射到该Dispatcher中。
首先,使用SimpleUrlHandlerMapping,制定对应的service URL,和对应的服务接口,服务实现:
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="order" value="100"/> <property name="urlMap"> <map> <entry key=“/remote/xxxService" value-ref="diabloService"/> </map> </property> </bean> <bean id="diabloService" class="org.springframework.remoting.caucho.HessianServiceExporter"> <property name="service" ref="diabloTaskService"/> <property name="serviceInterface" value="com.xxxx.IXXXTaskService"/> </bean> <bean id="diabloTaskService" class="com.xxxx.framework.hessian.XXXTaskServiceImpl"/>
在客户端和服务端之间,需要共享服务接口对象以及接口中使用的对象,注意自定义的对象由于要进行二进制传输,必须要实现java.io.Serializable接口。比较好的方式使用一个公用的maven私服,这样就可以避免接口改动造成的频繁jar包传输。
在客户端中,需要知道Hessian服务对应的Url,这个是通过上面所说的service url以及服务器地址,端口得到的。
客户端方面的方法也比较简单,通过Url得到对应的服务代理,来进行下一步操作:
HessianProxyFactory factory = new HessianProxyFactory(); try { String url = "http://127.0.0.1:8888/remote/xxxService"; IXXXTaskService xxxTaskService = (IXXXTaskService) factory.create(IXXXTaskService.class, url); XXXResultStatus status = xxxTaskService.submitTask("211", contentBuilder.toString()); System.out.println(status); } catch (MalformedURLException e) { e.printStackTrace(); }
如果服务已经启动,那么该服务肯定执行成功。
在Spring中调用Hessian服务也非常简单和容易,只需要在任务中新建一个HessianProxyFactoryBean,并指定对应的服务url和服务接口即可。
<bean id="testHessianService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean"> <property name="serviceUrl" value="http://localhost:8888/spring2/hessian/hessianService"/> <property name="serviceInterface" value="com.cjm.webservice.hessian.HessianService"/> </bean>
Hessian 是由 caucho 提供的一个基于 binary-RPC 实现的远程通讯 library,基于 Binary-RPC 协议实现,需通过 Hessian 本身提供的 API 来发起请求,Hessian 通过其自定义的串行化机制将请求信息进行序列化,产生二进制流,Hessian 基于 Http 协议进行传输,响应端根据 Hessian 提供的 API 来接收请求,Hessian 根据其私有的串行化机制来将请求信息进行反序列化,传递给使用者时已是相应的请求信息对象了,处理完毕后直接返回, hessian 将结果对象进行序列化,传输至调用端。