统一配置管理
配置的CURD
Nacos Config 针对配置管理提供了四种操作,配置方法存在于 com.alibaba.nacos.api.config.ConfigService
中。
- 获取配置:从 Nacos Config Server 中读取配置
String getConfig(String dataId, String group, long timeoutMs) throws NacosException;
- 监听配置:订阅监听的配置,当配置发生变化后会收到事件通知
void addListener(String dataId, String group, Listener listener) throws NacosException;
- 发布配置:将配置保存到 Nacos Config Server
boolean publishConfig(String dataId, String group, String content) throws NacosException;
- 删除配置:删除配置中心的制定配置
boolean removeConfig(String dataId, String group) throws NacosException;
动态监听
当 Nacos Config Server 上的配置发生变化时,需要通知相关的服务或应用感知变化。通常客户端和服务端之间数据交互方式包含两种: pull
和 push
。前者表示客户端从服务端主动拉取数据,后者表示服务端主动把数据推送到客户端。
对于 pull
,客户端需要定时从服务端拉取一次数据,由于定时任务会存在一定的时间间隔,不能保证数据的实时性。而且在服务端配置长时间不更新的情况下,客户端的定时任务会做一些无用的拉取操作,是一种对资源的浪费。
对于 push
,服务端需要维持与客户端的长连接,如果客户端数量较多,服务端需要耗费大量的内存资源来保存每个连接,而且为了检测连接有效性,还需要心跳机制来维持每个连接的状态。
Nacos采用的是 pull
模式,是一种长轮询机制,结合上述两种模式的优势。客户端采用长轮训的方式定时发送 pull
请求,去检查服务端的配置信息是否发生了变更,如果发生了变更,则客户端会根据变更的数据获得最新的配置。如果没有发生变更,服务端会先Hold住这个请求,即服务端接收此请求后在指定时间段内(长连接会话超时时间默认为30S)
一直不返回结果,直到这段时间内配置发生变化,服务端会把原来Hold住的请求进行返回。
Nacos 服务端收到请求之后,先检查配置是否发生了变更,若没有,则设置一个定时任务,延时29.5S执行,并且把当前的客户端长轮训连接加入AllSubs
队列,此时存在两种方式触发连接结果的返回。
- 等待29.5S(长连接保持时间)后触发自动检查机制,无论配置有无变化,都将结果返回客户端。
- 在29.5S的长连接保持时间内的任意一个时刻,通过Nacos DashBoard 或 API 方式对配置进行了修改,会触发配置事件的更新,监听到该时间的任务会遍历
AllSubs
队列,找到发生变更的配置项对应的ClientLongPolling
任务,将变更的数据通过该任务的连接进行返回,完成一次推送操作。