RPC(远程过程调用),远程过程调用,是客户端应用和服务端之间的会话。在客户端,它所需要的一些功能并不在该应用的实现范围之内,所以应用要向提供这些功能的其他系统寻求帮助。而远程应用通过远程服务暴露这些功能.RPC是同步操作,会阻塞调用代码的执行,直到被调用的过程执行完毕。
弹簧支持多种不同的RPC模型,包括RMI、Caucho的黑森和麻袋以及弹簧自带的HTTP调用程序:
客户端:
在所有的模型中,服务都是作为春天所管理的豆配置到我们的应用中。这是通过一个代理工厂豆实现的,这个bean能够把远程服务像本地对象一样装配到其他bean的属性中。
客户端向代理发起调用,就像代理提供了这些服务一样。代理代表客户端和远程服务进行通信,由它负责处理连接的细节并向远程服务发起调用。
服务端:
春天使用远程导出器(远程出口国)将bean方法发布为远程服务。
RMI最初在JDK 1.1被引入到Java平台中,它为Java开发者提供了一种强大的方法来实现Java程序间的交互。
春提供了简单的方式来发布RMI服务,在服务端,RmiServiceExporter可以把任何弹簧管理的bean发布为RMI服务,如图所示,RmiServiceExporter把bean包装在一个适配器类中,然后适配器类被绑定到RMI注册表中,并且代理到服务类的请求。
/* * *服务端: * & lt; p> * 1,默认情况下,RmiServiceExporter会尝试绑定到本地机器1099端口上的RMI注册表。 * 2,如果在这个端口没有发现RMI注册表,RmiServiceExporter将会启动一个注册表。 * 3、可重写注册表的路径和端口,这个是个大坑,当你设置了registryHost属性的时候,源码中就不创建注册表,而是直接去获取,可是我们自己也没有创建,所以就会报连接不上。 * * @param userService * @return */@ bean (name=" rmiServiceExporter ") 公共RmiExporter rmiServiceExporter (UserService UserService,环境环境){ 字符串registryHost=environment.getProperty (“registryHost”); int registryPort=环境。getProperty (“registryPort Integer.class); RmiExporter RmiExporter=new RmiExporter (); rmiExporter.setService (userService);//要把该bean(即rmiServiceImpl)发布为一个RMI服务 rmiExporter.setServiceName (“RmiService”);//命名RMI服务 rmiExporter.setServiceInterface (UserService.class);//指定服务所实现的接口 rmiExporter.setRegistryHost (registryHost); rmiExporter.setRegistryPort (registryPort); 返回rmiExporter; }
/* * *由XiuYin。崔alt="基于春天的RPC通讯模型的使用与比较">@ bean (name=" rmiUserServiceClient ") 公共RmiProxyFactoryBean RmiUserServiceClient () { RmiProxyFactoryBean RmiProxyFactoryBean=new RmiProxyFactoryBean (); rmiProxyFactoryBean.setServiceUrl (rmi://127.0.0.1:9999/RmiService); rmiProxyFactoryBean.setServiceInterface (UserService.class); rmiProxyFactoryBean.setLookupStubOnStartup(假);//不在容器启动后创建与服务器端的连接 rmiProxyFactoryBean.setRefreshStubOnConnectFailure(真正);//连接出错的时候自动重连 rmiProxyFactoryBean.afterPropertiesSet (); 返回rmiProxyFactoryBean; }@ resource (name=" rmiUserServiceClient ") 私人UserService UserService;RMI的缺陷:
1, RMI很难穿越防火墙,这是因为RMI使用任意端口来交互——这是防火墙通常所不允许的。
2、RMI是基于Java的。这意味着客户端和服务端必须都是用Java开发。因为RMI使用了Java的序列化机制,所以通过网络传输的对象类型必须要保证在调用两端的Java运行时中是完全相同的版本。提示:最近发现达博底层也是用RMI实现的,它把饲养员当作注册表。
基于春天的RPC通讯模型的使用与比较