Spring发布JAVA最初的远程调用技术—RMI
1.在Spring中配置RMI服务
我们创建的RMI服务需要发布SpritterService接口中的方法,如下展示了该接口的定义
//定义一个需要被远程调用的接口
public interface SpitterService{
List<Spittel> getRecentSpitter(int count);
List<Spittel> getAllSpitter(int count);
void deleteSpitter(long id);
......其他方法
}
RmiServiceExporter 可以把任意Spring管理的bean发布为RMI服务。
在使用RmiServiceExporter将SpitterServiceImpl发布为RMI最简单的方式是在Spring中使用下面的方式
//将SpitterService发布为RMI远程调用接口
@Bean
public RmiServiceExporter rmiExporter (SpitterService spitterService){
RmiServiceExporter rmiExporter = new RmiServiceExporter ();
rmiExporter.setService(spitterService);
rmiExporter.setServiceName("spitterService");
rmiExporter.setServiceInterface(SpitterService.class );
rmiExporter.setServiceHost("rmi.spitter.com" );//设置网络服务主机地址
rmiExporter.setServicePort(1199 );//设置端口号
return rmiExporter;
}
这里会把spitterService bean设置到service属性中,表明RmiServiceExporter要把该bean发布为一个RMI服务。setServiceName属性命名RMI服务,setServiceInterface属性指定此服务所实现的接口。
默认情况下RmiServiceExporter会尝试绑定到本地机器的1099端口,即localhost:1099 。如果希望绑定到不同端口或者主机上,可以通过setServiceHost 设置主机和setServicePort设置端口号。
以上我们就将spitterService已经导出为RMI服务。下面让我们看一下该如何编写spitterService RMI的客户端。
2.客户端装配RMI服务
使用SpringRmiProxyFactroyBean引用spitterService的RMI服务是非常简单的,只要在客户端的Spring配置中增加如下的方法:
@Bean
public RmiProxyFactoryBean spitterService(){
RmiProxyFactoryBean rmiProxy = new RmiProxyFactoryBean();
rmiProxy .setServiceUrl("rmi://localhost/SpritterService");
rmiExporter.setServiceInterface(SpitterService.class );
return rmiProxy ;
}
现在我们就可以把spitterService作为客户端本地的bean一样进行管理。可以把它作为依赖装配进另外的bean中。例如客户端需要使用spitterService为指定用户获取Spitter列表,我们可以使用@Autowired注解把服务装配到客户端中。
@Autowired //自动装配bean
SpritterService spritterService;
//我们可以像本地bean调用它
public List<Spittle> getSpittles(String userName){
Spitter spitter = spritterService.getSpitter(userName);
return spritterService.getSprittlesForSpitter(spitter);
}
至此我们就把Spring中使用RMI–java远程接口调用完成了。共有三部
1. 开发需要远程调用的接口;
2.服务端使用RmiServiceExporter把需要被远程调用的接口发布;
3.客户端使用RmiProxyFactoryBean接收调用的远程接口;
4.客户端像在本地生成的bean一样调用远程接口。
注意事项:
1,RMI可以实现远程服务交互,但是存在限制。首先RMI很难穿越防火墙。
2,RMI是基于java的。所以服务端和客户端必须是用java开发的。
3,java的版本必须保持一致。
拓展:Caucho Technology 开发了一套应对RMI的远程调用方案。在下面的博客中我们将观察Spring如何使用其他方案解决RMI的限制。