概述:
- 访问和发布RMI服务
- 使用Hessian和Burlap服务
- 使用Spring的HTTP invoker
- 使用Spring开发Web服务
RPC模型 (Remote Procedure call)
RMI: 不考虑网络限制时(例如防火墙),访问/发布基于Java的服务 (两端全是java程序)
Hessian或 Burlap: 考虑网络限制时,通过HTTP访问/发布基于Java的服务。Hessian是二进制协议,而Burlap是基于XML的(语言不限)
HTTP invoker : 考虑网络限制,并希望使用基于XML或专有的序列化机制实现Java序列化时,访问/发布基于Spring的服务
JAX-RPC和JAX-WS :访问/发布平台独立的、基于SOAP的Web服务
调用过程
客户端-》代理-》服务端
1、使用RMI
1.1、发布RMI接口:
使用Spring不需要理会java.rmi.RemoteException
调用过程: RmiServiceExporter ->RMI 服务适配器->RMI注册表
默认绑定端口1099
1.2、客户端调用:
通过RmiProxyFactoryBean生成RMI代理对象与服务端进行交互
RMI的缺点: 难穿防火墙、两端都是java开发、如果序列化保证相同版本
2、使用Hessian和Burlap发布远程服务
与RMI最大不同,不要求服务端一定为java程序
Hessian:基于二进制 交互 性能高
Burlap:基于XML交互 可读性好
2.1、发布服务
首先继承com.caucho.hessian.server.HessianServlet类
Hessian:的过程
DispatcherServlet->HessianServiceExporter->具体实现类
DispatcherServlet 如何将URL转发给Hessian 通过 SimpleUrlHandleMapping
@Bean
public HandlerMapping hessianMapping(){
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
Properites mappings = new Properties();
mappings.setProperty("/spitter.service", "hassianExportedSpitterService");
mapping.setMappings(mappings);
return mapping;
}
Burlap:的过程
DispatcherServlet->BurlapServiceExporte->具体实现类
与Hessian类似
2.2 调用服务
代理beanFactory : HessianProxyFactoryBean 、BurlapProxyFactoryBean
优点:不惧防火墙
缺点:数据模型不能太复杂
3、使用Spring的HttpInvoker
修复RMI防火墙的缺点
HttpInvokerServiceExporter :过程类似Hessian,也是通过SimpleUrlHandlerMapping 将URL转发
缺点:两边必须为Spring应用程序
4、发布和使用Web服务
SOA(面向服务的架构)
Spring为使用Java API for XML Web Service(JAX-WS)
包装:SimpleJaxWsServiceExporter
SimpleJaxWsServiceExporter要求JAX-WS运行时支持将端点发布到指定地址上。Sun JDK 1.6自带的JAX-WS可以符合要求,但是其他的JAX-WS实现,包括JAX-WS的参考实现,可能并不能满足此需求。
采用注解:@WebService 和 @WebMethod
SpringBeanAutowiringSupport很有用。在合适场景下,还是可以把Spring管理的bean导出为JAX-WS端点的。
需要用到WSDL标签