简介
Hessian 是 caucho 公司提供的开源协议,基于 HTTP 传输的二进制的 RPC 协议,轻量级的远程调用框架。
因为采用的是二进制协议,所以它很适合于发送二进制数据。
服务端不用开防火墙端口,具有较好的穿墙能力。
协议的规范公开,可以用于任意语言。
基于 Hessian 的项目开发时
服务器端必须具备以下几点:
- 包含 Hessian 的 jar 包
- 设计一个接口,用来给客户端调用
- 实现该接口的功能
- 配置 web.xml,配好相应的 servlet
- 由于使用二进制 RPC 协议传输数据,对象必须进行序列化,实现 Serializable 接口
- 对于复杂对象可以使用 Map 的方法传递
客户端必须具备以下几点:
- 包含Hessian.jar的包。
- 具有和服务器端结构一样的接口。包括命名空间都最好一样
- 利用 HessianProxyFactory 调用远程接口。
加入的 jar 包:
hessian-core-2.1.12.jar
服务端
application-actions.xml:
<beans>
<description>导出App服务的对Web提供的Action</description>
<!-- 定义模块的Service -->
<bean id="applicationAction" class="com.mes.framework.core.action.impl.ApplicationAction">
<!-- 这个ApplicationAction能够访问的action的列表 -->
<property name="actions">
<list>
……
</list>
</property>
</bean>
<!-- 暴露发布服务 -->
<bean name="/serviceExporter" class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="serviceInterface">
<value>com.mes.framework.core.action.Action</value>
</property>
<!-- 接口实现 -->
<property name="service">
<ref bean="applicationAction" />
</property>
</bean>
</beans>
web.xml:
<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext-actions.xml,<!-- 导出服务的配置文件 -->
...
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>remoting</servlet-name>
<url-pattern>/remoting/*</url-pattern>
</servlet-mapping>
客户端:
application-web-common.xml:
<bean id="memberDispatcher" class="com.mes.framework.core.remoting.client.support.HessianDispacher">
<property name="controller">
<ref local="memberApplicationController" />
</property>
</bean>
<!-- Hessian代理工厂 -->
<bean id="memberApplicationController"
class="com.mes.framework.core.remoting.caucho.MesHessianProxyFactoryBean">
<property name="serviceUrl">
<!-- properties文件: http://localhost:88/d2shop-member-app/remoting/serviceExporter
!!!-->
<value>${member.app.url}</value>
</property>
<property name="serviceInterface">
<value>com.mes.framework.core.action.Action</value>
</property>
<property name="txnIDGenerator">
<ref local="TxnIdGenerator" />
</property>
<property name="username">
<value>${principal}</value>
</property>
<property name="password">
<value>${credentials}</value>
</property>
</bean>
调用:
ControllerUtils 工具类:
部分代码:
public static Map<Object, Object> excute(String requestServiceId,
Map<Object, Object> condition, Dispatcher dispatcher) throws Exception {
if (!requestServiceId.isEmpty() && dispatcher != null) {
ServiceRequest serviceRequest = new ServiceRequest();
serviceRequest.setRequestServiceId(requestServiceId);
serviceRequest.setRequestObject(condition);
return dispatcher.dispatcheService(serviceRequest).getModel();
}
return null;
}
Controller:
部分代码:
public class BusinessActionMultiController{
@Resource
private Dispatcher memberDispatcher;
public ModelAndView ajaxRestPayPassword(HttpServletRequest request, HttpServletResponse response) throws Exception {
PrintWriter out = ControllerUtils.getPrintWriter(response, logger, "------------BusinessActionMultiController.ajaxRestPassword start------------");
try {
SessionUser su = SessionUser.getSessionUser(request);
Map<Object, Object> condition = new HashMap<Object, Object>();
String rs = "1";
String bid = StringUtil.trim(request.getParameter("bid"));
if (su != null && StringUtil.hasText(bid)) {
condition.put("bid", bid);
condition.put("op", "ajaxRestPayPassword");
Map<Object, Object> model = ControllerUtils.excute("kzBusinessAction",
condition, getMemberDispatcher());
rs = StringUtil.trim(model.get("state"));
}
out.print(rs);
return null;
} catch (Exception e) {
logger.error(e);
return new ModelAndView("error", "error_view", "BusinessActionMultiController.ajaxRestPassword error...");
}
}
}
比较
协议的通讯效率依次为:RMI > Httpinvoker >= Hessian >> Burlap >> web service