一、Spring 远程调用概览
1、把一个应用的某些可用功能发布为远程服务并提供给其他应用来使用,我们需要将这个应用接口的基本功能发布为远程服务。
2、spring 支持几种不同的RPC模型 包括
rmi,不考虑网络限制时,访问/发布基于java的服务(很难穿越防火墙,这是因为rmi使用任意端口来交互)
hessian,burlap, 考虑网络限制时,通过http访问/发布基于java的服务
http invoker,考虑网络限制,并希望使用基于xml 或专有的java序列化机制时,访问/发布基于spring的服务
jax-rpc 和 jax-ws 访问/发布平台中立的,基于soap的web服务。
3、所有的模型中,远程服务被代理,所以他们能够像其他spring bean 一样被装配到客户端代码中。远程调用会抛出remoteAccessException 异常。
二、使用RMI
(1)配置RMI服务: RmiServiceExporter 可以将任意一个Spring管理的Bean发布为RMI服务。RmiServiceExporter通过将一个bean 包装到服务适配中,并将服务适配器绑定到RMI注册表中。从而将POJO转换为RMI服务。
<bean class = "org.springframework.remoting.rmi.RmiSeriviceExporter"
p:service-ref = "spitterService"
p:serviceName = "SpitterService"
p:serviceInterface = "接口全命名"
p:registryHost = “rmi.spitter.com”
p:registryPort = "1199" />
(2) 装配RMI
Spring的RmiProxyFactoryBean是一个工厂bean,该bean可以为rmi服务创建代理。使用RmiProxyFactoryBean引用一个SpitterService的RMI服务是非常简单的
<bean id = "spitterService" class = "org.springframework.remoting.rmi.RmiProxyFactoryBean" p:serviceUrl = "rmi://localhost/spitterService"
p:serviceInterface = "com.habuma.spitter.service.SpitterService">
三、使用hessian 和 burlap 发布远程服务 : 是基于http的轻量级远程服务解决方案。hession的消息是二进制的,而burlap的消息是xml。
四、使用spring的httpinvoker ,由于rmi使用java标准的对象序列化机制,但是很难穿透防火墙。而hession和burlap能很好地穿透防火墙,但是使用私有的对象序列化机制。
1、把bean导出为http invoker服务,我们需要使用httpinvokerserivceExporter
<bean id=httpInvokerSpitterService class = "org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter"
p:service-ref = "spitterService"
p:serviceInterface="com.habuma.spitter.service.SpitterService">
2、httpinvokerserivceeExporter 是一个Spring MVC控制器,它通过DispatcherServlet接收来自于客户端的请求,并将这些请求转换成对实现服务的pojo的方法调用。所以我们需要建立一个url处理器。映射http url到对应的服务器上。
<bean id = "urlMapping" class = "org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name = "mappings">
<value>
/spitter.service = httpInvokerSpitterService
</value>
</property>
</bean>
五、发布和使用Web服务(使用spring对JAX-WS的支持来把Spitter服务发布为web服务并使用此web服务),使用jax-ws 服务导出器创建一个web服务,spring提供一个jax-ws服务导出器
1: 在spring 中 自动装配 jax-ws 端点
jax-ws编程模型使用注解将类和类的方法声明为web服务的操作。使用@webservice 注解所标注的类被认为web服务的端点,而使用@webmethod注解所标注的方法。但必须继承springbeanautowiringsupport
2: 导出独立的jax-ws 端点 :
3: 在客户端代理jax-ws服务 :
使用spring发布的web服务与我们使用rmi,hessian,buralp和http invoker 发布服务是完全不同的。
但使用spring 访问web 服务所涉及的客户端代理的工作方式与基于spring的客户端使用其他远程调用技术是相同的。
使用JaxWsPortProxyFactoryBean , 我们可以在spring中装配spitter web 服务, 就像其他bean一样。 jaxwsportproxyfactorybean 是一个spring 工厂bean 。 它生成一个与soap web 进行交互的代理。