Nacos 根据服务名获取所有服务实例的IP和端口列表
需求描述
今天在做一个定时任务数据同步的需求,定时任务
是一个单独的微服务,部署了多套,但是全部的可执行任务是在项目启动的时候,加载到内存中进行任务执行。
在这个时候,当在后台管理进行定时任务操作的时候,比如:修改、新增、删除操作,需要把最新数据同步给全部的定时任务
微服务实例,来更新最新数据。
后台管理如下图:
这个数据同步的思路大概是这个样子的,当对定时任务数据进行了:新增、修改、删除操作,执行完这些操作之后,调用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 获取到相对应微服务的全部实例信息了。
所以呀,平时好好学习源码是很有必要的噢,学习底层源码可能有同学会觉得比较复杂和枯燥,门槛比较高。读过众多框架源码,之所以 Nacos 能够打动我为它专门写一本小册,就是因为 Nacos 底层源码读起来非常“清爽”,也包括了很多巧妙的设计思想,这些都很值得你学习。
哪怕是之前从来没有阅读过源码的同学,只要跟着本小册的思路和讲解,都能完全掌握,完全不用担心!同时,本小册也会讲解我们应该如何去正确地学习源码,只有掌握了正确的方式,在源码学习过程中才不会枯燥乏味,并且能够坚持下去!
如果你感兴趣的话 点击查看详情,保证你会对 Nacos 有更加深刻的认识和理解。
更多推荐
所有评论(0)