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配置文件,
由于这个servlet的名字叫hessian,所以这个配置文件必须叫hessian-servlet.xml,([servelt-name]-servlet.xml)
而且,路径应该是/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极其雷同
<!-- 服务 -->
<
bean
id
="myService"
class
="org.spring.rmi.yoara.MyServiceImpl"
/>
<!--
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中,不作为一个单独的项目了
<!--
服务 ,需要引入/lib/caucho/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配置的方式
<
bean
id
="goService"
class
="org.springframework.remoting.caucho.HessianProxyFactoryBean"
>
<!--
服务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。不用看了。
<
bean
id
="invokerExporter"
class
="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter"
>
<!--
服务
-->
<
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
>
<
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
>
好,除了EJB,剩下的就是soap方式的webservice了。xfire都是耳熟能详,下次再说。