发表于: 2020-01-18 11:09:46

1 1276


啥也不说就是干!!

今天完成的事情:

1、Spring RMI

RMI(Remote Method Invocation)远程方法调用,其主要是用于开发分时网络应用。是纯 Java 的网络分布式应用核心结局方案之一。其实它可以理解为 RPC 的 Java 版。RMI 对于 Java 语言开发的应用系统的支持不足。不能用于非 Java 语言书写的对象进行通信。

Spring 对 RMI 有很好的支持

1)服务端

可以把要暴露的接口服务 用 RMIServiceExporter 包装为 RMI 对象

然后将 RmiServiceExporter 类,RmiServiceExporter 会即将实现类发布为 RMI 服务

2)客户端

只需要使用 RmiProxyFactoryBean 从服务端的 URL 中获取服务对象

并进行封装给你定义的id 交给 Spring 容器,

3) 服务方法调用

具体需要调用 Service 方法的地方,从 Spring 容器中获取 RmiProxyFactoryBean 封装的 id 即可获取远程服务端的 Service 对象


2、拆分任务七中的 Service

在上个任务中,把发短信的功能拆分成一个单独模块

NotifyModule 作为发短信的模块

TaskModule 作为 web 模块

Common 作为中间的模块,这个模块主要是放 NotifyModule 与 TaskModule 两个模块调用所需要的接口类

TaskModule 与 NotifyModule 都必须要同时引用 Common 模块


Common 模块中定义 SmsCodeSendService

public interface SmsCodeSendService {
   SmsInfo sendSMSLoginCode(String phoneNum);
}

2) NotifyModule 模块将 Service 用 RMIServiceExporter 暴露,这里作为提供发送短信的服务端

@Configuration
public class RmiServer {

   @Resource
   private SmsCodeSendService smsCodeSendService;

   @Bean
   public RmiServiceExporter getRmiServiceExporter() {
       RmiServiceExporter rmiServiceExporter = new RmiServiceExporter();
       rmiServiceExporter.setServiceName("smsCodeSendService");
       rmiServiceExporter.setService(smsCodeSendService);
       rmiServiceExporter.setServiceInterface(SmsCodeSendService.class);
       rmiServiceExporter.setRegistryPort(2002);
       return rmiServiceExporter;
   }
}


setServiceName 指定暴露出去的 Service 名称

setService 指定暴露出去的 Service 实例

setServiceInterface 指定暴露出去的 Service 类

setRegistryPort 表示暴露的 Service 所在服务端口号


3)TaskModule 模块,将调用服务端发送短信的 Service

@Configuration
public class RmiClient {

@Bean(name = "smsCodeSendService")
public RmiProxyFactoryBean getUserService() {
       RmiProxyFactoryBean rmiProxyFactoryBean = new RmiProxyFactoryBean();
       rmiProxyFactoryBean.setServiceUrl("rmi://127.0.0.1:2002/smsCodeSendService");
       rmiProxyFactoryBean.setServiceInterface(SmsCodeSendService.class);
       return rmiProxyFactoryBean;
   }
}

setServiceUrl 包含了发短信服务所在的地址+端口号+服务名称

setServiceInterface 表示所要调用服务的类名

然后指定 Bean 名称为 smsCodeSendService 交给 Spring 容器管理

@Resource
private SmsCodeSendService smsCodeSendService;

@Override
public SmsInfo sendSMSCode(String phone) {
   return smsCodeSendService.sendSMSLoginCode(phone);
}

然后在这里调用相应的发短信方法


明天计划的事情:

将服务部署到 两台Tomcat 上,用 Nginx 做负载均衡 

遇到的问题:

暂无

收获:

初步学会使用 SpringRMI 及 项目的拆分


返回列表 返回列表
评论

    分享到