Nacos架构与原理 - 配置模型

news2025/1/20 14:52:15

文章目录

  • 背景
  • 概念介绍
    • 配置(Configuration)
    • 配置管理 (Configuration Management)
    • 配置服务 (Configuration Service)
    • 配置项(Configuration Item)
    • 配置集(Configuration Set)
    • 命名空间(Namespace)
    • 配置组(Group)
    • 配置 ID(Data ID)
    • 配置快照(Configuration Snapshot)
  • Nacos 配置模型
    • 基础模型
    • 配置资源模型
    • 配置存储模型(ER 图)

在这里插入图片描述


背景

在单体架构的时候我们可以将配置写在配置文件中,但有⼀个缺点就是每次修改配置都需要重启服务才能生效。

当应用程序实例比较少的时候还可以维护。如果转向微服务架构有成百上千个实例,每修改⼀次配置要将全部实例重启,不仅增加了系统的不稳定性,也提高了维护的成本。

在这里插入图片描述
那么如何能够做到服务不重启就可以修改配置?所有就产生了四个基础诉求:

 需要支持动态修改配置

 需要动态变更有多实时

 变更快了之后如何管控控制变更风险,如灰度、回滚等

 敏感配置如何做安全配置

在这里插入图片描述


概念介绍

配置(Configuration)

在系统开发过程中通常会将⼀些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。

配置管理⼀般包含在系统部署的过程中,由系统管理员或者运维人员完成这个步骤。配置变更是调整系统运行时的行为的有效手段之⼀。


配置管理 (Configuration Management)

在 Nacos 中,系统中所有配置的存储、编辑、删除、灰度管理、历史版本管理、变更审计等所有与配置相关的活动统称为配置管理。


配置服务 (Configuration Service)

在服务或者应用运行过程中,提供动态配置或者元数据以及配置管理的服务提供者.


配置项(Configuration Item)

⼀个具体的可配置的参数与其值域,通常以 param-key = param-value 的形式存在。

例如我们常配置系统的日志输出级别(logLevel = INFO | WARN | ERROR) 就是⼀个配置项。


配置集(Configuration Set)

⼀组相关或者不相关的配置项的集合称为配置集。

在系统中,⼀个配置文件通常就是⼀个配置集,包含了系统各个方面的配置。例如,⼀个配置集可能包含了数据源、线程池、日志级别等配置项。


命名空间(Namespace)

用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。

Namespace 的常用场景之⼀是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如数据库配置、限流阈值、降级开关)隔离等。

如果在没有指定 Namespace 的情况下,默认使用 public 命名空间


配置组(Group)

Nacos 中的⼀组配置集,是配置的维度之⼀。通过⼀个有意义的字符串(如 ABTest 中的实验组、对照组)对配置集进行分组,从而区分 Data ID 相同的配置集。

当您在 Nacos 上创建⼀个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。

配置分组的常见场景:不同的应用或组件使用了相同的配置项,如 database_url 配置和 MQ_Topic 配置。


配置 ID(Data ID)

Nacos 中的某个配置集的 ID。配置集 ID 是划分配置的维度之⼀。Data ID 通常用于划分系统的配置集。

⼀个系统或者应用可以包含多个配置集,每个配置集都可以被⼀个有意义的名称标识。Data ID 尽量保障全局唯⼀,可以参考 Nacos Spring Cloud 中的命名规则:

${prefix}-${spring.profiles.active}-${file-extension}

配置快照(Configuration Snapshot)

Nacos 的客户端 SDK 会在本地生成配置的快照。当客户端无法连接到 Nacos Server 时,可以使用配置快照显示系统的整体容灾能力。

配置快照类似于 Git 中的本地 commit,也类似于缓存,会在适当的时机更新,但是并没有缓存过期(expiration)的概念。


Nacos 配置模型

基础模型

在这里插入图片描述

  1. Nacos 提供可视化的控制台,可以对配置进行发布、更新、删除、灰度、版本管理等功能。
  2. SDK 可以提供发布配置、更新配置、监听配置等功能。
  3. SDK 通过 GRPC 长连接监听配置变更,Server 端对比 Client 端配置的 MD5 和本地 MD5是否相等,不相等推送配置变更。
  4. SDK 会保存配置的快照,当服务端出现问题的时候从本地获取。

配置资源模型

Namespace 的设计就是用来进行资源隔离的,我们在进行配置资源的时候可以从以下两个角度来看:

  • 从单个租户的角度来看,我们要配置多套环境的配置,可以根据不同的环境来创建 Namespace 。比如开发环境、测试环境、线上环境,我们就创建对应的 Namespace(dev、test、prod),Nacos 会自动生成对应的 Namespace Id 。如果同⼀个环境内想配置相同的配置,可以通过Group 来区分。如下图所示:

在这里插入图片描述

  • 从多个租户的角度来看,每个租户都可以有自己的命名空间。我们可以为每个用户创建⼀个命名空间,并给用户分配对应的权限,比如多个租户(zhangsan、lisi、wangwu),每个租户都想有⼀套自己的多环境配置,也就是每个租户都想配置多套环境。那么可以给每个租户创建⼀个 Namespace (zhangsan、lisi、wangwu)。同样会生成对应的 Namespace Id。然后使用 Group 来区分不同环境的配置。如下图所示

在这里插入图片描述


配置存储模型(ER 图)

在这里插入图片描述
Nacos 存储配置有几个比较重要的表分别是:

 config_info 存储配置信息的主表,里面包含 dataId、groupId、content、tenantId、encryptedDataKey 等数据。

 config_info_beta 灰度测试的配置信息表,存储的内容和 config_info 基本相似。有⼀个 beta _ips 字段用于客户端请求配置时判断是否是灰度的 ip。

 config_tags_relation 配置的标签表,在发布配置的时候如果指定了标签,那么会把标签和配置的关联信息存储在该表中。

 his_config_info 配置的历史信息表,在配置的发布、更新、删除等操作都会记录⼀条数据,可以做多版本管理和快速回滚。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/625547.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python中如何实现print不换行

Python中如何实现print不换行 在编写Python程序时,我们经常需要使用print语句来输出信息。然而,有时候我们希望在输出信息时不换行,而是将多个输出信息打印在同一行上。这里介绍几种Python中print不换行的方式。 方法一:使用逗号…

Redis7分布式缓存

Redis7分布式缓存 一、Redis入门概述1.主流功能与应用2.命名规则 二、Redis 10 大数据类型1.redis字符串 (String)2. redis列表 (List)3. redis哈希表 (Hash)4. redis集合 (Set)5. redis有序集合 (ZSet)6. redis地理空间(GEO)7. redis基数统计 (HyperLogLog)8. redis位图 (bitm…

wavemlp怎么运行的

1.首先,输入进来的x是batchsize,64,256,256尺寸的。 他会用四个不同的conv组合,theta组合是由二维卷积(batchnorm和relu的),得到两个值。 而,x_h和x_w都是通过一个简单…

JavaSE笔记(四)重制版

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eFLuY3vJ-1685927553034)(https://s2.loli.net/2022/09/22/lmKBNFc5wPEgjaS.png)] 面向对象高级篇 经过前面的学习,我们已经了解了面向对象编程的大部分基础内容,这一部分&…

一种新颖的智能优化算法—海鸥优化(SOA)算法

目录 一、SOA理论基础 二、ACO数学模型 2.1 迁徙 2.2 攻击 三、SOA伪代码 四、SOA运行结果 海鸥优化算法(Seagull Optimization Algorithm, SOA)是在2019年由 Dhiman 提出的一种受自然界海鸥启发的新颖全局优化算法,模拟了海鸥群体的迁徙和攻击行为。 一、SOA…

chatgpt赋能python:Python中如何实现1到100的循环?

Python中如何实现1到100的循环? 在Python中,实现1到100的循环非常简单。我们可以通过for循环、while循环和列表生成式来实现这个任务。 1. 使用for循环实现1到100的循环 使用for循环可以让我们轻松地遍历从1到100的整数。这种方法很适合在循环中需要进…

chatgpt赋能python:Python中的UTF-8

Python中的UTF-8 什么是UTF-8? 在开始介绍Python中的UTF-8,让我们先了解什么是UTF-8。UTF-8是一种Unicode字符集的编码方法,可以表示全球范围内的字符集,包括机器语言和人类语言。 Python和UTF-8 Python是一种高级编程语言&am…

工作基础知识

fpga 什么是fpga FPGA 是一种硬件可重构的体系结构。它的英文全称是Field Programmable Gate Array,中文名是现场可编程门阵列。 FPGA就是一个可以通过编程来改变内部结构的芯片。 FPGA 是在硅片上预先设计实现的具有可编程特性的集成电路,它能够按照…

完全卸载mysql教程

引言 很多人因为第一次安装mysql导致安装错误,或者安装的数据库版本太高,比如mysql8.0版本,出现了很多问题,导致数据库无法使用,或者一些图形界面无法操作,想要卸载,重装稳定的mysql数据库&…

一种新型智能优化算法—平衡优化算法(EO)

目录 一、EO理论基础 二、EO数学模型 2.1 种群初始化 2.2 建立平衡状态池 2.3 指数项 2.4 生成速率 2.5 更新解 三、EO流程图 四、EO运行结果 平衡优化器(Equilibrium Optimizer,EO)。该算法由Afshin Faramarzi等人于2020年提出的一种新型元启发式优…

JavaSE笔记(七)重制版

多线程与反射 前面我们已经讲解了JavaSE的大部分核心内容,最后一章,我们还将继续学习JavaSE中提供的各种高级特性。这些高级特性对于我们之后的学习,会有着举足轻重的作用。 多线程 **注意:**本章节会涉及到 操作系统 相关知识…

【Simulink】基于FCS-MPC的单相并网逆变器控制(Matlab Function)

之前写过【Simulink】基于FCS-MPC的三相并网逆变器控制(Matlab Function)以及 【Simulink】基于FCS-MPC的三相并网逆变器控制(Stateflow),控制对象都是三相逆变器,本篇博客将研究单相逆变器。 FCS-MPC控制…

chatgpt赋能python:Python一行输入两个数:简单又高效

Python一行输入两个数:简单又高效 作为一名有10年Python编程经验的工程师,我深知Python的简洁和高效。Python作为一种强大的编程语言,具有很多功能强大的工具和库。一行输入两个数也不例外。在本文中,我将介绍Python中一行输入两…

chatgpt赋能python:Python怎么post请求

Python怎么post请求 Python作为一种高级编程语言,拥有丰富的库和模块来处理各种编程任务。其中,处理网络请求和数据交互是Python非常擅长的领域之一。在Python中,我们可以使用标准库或第三方库的HTTP模块来实现HTTP协议的请求和响应。 本篇…

JavaSSM笔记(一)

**建议:**对Java开发还不是很熟悉的同学,最好先花费半个月到一个月时间大量地去编写小项目,不推荐一口气学完,后面的内容相比前面的内容几乎是降维打击,一口气学完很容易忘记之前所学的基础知识,尤其是Java…

TypeScript核心基础

前言 为了方便我们直接使用脚手架让他帮我们直接编译就完事了 创建一个 Vue 应用 前提条件 熟悉命令行已安装 16.0 或更高版本的 Node.js npm init vuelatest 这一指令将会安装并执行 create-vue,它是 Vue 官方的项目脚手架工具。你将会看到一些诸如 TypeScript 和测…

JavaSE笔记(三)重置版

面向对象基础篇 我们在前面已经学习了面向过程编程,也可以自行编写出简单的程序了。我们接着就需要认识 面向对象程序设计(Object Oriented Programming)它是我们在Java语言中要学习的重要内容,面向对象也是高级语言的一大重要特…

Qt 编译使用Quazip库

1. 编译zlib quazip库是基于Qt的压缩解压库,使对zlib库的封装。因此要使用quazip库就需要先编译zlib。 下载zlib 。 为了在Qt中使用,编译环境统一使用Qt的MinGW工具链。 解压源码,打开Qt的MinGW命令行控制台。 make -f ./win32/Makefile.…

chatgpt赋能python:Python中如何3个3个切片

Python中如何3个3个切片 在Python中,我们可以使用切片(Slicing)操作来获取列表、元组、字符串等容器中的子集。而在某些情况下,我们需要按照一定规律切片,比如每三个元素切成一组。那么在Python中,我们该怎…

4. Response对象的7个属性

4. Response对象的7个属性 文章目录 4. Response对象的7个属性1. Response对象的属性(属性变量)2. 网页源代码3. 人工查看网页源代码4. Response对象的7个属性5. 总结 1. Response对象的属性(属性变量) 【代码示例】 # 1.导入库…