Nacos 是阿里巴巴开源的集分布式配置中心、分布式注册中心为一体的分布式解决方案。
它的优点:
- 提供命令空间,方便管理不同环境的配置;
- 提供web界面,方便管理配置和服务;
- 支持配置版本管理,回滚;
- 支持服务管理,手动上线、下线服务。
等等其他优点。
1 如何使用 Nacos 自动更新配置
1.1 配置自动更新的两种方式
第一种方式
-
属性使用
@Value注解 -
类使用
@RefreshScope注解
@RefreshScope
@RequestMapping("config")
public class ConfigController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
}
第二种方式
- 使用
@NacosValue注解,自动更新配置成true
@Controller
@RequestMapping("config")
public class ConfigController {
@NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
private boolean useLocalCache;
@RequestMapping(value = "/get", method = GET)
@ResponseBody
public boolean get() {
return useLocalCache;
}
}
2 Nacos 配置更新源码分析
先上图

原图链接:https://www.processon.com/view/link/60b044536376893238e3cde5
具体步骤
1、第一步(更新数据库)比较简单,就是判断是新增配置还是修改配置,然后修改或者新增数据库响应信息(根据使用的数据库是内嵌derby还是mysql使用不同的实现)。
2、比较复杂的是通知(更新文件系统中的文件)
2.1 通过发布订阅模式,发布配置变更事件
2.2 订阅者接收到消息后,调用controller请求(communication/dataChange)
2.3 这个controller请求,启动一个异步任务,这个异步任务更新配置数据到指定的配置文件(nacos目录下)
之后通过发布-订阅模式通知其他服务,其他服务接收到通知之后,更新配置。
PS:
1、controller 请求http://ip:port/nacos/v1/cs/communication/dataChange?dataId=example&group=DEFAULT_GROUP
2、配置存储有两个地方,一个是在文件系统中,另一个是配置的数据库中(可能是内嵌的derby数据库和MySQL数据库)
3、一些配置基本信息,比如配置文件的 MD5 值、dataId、groupName等,会保存在 ConcurrentHashMap 存储的缓存的
源码1: 添加异步任务更新配置文件代码
/**
* Add DumpTask to TaskManager, it will execute asynchronously.
*/
public void dump(String dataId, String group, String tenant, long lastModified, String handleIp, boolean isBeta) {
String groupKey = GroupKey2.getKey(dataId, group, tenant);
String taskKey = String.join("+", dataId, group, tenant, String.valueOf(isBeta));
dumpTaskMgr.addTask(taskKey, new DumpTask(groupKey, lastModified, handleIp, isBeta));
DUMP_LOG.info("[dump-task] add task. groupKey={}, taskKey={}", groupKey, taskKey);
}
然后通过persistService读取数据库中的相应记录
源码2: 读取数据库中的最新配置数据
ConfigInfo cf = persistService.findConfigInfo(dataId, group, tenant);
将读取到的内容,写入到本地文件nacos/distribution/target/nacos-server-1.4.2/nacos/data/config-data/${GROUP_NAME}/${dataId}中,并更新配置文件的md5值。
源码3: 保存配置文件到文件目录中,并更新文件的 MD5 值
/**
* Save config file and update md5 value in cache.
*
* @param dataId dataId string value.
* @param group group string value.
* @param tenant tenant string value.
* @param content content string value.
* @param lastModifiedTs lastModifiedTs.
* @param type file type.
* @return dumpChange success or not.
*/
public static boolean

Nacos是阿里开源的分布式解决方案,集配置中心和注册中心于一体。本文详细介绍了Nacos的配置自动更新机制,包括@Value和@RefreshScope的使用,以及@NacosValue的自动刷新功能。此外,还深入解析了Nacos配置更新的源码,涉及到发布订阅模式、任务管理器和并发控制。重点讲解了配置文件的更新流程,从数据库操作到文件系统更新,并分析了配置变更事件的发布和订阅过程。
最低0.47元/天 解锁文章
1858

被折叠的 条评论
为什么被折叠?



