Hessian和Burlap都是基于HTTP的,解决了RMI头疼的防火墙问题。并且它们都是非常轻量级的,足以在内存或空间受限制的环境下使用,例如applet和无线设备。
Hessian是基于二进制码的传输方式,Burlap是基于XML的传输方式,前者在网络传输的上具有优势,后者在没有实现Hessian(JAVA)语言或可读性上更具优势。
废话不多,最关心的是怎么配置,既然有spring做框架,就舍弃配置繁琐的纯Hessian和Burlap的方式。这两者的配置方式是大同小异的。需要导入两个包dist/modules/spring-webmvc.jar和/lib/caucho/hessian.jar
主要是配置文件,服务的话随便写接口方法即可。由于是基于http,必须起web服务,通过spring的mvc适配器把请求转发给hessian和burlap。
服务器端web.xml
<!-- 赋给servlet的名字很重要,他是被dispatcherservlet用来定位Spring配置文件,
而且,路径应该是/WEB-INF/...
-->
<servlet>
<servlet-name>hessian</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>hessian</servlet-name>
<url-pattern>/hessian.service</url-pattern>
</servlet-mapping>
<!-- Burlap的配置是类似的 -->
<servlet>
<servlet-name>burlap</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>burlap</servlet-name>
<url-pattern>/burlap.service</url-pattern>
</servlet-mapping>
hessian-servlet.xml和burlap-servlet.xml极其雷同
<!-- 服务 -->
<!-- hessian是基于Http的二进制码传输的轻量级框架 -->
<bean id="hessianExporter" class="org.springframework.remoting.caucho.HessianServiceExporter">
<!-- 服务 -->
<property name="service" ref="myService"/>
<!--hessian没有类似rmi服务注册表,不需要用服务名注册, -->
<!-- 绑定服务的路径 -->
<property name="serviceInterface" value="org.spring.rmi.yoara.MyService"/>
</bean>
<!-- 2.5.6版本相应的jar包在dist/modules/spring-webmvc -->
<bean id="hessianMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hessian.service">hessianExporter</prop>
</props>
</property>
</bean>
<!-- 因为hessianExporter在SpringMVC里面作为一个controller实现的,所以还需要在web.xml中配置 -->
burlap现在已经集成到hessian.jar中,不作为一个单独的项目了
<bean id="myService" class="org.spring.rmi.yoara.MyServiceImpl"/>
<!-- burlap是基于xml传输的轻量级框架 -->
<bean name="burlapExporter" class="org.springframework.remoting.caucho.BurlapServiceExporter">
<!-- 服务 -->
<property name="service" ref="myService"/>
<!-- 绑定服务的路径 -->
<property name="serviceInterface" value="org.spring.rmi.yoara.MyService"/>
</bean>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/burlap.service">burlapExporter</prop>
</props>
</property>
</bean>
完了,服务器端只需要配置文件,和简单的service类即可,如代码中myService。
客户端,用spring配置的方式
<!-- 服务URL -->
<property name="serviceUrl" value="http://localhost:8080/SpringServer/hessian.service"/>
<!-- 本地接口路径 -->
<property name="serviceInterface" value="org.spring.rpc.yoara.MyService"/>
</bean>
注意hessian.service这个是在服务器端配置的映射路径,其实就是servlet差不多。客户端有相应的服务接口就成了。
但当序列化RPC消息发来的对象时,RMI就把Hessian和Burlap打败了,因为Hessian和Burlap都是采用了自己的私有的序列化机制,而RMI是使用的JAVA本身的序列化机制,如果你的数据模型非常复杂,Hessian/Burlap的序列化模型可能就不够用了。
一个两全齐美的方法就是SPring的HTTP invoker,他在HTTP之上提供了RPC(Hessian/Burlap),同时使用了Java的对象序列化机制(RMI)。
其实invoker的配置和前面一模一样的,就是更改了Exporter。不用看了。
<!-- 服务 -->
<property name="service" ref="myService"/>
<!-- 绑定服务的路径 -->
<property name="serviceInterface" value="org.spring.rmi.yoara.MyService"/>
</bean>
<!-- 2.5.6版本相应的jar包在dist/modules/spring-webmvc -->
<bean id="invokerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/invoker.service">invokerExporter</prop>
</props>
</property>
</bean>
web.xml配置
<!-- invoker的配置也是类似的 -->
<servlet-name>invoker</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/invoker.service</url-pattern>
</servlet-mapping>