需求描述
今天在做一个定时任务数据同步的需求,定时任务
是一个单独的微服务,部署了多套,但是全部的可执行任务是在项目启动的时候,加载到内存中进行任务执行。
在这个时候,当在后台管理进行定时任务操作的时候,比如:修改、新增、删除操作,需要把最新数据同步给全部的定时任务
微服务实例,来更新最新数据。
后台管理如下图:
这个数据同步的思路大概是这个样子的,当对定时任务数据进行了:新增、修改、删除操作,执行完这些操作之后,调用sync()
方法,用 HTTP 的方式来通知其他定时任务
微服务实例,然后达到数据同步的目的。
那么这里就会涉及一个问题,怎么拿到全部定时任务
微服务实例列表呢? 只有知道定时任务
全部的微服务实例,获取到 IP + Port 信息才能发起 HTTP 调用。
解决办法
首先,我们微服务注册中心用的是:Nacos,本文就用 Nacos 的解决方式。
如果读过 Nacos 源码的同学应该知道,在 Nacos 里面会有 NacosNamingService
类,这个类的作用可以注册实例,销毁实例、当然同时也可以查询实例。如果还没有读过 Nacos 源码的同学,可以看一看小编我出的 Nacos 源码精讲
的课程,保证收获满满,点击查看。
知道NacosNamingService
类之后,该如何创建这个类呢? 代码如下:
@Configuration
@AllArgsConstructor
public class NacosNamingServiceConfig {
private final NacosDiscoveryProperties nacosDiscoveryProperties;
@Bean
public NacosNamingService nacosNamingService() {
try {
NacosNamingService service = new NacosNamingService(nacosDiscoveryProperties.getNacosProperties());
return service;
} catch (NacosException e) {
e.printStackTrace();
}
return null;
}
}
创建好这个对象之后,我们就可以使用了,如下图:
把 NacosNamingService
Bean 对象注入进来,然后调用它原生的 getAllInstances
方法,就可以从 Nacos 获取到相对应微服务的全部实例信息了。
所以呀,平时好好学习源码是很有必要的噢~~~~~