【深入理解SpringCloud微服务】深入理解nacos配置中心(一)——宏观理解nacos配置中心原理

news2024/9/20 8:44:15

【深入理解SpringCloud微服务】深入理解nacos配置中心(一)——宏观理解nacos配置中心原理

  • 简单介绍
  • 原理分析
    • 客户端启动
    • 服务端启动
    • 配置新增或修改
    • 客户端监听配置变更并刷新

nacos既是一个注册中心也是一个配置中心,它是二合一的。作为注册中心的原理和源码,前面的文章已经介绍过,今天开始分析nacos作为配置中心的原理和源码。

简单介绍

nacos配置中心的作用就是在微服务架构中负责集中管理各个微服务工程的配置文件,原先散落到各个微服务本地的配置文件,现在都集中存储到nacos上,这样更方便管理和维护。

在这里插入图片描述

nacos配置中心客户端以jar包的形式被各微服务引入,然后微服务启动的时候,会通过nacos配置中心客户端请求nacos服务端拉取该微服务对应的配置,然后把拉取到的配置加载到Environment中。

在这里插入图片描述
nacos有一个控制台界面,可以在上面修改配置信息。当nacos上的某个配置文件的配置被修改,nacos会通知对应的客户端发生配置变更,客户端接收到配置变更通知后,会请求nacos拉取最新的配置,并覆盖到Environment。
在这里插入图片描述

原理分析

下面我们从宏观的角度分析nacos的原理,不涉及到源码的解读,源码会在后续的文章中解析。

客户端启动

这里要先了解spring-cloud-context的一个接口PropertySourceLocator。

SpringBoot在启动之后,会在启动流程执行到prepareContext()方法时调用PropertySourceLocator的locate()方法,这个方法是为Environment获取配置信息用的,获取到的配置信息封装为PropertySource对象返回,然后被SpringBoot加载到Environment中。

在这里插入图片描述

nacos实现了Spring的PropertySourceLocator接口,实现类是NacosPropertySourceLocator。

在这里插入图片描述
在NacosPropertySourceLocator的locate()方法里面,会请求nacos服务端拉取配置信息,然后将配置信息放入到PropertySource对象返回。

在这里插入图片描述

NacosPropertySourceLocator的locate()方法里面,是通过NacosConfigService获取的,NacosConfigService会通过RPC远程调用请求到nacos服务端。

在这里插入图片描述

服务端启动

nacos配置中心服务端启动时,会调用DumpService从数据库中分页查询配置信息,如果我们配置的是存储到MySQL,那么就是分页查询MySQL中存储的配置信息。然后DumpService会调用ConfigCacheService把查询到的配置信息dump到磁盘成为一个一个的配置文件(xxx.yaml、xxx.properties),每个DataId对应一个配置文件。

在这里插入图片描述

然后服务端接收到获取配置文件的请求时,是从磁盘中查询对应文件返回的,而不是去查询数据库,因此我们如果直接在MySQL中修改配置信息,客户端是感知不到的。

在这里插入图片描述

除此以外ConfigCacheService还会给每个配置文件算出一个MD5值,然后根据dataId、group、tenant三元组得到一个key,把key与该MD5值缓存起来。

最后ConfigCacheService异步给客户端发送一个配置变更通知。

在这里插入图片描述

那么加上客户端启动的流程,目前的整体流程是这样:

在这里插入图片描述

配置新增或修改

当我们在nacos-console控制界面上新增或修改了配置并发布后,就会通过http请求调用到ConfigController的publishConfig()方法。

ConfigController的publishConfig()方法会马上把新增或修改的配置持久化到MySQL。

配置持久化到MySQL之后,会异步的进行配置dump到磁盘文件以及在nacos集群间的同步。

配置dump到磁盘文件还是通过DumpService进行,先把新增或修改的配置dump到磁盘文件,然后根据文件内容算出一个MD5值与缓存中的MD5值进行比较,发现两MD5值不一致,说明发生了配置内容的变更,需要更新MD5值并通知客户端。

在这里插入图片描述

加上前面的客户端和服务端的启动流程,目前的整体流程是这样子:

在这里插入图片描述

客户端监听配置变更并刷新

在nacos配置中心客户端启动的时候,会监听通过NacosContextRefresher监听ApplicationReadyEvent事件。

在SpringBoot启动完成后,会调用发布ApplicationReadyEvent事件,NacosContextRefresher会监听到该事件,并进行处理。

NacosContextRefresher会给当前客户端引用的每个配置文件创建一个CacheData对象并在其中添加一个监听器Listener。这个Listener不是Spring事件监听机制的Listener,是nacos定义的一个Listener接口。

这里添加的这个Listener,它的作用就是在监听到有配置变更时发布一个RefreshEvent事件。

在这里插入图片描述

这个CacheData对象包含了配置文件的dataId、group、tenant(也就是namespace)、配置文件内容content,配置文件MD5,,监听器列表listeners等。

在这里插入图片描述

在nacos配置中心客户端启动的时候,会创建NacosConfigService,在NacosConfigService的构造方法中会创建ClientWorker,在ClientWorker初始化时会启动定时任务。

ClientWorker的定时任务会通过http请求获取服务端中发生变更的DataID列表,然后根据这些DataID列表请求对应的配置文件内容content,再把content赋值到CacheData并重新计算MD5值,然后跟CacheData的listeners中每个Listener保存的老MD5值比较,如果不一致,就会调用Listener的receiveConfigInfo()方法,而NacosContextRefresher中添加的Listener的receiveConfigInfo()方法就会发布一个RefreshEvent事件。

在这里插入图片描述

发布的RefreshEvent事件是Spring事件监听机制的事件对象,会被RefreshEventListener监听并接收,RefreshEventListener会进行配置的刷新处理。这个RefreshEventListener是spring-cloud-context包中的对象,也就是说配置刷新是spring-cloud提供的公共逻辑,不是nacos实现的,nacos只要发布一个RefreshEvent事件即可触发。

在这里插入图片描述

综上所述,nacos配置中心的整个宏观流程就是一下这样:

在这里插入图片描述

这里只是对nacos的大体流程梳理了一下,还没有涉及到源码的分析,源码的分析会在后续的文章中展开描述。

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

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

相关文章

c# 笔记 winform添加右键菜单,获取文件大小 ,多条件排序OrderBy、ThenBy,list<double>截取前5个

Winform右键菜单‌ 要在C# Winform应用程序中添加右键菜单,‌你可以按照以下步骤操作:‌ 1.‌创建菜单项‌ 在Form的构造函数或加载事件中,‌创建ContextMenuStrip控件的实例,‌并为其添加菜单项。‌ 2.‌绑定到控件‌ 将Con…

YOLOv9修改检测框颜色,粗细,标签大小,标签名称

在检测结果图中,官方的检测样式可能不满足我们的需求,常常修改更改检测框的颜色,粗细,标签背景颜色,大小,标签名称等内容,下面就介绍一下,这些地方如何修改。 在YOLOv9的源代码中&a…

基于ssm的实习课程管理系统/在线课程系统

实习课程管理系统 摘 要 互联网的快速发展,给各行各业带来不同程度的影响,悄然改变人们的生活、工作方式,也倒逼很多行业创新和变革,以适应社会发展的变化。人们为了能够更加方便地管理项目任务,实习课程管理系统被人们…

视频和音频合成视频Easy_Wav2Lip

Easy_Wav2Lip 是使用视频和音频合成新的视频 Easy-WAV2lip是目前最成熟的数字人口型算法。 用时以及效率来说,三大主流算法 WAV2lip、Geneface、AD-Nerf。WAV2lip>Geneface=AD-Nerf 1. 整体流程 第一步,加载视频/图片和音频/tts。…

喵喵在CSDN的2048天(创作纪念日)

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

OJ-0830**

题目 示例1 输入: ABC ABC 输出: 3示例2 输入: ABCABBA CBABAC 输出: 9解题思路 动态规划 首先,我们可以定义一个二维数组 dp,其中 dp[i][j] 表示从字符串A的前i个字符到字符串B的前j个字符的最短距离。…

DDR3详解

1.DDR3简介 DDR3 SDRAM,全称第三代双倍速率同步动态随机存取存储器,简称 DDR3,双倍速率(double-data-rate),是指时钟的上升沿和下降沿都发生数据传输;同步,是指DDR3数据的读取写入是…

Linux教程六:文件目录类命令ls、cd(图文详解)

默认登录出现一个[用户localhost ~] 代表时登陆用户的家目录 1、 Linux ls命令 基本用法 ls:列出当前目录下的文件和目录(不包括以.开头的隐藏文件)。ls 目录名:列出指定目录下的文件和目录。 常用选项 -l:以长格式列出…

利用开源 AI 智能名片 O2O 商城系统提升饭店私域流量

摘要:本文旨在探讨如何通过设计门店裂变方式,结合开源 AI 智能名片 O2O 商城系统,将私域流量转化为自然流量,以促进饭店业务增长。通过在餐桌上放置个人微信二维码台卡、提供福利套餐和折扣、创建饭圈社群等方式,吸引用…

Vue.js入门系列(十九):深入理解和应用组件自定义事件

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

python-奥运奖牌计数

题目描述 2008 年北京奥运会,A 国的运动员参与了 n 天的决赛项目 (1≤n≤100)。现在要统计一下 A 国所获得的金、银、铜牌数目及总奖牌数。输入第 1 行是 A 国参与决赛项目的天数 n,其后 n 行,每一行是该国某一天获得的金、银、铜牌数目&…

小程序连接MQTT服务器,以及配置,避坑

1、MQTT服务器域名配置 由于小程序必须使用域名方式连接socket,所以必须为MQTT服务器配置域名,并配置SSL证书。 1.1相关文档: EMQX 企业版安装 | EMQX 企业版 4.4 文档 EMQX MQTT 微信小程序接入 | EMQX 4.2 文档 MQTT 下载引入和配置连…

【图像去噪】论文精读:Multi-level Wavelet-CNN for Image Restoration(MWCNN)

请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中…

Spring入门之IOC(包含实例代码)

目录 什么是Spring?什么是Spring IOC?如何创建一个Spring IOC项目?1. 导入Maven项目依赖2. 准备一个实体类(先定义接口再实现)3. 准备配置文件4. 在Test类中测试 IOC中的Bean管理实例化Bean的三种方式 什么是Spring&am…

微信中如何搜索附近的人

我们 微信 下面选择 发现 然后 点卷 附件 进入后 头上的页签 切换成 附件的人 在列表中点击后即可添加附件的人啦

鸿蒙启动框架配置文件(StartUpTask)

{"startupTasks": [//有哪些任务{"name": "StartupTask_001",//任务名字"srcEntry": "./ets/startup/StartupTask_001.ets",//任务的文件路径"runOnThread": "taskpool",//运行在哪个现成,有…

泰克TDP1000差分探头Tektronix TDP0500参数资料

泰克Tektronix TDP0500 TDP1000 高压差分探头 ​Tektronix TDP1000 高压差分探头是一款多功能且易于使用的探头,可提供开关电源、CAN/LIN 总线和高速数字系统设计所需的高速电气和机械性能。Tektronix TDP1000 探头专为与 TekVPI 探头接口或 TekProbe BNC 接口配…

Java:路径计算与障碍物处理

Java 实现寻找字符串数组中的最长公共前缀及不同路径数量计算(含障碍物) 在计算机科学和软件开发中,经常需要解决一些基本但实用的问题。本文将介绍两种常见问题的解决方案:一是从一组字符串中找出最长公共前缀;二是计…

能力驱动的企业战略转型:基于能力规划的战略转型与数字化实践全指南

在当今数字化和全球化加速发展的时代,企业面临着复杂的市场环境和迅速变化的客户需求。为了在竞争中脱颖而出,企业必须不仅制定卓越的战略,还需确保这些战略能够有效地转化为实际行动。基于能力规划(Capability-Based Planning, C…

Lua 代码编码规范

lua代码格式 vscode stylua 插件 配置文件stylua.toml column_width 240 line_endings “Unix” indent_type “Spaces” --使用空格 很重要,保证不同编辑器打开是一样的 indent_width 4 quote_style “AutoPreferDouble” --字符串引号样式双引号 call_paren…