本文转载自微信公众号《捉虫大师》,作者为捉虫大师。转载本文请联系捕虫大师公众号。动态配置中心可以用于配置中心业务的配置、功能切换、服务管理中的弱依赖降级,甚至数据库密码。当没有专门的配置中心组件时,我们使用硬编码,或者配置文件,或者数据库、缓存等方式来解决问题。硬编码配置需要重新编译打包,配置文件需要重启,数据库性能受限,缓存失去时效性。可能不完美,但是可以从中总结出配置中心的需求,比较明确:能够存储、获取和监控配置(必须)及时推送配置变化给监听者(必须)有可视化视图changes配置控制台(必须)配置变更可以灰度执行(加分)配置变更可以回滚(加分)目前使用最多的配置中心可能是携程开源的Apollo,还有阿里开源的SpringCloudConfigNacos、百度的Disconf等Nacos配置中心Nacos是NamingandConfigurationService的简称。从名字可以看出它关注的两个区域是Naming,也就是注册中心和Configuration配置中心。本文以2.0.0版本(注:2.0.0版本与1.x版本差异较大)为基础,讲解nacos配置中心的架构设计与实现原理。搭建Nacos调试环境,首先从github克隆代码(网速比较慢,添加--depth=1参数)gitclone--depth=1https://github.com/alibaba/nacos.git导入IDE,看代码,调试更方便启动服务端:在console模块下运行Nacos.main(),这个类扫描最宽路径,可以启动所有模块JVM参数可以带-Dnacos.standalone=true-Dnacos.functionMode=config,指定单机模式,只启动config模块--spring.config.additional-location=nacos/distribution/conf,程序参数指定配置文件目录正常启动,控制台打印出ncos控制台地址,进入Nacos控制台,输入用户名和密码(默认nacos)登录,使用客户端进行测试,example模块下有configExample来测试config。为了不改动源码,可以复制一份configExample进行修改测试。Nacos配置模型namespace+group+dataId唯一确定一个配置namespace:绑定到client,一个client对应一个namespace,可以使用隔离环境或区分租户group:分组,区分业务dataId:配置的id当client启动流程参数准备,如果配置了nacos服务器地址,则直接使用;如果配置了endpoint,会从endpoint获取nacosserver地址,这样的好处是server的地址改变了,扩缩容不需要重启client。更多详情请参考客户端中的https://nacos.io/en-us/blog/namespace-endpoint-best-practices.html。与服务器交互一次时创建一个GRPC连接,随机选择一个服务器建立连接,以后使用这个连接。如果请求失败,会有重试,也有请求级别的限流;重试失败或服务器主动如果连接断开,将重新选择一个服务器建立链接。请求模型可以从gRPC的proto文件中看到。请求和返回的定义比较统一。messageMetadata{stringtype=3;stringclientIp=8;map
