当前位置: 首页 > 科技观察

Nacos配置中心模块详解

时间:2023-03-13 22:20:11 科技观察

本文转载自微信公众号《捉虫大师》,作者为捉虫大师。转载本文请联系捕虫大师公众号。动态配置中心可以用于配置中心业务的配置、功能切换、服务管理中的弱依赖降级,甚至数据库密码。当没有专门的配置中心组件时,我们使用硬编码,或者配置文件,或者数据库、缓存等方式来解决问题。硬编码配置需要重新编译打包,配置文件需要重启,数据库性能受限,缓存失去时效性。可能不完美,但是可以从中总结出配置中心的需求,比较明确:能够存储、获取和监控配置(必须)及时推送配置变化给监听者(必须)有可视化视图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;mapheaders=7;}messagePayload{Metadatametadata=2;google.protobuf.Anybody=3;}serviceRequest{//SendsacommonRequestrpcrequest(Payload)returns(Payload){}}type是请求/返回类的类名clientIp是携带的客户端ipheadersheader信息中的bodyPlayload是用json格式编码的。在com.alibaba.nacos.api.config.ConfigService中,可以找到配置中心可以使用的所有接口。重点关注这几个接口:getConfig:读取配置publishConfig:发布配置publishConfigCas:原子发布配置,如果被其他线程改了,就会发布失败,类似java中的CASremoveConfig:删除配置addListener:监听配置removeListener:移除配置监听changepush采用push和pull相结合的方式,既保证了时效性,又保证了数据的一致性数据存储Nacos配置中心的数据存储支持内嵌的derby数据库,也支持外挂数据库mysql。嵌入式数据库主要用于单机测试。上面提到的publishConfigCas的实现是利用数据库update${table}set${xx}=${zz}wheremd5=${old_md5},如果这个数据被改变了,这次publish会失败。灰度与回滚勾选灰度发布时,可以填写灰度ip进行推送,不在灰度列表中的ip将不会收到变更推送,灰度和官方是有区别的。灰度的实现是记录每次发布,回滚到指定版本。结语本文从背景出发,对Nacos配置中心的各个重要模块一一进行讲解,从而对Nacos配置中心有一个整体的把握。预计Nacos注册中心以后会分析介绍。