Nacos 和 Apollo中的 长轮询 定时机制,太好用了~

本文深入探讨Nacos配置中心的长轮询机制,从客户端和服务器端两个方面阐述其工作原理。客户端在创建ConfigService时启动长轮询定时任务,通过HttpAgent和ClientWorker检查配置变更。服务端通过ConfigController监听请求,执行长轮询定时任务,当配置变更时通过事件机制通知客户端。

今天这篇文章来介绍一下Nacos配置中心的原理之一:长轮询机制的应用

为方便理解与表达,这里把 Nacos 控制台和 Nacos 注册中心称为 Nacos 服务器(就是 web 界面那个),我们编写的业务服务称为 Nacso 客户端;

Nacos 动态监听的长轮询机制原理图,本篇将围绕这张图剖析长轮询定时机制的原理:

ConfigService 是 Nacos 客户端提供的用于访问实现配置中心基本操作的类,我们将从 ConfigService 的实例化开始长轮询定时机制的源码之旅;

1. 客户端的长轮询定时机制

我们从NacosPropertySourceLocator.locate()开始【断点步入】:

1.1 利用反射机制实例化 NacosConfigService 对象

客户端的长轮询定时任务是在 NacosFactory.createConfigService() 方法中,构建 ConfigService 对象实例时启动的,我们接着 1.1 处的源码;

进入 NacosFactory.createConfigService():

public static ConfigService createConfigService(Properties properties) throws NacosException {
    //【断点步入】创建 ConfigService
    return ConfigFactory.createConfigService(properties);
}

进入 ConfigFactory.createConfigService(),发现其使用反射机制实例化 NacosConfigService 对象;

1.2 NacosConfigService 的构造方法里启动长轮询定时任务

进入 NacosConfigService.NacosConfigService() 构造方法,里面设置了一些更远程任务相关的属性;

1.2.1 初始化 HttpAgent

MetricsHttpAgent 类的设计如下:

ServerHttpAgent 类的设计如下:

1.2.2 初始化 ClientWorker

进入 ClientWorker.ClientWorker() 构造方法,主要是创建了两个定时调度的线程池,并启动一个定时任务;

进入 ClientWorker.checkConfigInfo(),每隔 10s 检查一次配置是否发生变化;

  • cacheMap:是一个 AtomicReference<Map<String, CacheData>> 对象,用来存储监听变更的缓存集合,key 是根据 datalD/group/tenant(租户)拼接的值。Value 是对应的存储在 Nacos 服务器上的配置文件的内容;
  • 长轮询任务拆分:默认情况下,每个长轮询 LongPollingRunnable 任务处理3000个监听配置集。如果超过3000个,则需要启动多个 LongPollingRunnable 去执行;

1.3 检查配置变更,读取变更配置 LongPollingRunnable.run()

因为我们没有这么多配置项,debug 不进去,所以直接找到 LongPollingRunnable.run() 方法,该方法的

### Apollo 配置中心与 Nacos 的功能对比及区别 #### 核心功能对比 在配置管理方面,Apollo 提供了更全面的功能支持,包括多环境管理、灰度发布版本回滚等功能[^1]。而 Nacos 的配置管理功能相对简单,主要提供基础的配置存储动态更新能力[^3]。 在服务发现与注册领域,Nacos 是强项,支持动态服务发现健康检查,而 Apollo 不具备服务发现功能[^3]。因此,如果项目需要同时实现配置管理服务发现,Nacos 可能是更好的选择。 关于多语言支持,Nacos 提供了更广泛的生态支持,包括 Kubernetes Dubbo 等技术栈[^3]。而 Apollo 主要支持主流语言Java、Go Python 等。 #### 动态配置推送机制 Apollo Nacos 都支持实时的动态配置推送。其中,Apollo 采用长轮询的方式进行配置推送,而 Nacos 支持 HTTP 长轮询 UDP 两种方式,提供了更高的灵活性[^3]。 #### 权限管理 Apollo 提供了完善的权限控制审计日志功能,适合对安全性要求较高的场景[^3]。相比之下,Nacos 的权限管理功能较为基础,能够满足一般需求但缺乏高级特性[^3]。 #### 社区支持与生态 Nacos 因为与 Spring Cloud 的紧密集成,拥有更好的社区支持更广泛的用户群体[^2]。而 Apollo 的社区规模较小,但仍提供了足够的文档技术支持[^2]。 #### 应用场景 对于需要强大配置管理功能且希望有良好用户界面的团队,Apollo 是更合适的选择[^2]。而对于需要配置管理、服务发现动态服务注册一体化解决方案的团队,Nacos 更加适用[^2]。 #### 示例代码:使用 Apollo 配置中心 以下是一个简单的 Apollo 客户端配置示例: ```java import com.ctrip.framework.apollo.Config; import com.ctrip.framework.apollo.ConfigService; public class ApolloExample { public static void main(String[] args) { Config config = ConfigService.getConfig("application"); String value = config.getProperty("key", "default"); System.out.println("Configuration Value: " + value); } } ``` #### 示例代码:使用 Nacos 配置中心 以下是一个简单的 Nacos 客户端配置示例: ```java import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.exception.NacosException; import java.util.Properties; public class NacosExample { public static void main(String[] args) throws NacosException { String serverAddr = "localhost"; Properties properties = new Properties(); properties.put("serverAddr", serverAddr); ConfigService configService = NacosFactory.createConfigService(properties); String content = configService.getConfig("example", "DEFAULT_GROUP", 5000); System.out.println("Configuration Content: " + content); } } ``` ### 总结 Apollo Nacos 在微服务配置管理中各有优劣。如果项目需要强大的配置管理功能以及良好的用户界面,可以选择 Apollo;如果需要一体化的服务发现配置管理解决方案,则 Nacos 更为合适。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值