nacos配置中心模块详解

捉虫大师
• 阅读 2244

本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star。

配置中心

业务上的配置,功能开关,服务治理上对弱依赖的降级,甚至数据库的密码等,都可能用到动态配置中心。

在没有专门的配置中心组件时,我们使用硬编码、或配置文件、或数据库、缓存等方式来解决问题。

硬编码修改配置时需要重新编译打包,配置文件需要重启应用,数据库受限于性能,缓存丧失了及时性。

可能都不完美,但能从中总结出配置中心的需求,相对来说还是比较明确:

  • 能够存储、获取并监听配置(必须)
  • 配置变更时能及时推送给监听者(必须)
  • 有一个可视化的查看变更配置的控制台(必须)
  • 配置变更可灰度执行(加分)
  • 配置变更可回滚(加分)

目前使用最多的配置中心可能是携程开源的Apollo,还有Spring Cloud Config、阿里开源的Nacos、百度的Disconf等。

Nacos配置中心

NacosNaming and Configuration Service的缩写,从名字上能看出它重点关注的两个领域是Naming即注册中心和Configuration配置中心。

本文讲解nacos的配置中心的架构设计和实现原理,基于2.0.0版本(注:2.0.0版本与1.x版本区别较大)

Nacos调试环境搭建

  • 先从github上clone代码(网速比较慢,加上--depth=1参数)
git clone --depth=1 https://github.com/alibaba/nacos.git
  • 导入IDE,看代码,调试更方便

  • 启动Server端:运行console模块下的Nacos.main(),这个类扫描的路径最广,能启动所有的模块

    • JVM参数可带上-Dnacos.standalone=true -Dnacos.functionMode=config,指定单机模式,且只启动config模块

    • --spring.config.additional-location=nacos/distribution/conf,程序参数指定配置文件目录

    • 正常启动,console打印出Ncos控制台地址,进入Nacos控制台,输入用户名密码(默认均为nacos)即可登录

nacos配置中心模块详解

  • 使用client进行测试,example模块下有configExample可进行config的测试,为了不动源代码,可copy一份configExample进行修改测试

Nacos配置模型

namespace + group + dataId 唯一确定一个配置

  • namespace:与client绑定,一个clinet对应到一个namespace,可用来隔离环境或区分租户
  • group:分组,区分业务
  • dataId:配置的id

nacos配置中心模块详解

客户端启动流程

nacos配置中心模块详解

  • 参数准备时,如果配置了nacos服务端地址,则直接使用;如果配置了endpoint,则从endpoint中获取nacos服务端地址,这样有个好处是服务端地址变更,扩缩容都无需重启client,更详细可参考https://nacos.io/en-us/blog/namespace-endpoint-best-practices.html
  • 在客户端第一次与服务端交互时创建GRPC连接,随机挑选一台server建立连接,后续都使用该连接,请求失败都会有重试,针对请求级别也有限流;重试失败或者服务端主动断开连接,则会重新挑选一台server进行建链

请求模型

从gRPC的proto文件能看出请求与返回的定义比较统一

message Metadata {
  string type = 3;
  string clientIp = 8;
  map<string, string> headers = 7;
}

message Payload {
  Metadata metadata = 2;
  google.protobuf.Any body = 3;
}

service Request {
  // Sends a commonRequest
  rpc request (Payload) returns (Payload) {
  }
}
  • type是请求/返回类的类名
  • clientIp是客户端ip
  • headers是携带的header信息
  • Playload中的body以json格式编码

com.alibaba.nacos.api.config.ConfigService中可以找到所有配置中心能使用的接口

nacos配置中心模块详解

重点关注这几个接口:

  • getConfig:读取配置
  • publishConfig:发布配置
  • publishConfigCas:原子的发布配置,若有被其他线程变更则发布失败,类似java中的CAS
  • removeConfig:删除配置
  • addListener:监听配置
  • removeListener:移除配置的监听

变更推送

nacos配置中心模块详解

采取推拉结合的方式,既保证时效性,又保证数据一致性

数据存储

Nacos配置中心的数据存储支持内嵌的derby数据库,也支持外部数据库mysql,内嵌数据库主要是为了单机测试时使用。

其中上文提及的publishConfigCas的实现是利用了数据库update ${table} set ${xx}=${zz} where md5=${old_md5}来实现,如果已经这条数据被变更,则这次publish会失败。

灰度和回滚

nacos配置中心模块详解

当勾选灰度发布时可填写灰度的ip进行推送,不在灰度列表内的ip则不会接受到变更推送,并且灰度和正式是区分开的。

nacos配置中心模块详解

nacos配置中心模块详解 灰度的实现是记录下了每次的发布,回滚到指定版本即可。

结语

本文从背景出发,结合Nacos配置中心的各个重要模块进行了一一解释,能够从整体上对Nacos的配置中心有一个把握。期望后续能对Nacos注册中心进行分析介绍。


搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。

nacos配置中心模块详解

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
捉虫大师 捉虫大师
3年前
我在组内的Nacos分享
本文已收录https://github.com/lkxiaolou/lkxiaolou欢迎star。Nacos简介Nacos:NamingandConfigurationService,可打包部署配置中心和注册中心,也可独立部署其中之一,配置中心、控制台依赖mysql,由阿里巴巴2018年8月开源,github19.1kstar(截止20
Stella981 Stella981
3年前
Nacos配置中心动态获取数组配置
有的时候我们需要动态获取一系列的配置项,假设我们在nacos配置中心的配置如下,nacos配置中心的其他设置请参考Nacos搭建流程(https://my.oschina.net/u/3768341/blog/3138297)skill:name:爆炸冲刺在SpringCloud代
Easter79 Easter79
3年前
SpringCloud微服务(06):Config组件,实现配置统一管理
一、Config简介在微服务系统中,服务较多,相同的配置:如数据库信息、缓存、参数等,会出现在不同的服务上,如果一个配置发生变化,需要修改很多的服务配置。springcloud提供配置中心,来解决这个场景问题。系统中的通用配置存储在相同的地址:GitHub,Gitee,本地配置服务等,然后配置中心读取配置以restful发布
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Easter79 Easter79
3年前
SpringCloud配置中心——ConfigServer搭建
_在实际应用中,一个系统的每个微服务都会有相同的配置,如数据库配置信息等等。为了将每个微服务的公共配置可以抽取出来。SpringCloud提供了Config配置中心的配置,作为配置中心(ConfigServer),提供给微服务(ConfigClient)读取并且加载配置。使用git仓库存放配置文件,SpringCloudConfig读取到之后会自
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了