本文中的使用Hessian和Burlap发布远程服务以及使用Spring的HTTPInvoker发不远程服务测试失败。最常用的应该是使用JAX-WS,也就是WebService。
调用远程服务使用的比较多的应该是WebService吧。但是远程调用技术并不仅仅只有WebService。还包括:
- 远程方法调用(Remote Method Invocation,RMI)
- Caucho的Hessian和Burlap
- Spring基于HTTP的远程服务
- 使用JAX-RPC和JAX-WS的Web Service
一、远程调用简介
1、远程调用是客户端和服务端的会话。有时在客户端所需要的一些功能并不在客户端是实现范围之内,此时需要寻求其他系统的帮助,而远程应用就需要通过远程服务暴露这些功能接口。
2、客户端和服务端的会话开始于客户端的一个远程过程调用(remote procedure call,RPC)。在客户端调用时,从表面上看就像调用本地方法一样。
3、RPC调用就是执行流从一个应用传递到另一个应用,理论上另一个应用部署在跨网络的一台远程机器上。
RPC模型 | 适用场景 |
远程方法调用(RMI) | 不考虑网络限制时(例如防火墙),访问/发布基于java的服务 |
Hessian和Burlap | 考虑网络限制时,通过HTTP访问/发布基于Java的服务,Hessian是二进制协议,Burlap是基于XML的 |
HTTP invoker | 考虑网络限制,并希望使用基于XML或专有的序列化机制实现Java序列化时,访问/发布基于Spring的服务 |
JAX-RPC和JAX-WS | 访问/发布平台独立的、基于SOAP的Web服务 |
二、使用RMI
在Spring中使用RMI很简单,注入RmiServiceExporter即可,RmiServiceExporter可以把任意Spring管理的bean发布为RMI服务。
服务端发布服务(使用XML配置,使用Java配置这里就不做记录了,照着XML就可以实现):
<bean id="tuserDao" class="com.mfc.dao.TuserDaoImpl"></bean>
<!--
service:要发布的bean的id
serviceName:命名了RMI服务
serviceInterface:指定服务所实现的接口
registryPort:注解端口号,客户端调用时访问这个端口号
registryHost:主机上的RMI注册表
-->
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="service" ref="tuserDao"></property>
<property name="serviceName" value="TuserDao"></property>
<property name="serviceInterface" value="com.mfc.dao.TuserDao"></property>
<property name="registryPort" value="8082" />
</bean>
服务端要发布的服务接口:
public interface TuserDao {
@CachePut(value = "tUserCache", key = "#result.userId")
public Tuser add(Tuser tuser);
public void delete(Tuser tuser);
public Tuser update(Tuser tuser);
/**
* 查询User,并将查询结果放进tUserCache缓存中
* @param tuser
* @return
*/
@Cacheable("tUserCache")
public List<Tuser> find(Tuser tuser);
/**
* 根据ID查询用户,并将查询结果放进tUserCache缓存中
* @param userId
* @return
*/
@Cacheable(value = "tUserCache", unless = "#result.message.contains('NoCache')", condition = "#userId == '10'")
public Tuser findByPrimary(String userId);
}
发布服务接口的实现类:
package com.mfc.dao;
import java.util.List;
import org.hibernate.Session;
impo