研究Nacos一个多月了,对其配置中心多多少少了解了一点。
本文就对Nacos的三大功能之一:服务的配置管理作一定的探索。
主要回答以下几个问题:
配置中心架构图
动态更新流程介绍
配置内容,Key-Value?文件?
答:服务端存Key-Value,存MsSQL中
客户端存本地,存储路径:
~/nacos/config/fixed-{address}8848nacos/snapshot/DEFAULT_GROUP/{dataId}
持久层对比,Mysql?Oracle?能否支持分库?分库保证CP还是AP?
答:只支持MySQL,不支持分库。默认是一主一从。
Server端保证是CP还是AP?
看看Maintainer的回答吧
加配置的方式,是页面配置还是Http请求?
答:控制台+OpenAPI
- Nacos支持 YAML、Properties、TEXT、JSON、XML、HTML 等常见配置格式
- 在线编辑、语法高亮、格式校验(帮助用户高效编辑的同时大幅降低格式错误带来的风险)
- Nacos支持配置标签的能力(帮助用户更好更灵活的做到基于标签的配置分类及管理)
- 支持编辑DIFF能力,帮助用户校验修改内容,降低改错带来的风险。
取配置的方式,嵌入SDK?Http请求?;配置中心通知还是客户端自己轮询?
答:嵌入SDK和Http结合
客户端维持一个长轮询,当服务端配置信息发生变更时,客户端将最新的数据获取下来之后,保存在了 CacheData 中。所以只需要通过一个无状态的 http 请求即可获取到服务端的数据。
客户端存配置的方式,是直接刷新Java系统配置?是Load到Bean里?还是落本地文件?
答:Load到Bean里。
客户端拉取最新的数据后保存在 CacheData 中,同时更新该 CacheData 的 Md5 值,当下次执行 checkListenerMd5 方法时,若本地的Md5 值和最新配置的Md5值不一样,就意味着Server端的配置信息发生改变,这时将最新的数据通知给监听器的持有者。
监听器获取配置方式:
configService.addListener(dataId, group, new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("receive: " + configInfo);
}
@Override
public Executor getExecutor() {
return null;
}
});
Spring cloud中@RefreshCope 方式刷新配置:
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
@RequestMapping("/get")
public boolean get() {
return useLocalCache;
}
}