nacos配置中心模块详解

捉虫大师 等级 1322 0 0
标签: config数据库

本文已收录 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配置中心模块详解

收藏
评论区

相关推荐

Nacos Cluster Building
原文链接:[https://www.javaspring.net/nacos/nacos-cluster-building](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.javaspring.net%2Fnacos%2Fnacos-cluster-building) Conti
Nacos Committers 团队首亮相,发布 0.9.0 版本
223 天,发布 14 个版本,19 位 Committers,39 位 Contributors。 在宣布开源后的第 223 天,Nacos 发布了其第14个版本 - 0.9.0,该版本提升了 Nacos-Sync 的稳定性,支持 Server 功能拆分部署,以及提供了对 Python 语言体系的支持。高速的迭代离不开社区所有开发者的贡献,这为下一个 G
Nacos Config源代码分析(一)
Nacos Config提供了配置管理的功能,它允许用户在nacos上配置key-value对,并在客户端订阅需要的配置。当配置发生变更时,订阅的客户端会获得通知,随后拉取最新的key-value对。 Config Server为了最大程度保证可用性采用了一种三层的存储架构设计,mysql - 本地文件 - 内存缓存: ![](https://oscim
NacosValue 注解
NacosValue 定义在 nacos-api 工程中:com.alibaba.nacos.api.config.annotation.NacosValue 注解解析在 nacos-spring-project 工程中: com.alibaba.nacos.spring.util.NacosBeanUtils#registerNacosValueAnn
Nacos系列:Nacos的Java SDK使用
Maven依赖 ------- Nacos提供完整的Java SDK,便于配置管理和服务发现及管理,以 `Nacos-0.8.0` 版本为例 添加Maven依赖: <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client<
Nacos跨服务器调用服务报错
> 利用gateway做springcloud微服务网关路由服务时出现报错情况,发现是和网关不在一个服务器的服务无法使用 Nacos服务注册的IP Nacos注册中心是: https://github.com/alibaba/nacos 各个服务通过Nacos客户端将服务信息注册到Nacos上 当Nacos服务注册的IP默认选择出问题时,可以通
Nocas学习(2)
添加依赖 ---- 官方提供版本: <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>nacos-config-spring-boot-starter</artifactId> <version>${latest.version}</version> </dependency>
Spring Cloud Alibaba Nacos Config 的使用
一、需求 ==== 主要实现 `nacos` 作为配置中心的一些使用方法。 二、实现功能 ====== 1、加载 product-provider-dev.yaml 配置文件 ----------------------------------- 2、实现配置的自动刷新 ----------- 3、实现加载多个配置文件 ------------
Spring Cloud Alibaba系列之Nacos分布式配置中心
Spring Cloud Alibaba系列之Nacos分布式配置中心 1、前言介绍 ------ Spring Cloud Alibaba Nacos Config提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持,nacos config是Spring Cloud config Server和
Spring Cloud Alibaba系列之快速开始搭建Nacos环境
1、前言介绍 ------ 前言:本实验介绍如何搭建Spring Cloud Alibaba Nacos的服务端,nacos server是一个服务注册中心也是一个分布式配置中心 2、实验环境准备 -------- * 实验环境准备 * 64bit Git Server * 64bit JDK 1.8+ * Ma
Spring Cloud Alibaba系列(二)nacos作为服务配置中心
Spring Cloud Alibaba系列(二)nacos作为服务配置中心 Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部
Spring Cloud for Alibaba 之 Nacos注册中心 & 应用启动(2)
    Nacos 启动后,开始建立几个应用,模仿微服务!    项目的git 地址为: https://github.com/xujianguo1/alicloud-demo.git     分支&tagName:ServiceInit **一、 pom 与 配置** 用Dubbo 与Nacos 建立微服务,需要引入Dubbo Starter、D
Spring cloud nacos config 配置中心例子
Spring cloud 集成 nacos config配置中心的例子,自定义 dataId groupId namespace  使用的依赖 <dependencies> <dependency> <groupId>org.springframework.boot</gr
SpringCloud Gateway 身份认证
使用SpringCloud技术栈搭建微服务集群,可以选择的组件比较多,由于有些组件已经闭源或停更,这里主要选用`spring-cloud-alibaba`作为我们的技术栈。 * 服务注册与发现: `nacos-discovery` * 统一配置管理:`nacos-config` * 微服务网关:`spring cloud gateway` 由
SpringCloudAlibaba(1)
Nacos官网 [https://nacos.io/zh-cn/docs/quick-start.html](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fnacos.io%2Fzh-cn%2Fdocs%2Fquick-start.html) 下载Nacos [https://git