nacos 配置中心模块详解
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎 star。
配置中心
业务上的配置,功能开关,服务治理上对弱依赖的降级,甚至数据库的密码等,都可能用到动态配置中心。
在没有专门的配置中心组件时,我们使用硬编码、或配置文件、或数据库、缓存等方式来解决问题。
硬编码修改配置时需要重新编译打包,配置文件需要重启应用,数据库受限于性能,缓存丧失了及时性。
可能都不完美,但能从中总结出配置中心的需求,相对来说还是比较明确:
能够存储、获取并监听配置(必须)
配置变更时能及时推送给监听者(必须)
有一个可视化的查看变更配置的控制台(必须)
配置变更可灰度执行(加分)
配置变更可回滚(加分)
目前使用最多的配置中心可能是携程开源的 Apollo,还有 Spring Cloud Config、阿里开源的 Nacos、百度的 Disconf 等。
Nacos 配置中心
Nacos
是Naming and Configuration Service
的缩写,从名字上能看出它重点关注的两个领域是Naming
即注册中心和Configuration
配置中心。
本文讲解 nacos 的配置中心的架构设计和实现原理,基于2.0.0
版本(注:2.0.0 版本与 1.x 版本区别较大)
Nacos 调试环境搭建
先从 github 上 clone 代码(网速比较慢,加上--depth=1 参数)
导入 IDE,看代码,调试更方便
启动 Server 端:运行 console 模块下的 Nacos.main(),这个类扫描的路径最广,能启动所有的模块
JVM 参数可带上
-Dnacos.standalone=true -Dnacos.functionMode=config
,指定单机模式,且只启动 config 模块--spring.config.additional-location=nacos/distribution/conf
,程序参数指定配置文件目录正常启动,console 打印出 Ncos 控制台地址,进入 Nacos 控制台,输入用户名密码(默认均为 nacos)即可登录
使用 client 进行测试,example 模块下有 configExample 可进行 config 的测试,为了不动源代码,可 copy 一份 configExample 进行修改测试
Nacos 配置模型
namespace + group + dataId 唯一确定一个配置
namespace:与 client 绑定,一个 clinet 对应到一个 namespace,可用来隔离环境或区分租户
group:分组,区分业务
dataId:配置的 id
客户端启动流程
参数准备时,如果配置了 nacos 服务端地址,则直接使用;如果配置了 endpoint,则从 endpoint 中获取 nacos 服务端地址,这样有个好处是服务端地址变更,扩缩容都无需重启 client,更详细可参考
https://nacos.io/en-us/blog/namespace-endpoint-best-practices.html
在客户端第一次与服务端交互时创建 GRPC 连接,随机挑选一台 server 建立连接,后续都使用该连接,请求失败都会有重试,针对请求级别也有限流;重试失败或者服务端主动断开连接,则会重新挑选一台 server 进行建链
请求模型
从 gRPC 的 proto 文件能看出请求与返回的定义比较统一
type 是请求/返回类的类名
clientIp 是客户端 ip
headers 是携带的 header 信息
Playload 中的 body 以 json 格式编码
在com.alibaba.nacos.api.config.ConfigService
中可以找到所有配置中心能使用的接口
重点关注这几个接口:
getConfig:读取配置
publishConfig:发布配置
publishConfigCas:原子的发布配置,若有被其他线程变更则发布失败,类似 java 中的 CAS
removeConfig:删除配置
addListener:监听配置
removeListener:移除配置的监听
变更推送
采取推拉结合的方式,既保证时效性,又保证数据一致性
数据存储
Nacos 配置中心的数据存储支持内嵌的derby
数据库,也支持外部数据库mysql
,内嵌数据库主要是为了单机测试时使用。
其中上文提及的publishConfigCas
的实现是利用了数据库update ${table} set ${xx}=${zz} where md5=${old_md5}
来实现,如果已经这条数据被变更,则这次 publish 会失败。
灰度和回滚
当勾选灰度发布时可填写灰度的 ip 进行推送,不在灰度列表内的 ip 则不会接受到变更推送,并且灰度和正式是区分开的。
灰度的实现是记录下了每次的发布,回滚到指定版本即可。
结语
本文从背景出发,结合 Nacos 配置中心的各个重要模块进行了一一解释,能够从整体上对 Nacos 的配置中心有一个把握。期望后续能对 Nacos 注册中心进行分析介绍。
搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。
版权声明: 本文为 InfoQ 作者【捉虫大师】的原创文章。
原文链接:【http://xie.infoq.cn/article/161748fc741ff162ee2d73dd9】。文章转载请联系作者。
评论