基于春天的RPC通讯模型的使用与比较

  

  

RPC(远程过程调用),远程过程调用,是客户端应用和服务端之间的会话。在客户端,它所需要的一些功能并不在该应用的实现范围之内,所以应用要向提供这些功能的其他系统寻求帮助。而远程应用通过远程服务暴露这些功能.RPC是同步操作,会阻塞调用代码的执行,直到被调用的过程执行完毕。

  

弹簧支持多种不同的RPC模型,包括RMI、Caucho的黑森和麻袋以及弹簧自带的HTTP调用程序:

  

基于春天的RPC通讯模型的使用与比较

  

客户端:

  

在所有的模型中,服务都是作为春天所管理的豆配置到我们的应用中。这是通过一个代理工厂豆实现的,这个bean能够把远程服务像本地对象一样装配到其他bean的属性中。

  

客户端向代理发起调用,就像代理提供了这些服务一样。代理代表客户端和远程服务进行通信,由它负责处理连接的细节并向远程服务发起调用。

  

基于春天的RPC通讯模型的使用与比较

  

服务端:

  

春天使用远程导出器(远程出口国)将bean方法发布为远程服务。

  

基于春天的RPC通讯模型的使用与比较

  

  

RMI最初在JDK 1.1被引入到Java平台中,它为Java开发者提供了一种强大的方法来实现Java程序间的交互。

  

春提供了简单的方式来发布RMI服务,在服务端,RmiServiceExporter可以把任何弹簧管理的bean发布为RMI服务,如图所示,RmiServiceExporter把bean包装在一个适配器类中,然后适配器类被绑定到RMI注册表中,并且代理到服务类的请求。

  

基于春天的RPC通讯模型的使用与比较

     /* *   *服务端:   * & 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通讯模型的使用与比较