@ConfigurationProperties结合Nacos配置动态刷新之底层原理分析

Hello,我是大都督周瑜,本文给大家分析一下@ConfigurationProperties结合Nacos配置动态刷新的底层原理,记得点赞、关注、分享哦!

公众号:IT周瑜

应用背景

假如在Nacos中有Data ID为common.yml的配置项:

model:name: gpt-4

在应用的application.yml中进行导入:

spring:config:import: optional:nacos:common.yml

对应Properties类为ModelProperties

@Data
@Component
@ConfigurationProperties(prefix = "model")
public class ModelProperties {private String name;
}

ZhouyuService中使用ModelProperties:

@Service
public class ZhouyuService {@Resourceprivate ModelProperties modelProperties;public String test() {return modelProperties.getName();}
}

直接在Nacos中进行配置修改,ZhouyuService都能及时获取到最新的配置,注意这里的用法为modelProperties.getName()

原理分析

先在ZhouyuService中进行Debug,查看配置更新前后ModelProperties对象是否是同一个对象。

配置更新前:
image.png

配置更新后:
image.png

对象是同一个,但属性值发生了变化,所以底层原理应该是:Nacos客户端监听到配置发生了变化之后,会找到ModelProperties对象,然后调用name的set方法进行属性值的更新

启动过程的初始化

首先,在Spring Cloud中,定义了一个ConfigurationPropertiesBeansBean对象,它有两个功能:

  1. 首先,它是一个BeanPostProcessor
  2. 其次,它里面有一个Map<String, ConfigurationPropertiesBean>类型的beans属性

image.png

作为BeanPostProcessor,在它的初始化前方法中,会对Spring容器中的每个Bean对象进行判断,会过滤出那些加了@ConfigurationProperties注解的Bean,在本文中,指的就是ModelProperties对象,找到ModelProperties对象后,会把它包装为一个ConfigurationPropertiesBean对象,并存在beans这个Map中,后续配置发生变化时,会从beans中取出ModelProperties对象并进行属性值的更新。

另外,Nacos的自动配置类NacosConfigAutoConfiguration中提供了一个NacosContextRefresher的Bean对象,它是一个ApplicationListener,它监听了ApplicationReadyEvent事件:
image.png
在Spring Boot启动过程的最后,Spring Boot会发布ApplicationReadyEvent事件,从而触发NacosContextRefresher的事件处理逻辑,NacosContextRefresher接收到ApplicationReadyEvent事件后,会向Naocs客户端的ConfigService中注册一个Nacos配置监听器,用来监听Naocs服务端配置的改变。
image.png

因此在Spring Boot启动过程中,核心会做两件事:

  1. 找到加了@ConfigurationProperties注解的Bean,并存下来
  2. 注册一个Nacos的配置监听器

配置发生变化时

一旦Nacos服务端的配置发生了变化,就会触发执行Nacos客户端的配置监听器,配置监听器会利用Spring容器发布一个RefreshEvent事件,该事件是Spring Cloud定义的。

Spring Cloud中定义了一个RefreshEventListener,就是用来处理RefreshEvent事件的:
image.png

而它的核心逻辑是更新Spring容器的Environment对象:
image.png

我们可以把Environment对象理解为Nacos服务端的配置项在客户端的本地缓存,因此Nacos客户端一旦发现服务端配置发生了改变,就会发布RefreshEvent事件,从而将Environment对象中的缓存的配置项更新为新值。

同时,在更新完Environment对象后,会再次利用Spring容器发布一个EnvironmentChangeEvent事件。

在Spring Cloud中,还定义了一个ConfigurationPropertiesRebinderBean对象:
image.png
它会处理EnvironmentChangeEvent事件,它会用到前面提到的ConfigurationPropertiesBeans对象,遍历它的Map中所存的那些加了@ConfigurationProperties注解的Bean:
image.png
比如ModelProperties对象,并针对每个Bean进行rebind()操作。

所谓rebind()操作,其实就是先从容器中获取到指定的Bean对象,也就是加了@ConfigurationProperties注解的Bean对象,先进行Bean销毁,再进行Bean初始化:
image.png

而Bean的初始化过程中,会执行到ConfigurationPropertiesBindingPostProcessor中的初始化前方法,会对ModelProperties对象重新进行bind:
image.png

而bind的过程,就是利用Environment对象中的值更新ModelProperties对象中的属性,从而完成配置的刷新,这块细节暂时就不分析了。

总结

当Nacos服务端的配置发生改变时,会触发Nacos客户端的配置监听器,从而发布RefreshEvent事件,从而更新Environment对象,从而发布EnvironmentChangeEvent事件,从而利用最新的Environment对象更新ModelProperties对象中的属性。

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

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

相关文章

上海一儿童写真馆摄影师大量售卖女童照片!当你的肖像权或隐私权被侵犯时应如何写起诉状?

上海一儿童写真馆摄影师大量售卖女童照片&#xff01;当你的肖像权或隐私权被侵犯时应如何写起诉状&#xff1f; 近日&#xff0c;上海市一儿童写真馆摄影师被指大量售卖女童的照片和特写花絮。对此&#xff0c; 上海市公安局徐汇分局发布了警情通报&#xff08;见下图&#x…

VLDB ’25 最后 6 天截稿,58 个顶会信息纵览;ISPRS 城市分割数据集上线

「顶会」板块上线 hyper.ai 官网啦&#xff01;该板块为大家提供最新最全的 CCF A 类计算机顶会信息&#xff0c;包含会议简介、截稿倒计时、投稿链接等。 你是不是已经注册了顶会&#xff0c;但对截稿时间较为模糊&#xff0c;老是在临近 ddl 时才匆忙提交&#xff1b;又或者…

K8s 部署prometheus

文章目录 K8s 部署prometheuskube-prometheus 部署部署流程安装卸载补充 K8s 部署prometheus kube-prometheus 部署 kube-prometheus 是 github 上开源的整合了 prometheus alertmanager granfana 等监控工具的项目&#xff0c;github地址 如果github 访问不了的也可以选择 g…

Dropzone 4 for Mac:一拖即达,文件处理更高效!

在繁忙的工作中&#xff0c;你是否曾因频繁切换应用程序和文件夹而烦恼&#xff1f;Dropzone 4 for Mac&#xff0c;这款强大的文件拖拽操作工具&#xff0c;将彻底改变你的工作方式&#xff01; 只需简单地将文件、文本或图片拖放到Dropzone图标上&#xff0c;即可快速执行各种…

mysql实战——Mysql8.0高可用之双主+keepalived

一、介绍 利用keepalived实现Mysql数据库的高可用&#xff0c;KeepalivedMysql双主来实现MYSQL-HA&#xff0c;两台Mysql数据库的数据保持完全一致&#xff0c;实现方法是两台Mysql互为主从关系&#xff0c;通过keepalived配置VIP&#xff0c;实现当其中的一台Mysql数据库宕机…

四川景源畅信:新人做抖店的成本很高吗?

随着社交媒体的兴起&#xff0c;抖音成为了一个新兴的电商平台——抖店。不少创业者和商家看中了其庞大的用户基础&#xff0c;想要通过开设抖店来拓展销路。然而&#xff0c;对于刚入行的新手来说&#xff0c;成本问题总是让人犹豫不决。究竟新人做抖店的成本高不高?本文将围…

YOLOv10:实时端到端目标检测

Ao Wang Hui Chen∗  Lihao Liu Kai Chen Zijia Lin  Jungong Han Guiguang Ding Tsinghua University Corresponding Author. 文献来源&#xff1a;中英文对照阅读 摘要 在过去的几年里&#xff0c;YOLO 因其在计算成本和检测性能之间的有效平衡而成为实时目标检测领…

纯干货:做好数据库防泄密的关键

在当今数字化时代&#xff0c;数据库的安全与保密性对于企业和个人来说至关重要。数据库防泄密工作涉及到多种技术和策略&#xff0c;其中沙盒技术作为一种强大的安全机制&#xff0c;为数据库防泄密提供了新的可能性。那么&#xff0c;我们是否可以通过沙盒来实现数据库防泄密…

2024年5月22日 (周三) 叶子游戏新闻

《奇星协力》Steam抢先体验开启 求生城市建造Leikir Studio工作室开发的一款求生城市建造新游《奇星协力》Steam抢先体验开启&#xff0c;限时九折优惠&#xff0c;本作支持中文&#xff0c;感兴趣的玩家可以关注下了。 《原神》预告4.7版本前瞻特别节目 5月24日播出5月22日&am…

基于FPGA实现LED的闪烁——HLS

基于FPGA实现LED的闪烁——HLS 引言&#xff1a; ​ 随着电子技术的飞速发展&#xff0c;硬件设计和开发的速度与效率成为了衡量一个项目成功与否的关键因素。在传统的硬件开发流程中&#xff0c;工程师通常需要使用VHDL或Verilog等硬件描述语言来编写底层的硬件逻辑&#xff0…

Docker 基础使用 (1)

文章目录 Docker 软件安装Docker 镜像仓库Docker 仓库指令Docker 镜像指令Docker 容器指令Docker 使用实例 —— 搭建 nginx 服务nginx 概念nginx 使用用 docker 启动 nginx 侧重对docker基本使用的概览。 Docker 软件安装 Linux Ubuntu 依次执行以下指令即可 # 更新软件包列…

第十二周 5.20 面向对象的三大特性(封装、继承、多态)(一)

一、封装 1.目前的程序无法保证数据的安全性、容易造成业务数据的错误 2.private:私有的&#xff0c;被private修饰的内容只能在本类中访问 3.为私有化的属性提供公开的get和set方法 (1)get方法&#xff0c;获取私有化属性的值&#xff1a; public 返回值类型 get属性名…

[SWPUCTF 2022 新生赛]奇妙的MD5... ...

目录 [SWPUCTF 2022 新生赛]奇妙的MD5 [GDOUCTF 2023]受不了一点 [LitCTF 2023]作业管理系统 注入点一&#xff1a;文件上传 注入点二&#xff1a;创建文件直接写一句话木马 注入点三&#xff1a;获取数据库备份文件 [LitCTF 2023]1zjs [SWPUCTF 2022 新生赛]奇妙的MD5 …

生成式AI的GPU网络技术架构

生成式AI的GPU网络 引言&#xff1a;超大规模企业竞相部署拥有64K GPU的大型集群&#xff0c;以支撑各种生成式AI训练需求。尽管庞大Transformer模型与数据集需数千GPU&#xff0c;但实现GPU间任意非阻塞连接或显冗余。如何高效利用资源&#xff0c;成为业界关注焦点。 张量并…

单调栈--

1.每日温度 那么单调栈的原理是什么呢&#xff1f;为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢&#xff1f; 单调栈的本质是空间换时间&#xff0c;因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素&#xff0c;优点是整个数…

利用迭代方法求解线性方程组(Matlab)

一、问题描述 利用迭代方法求解线性方程组。 二、实验目的 掌握Jacobi 方法和Gauss-Seidel 方法的原理&#xff0c;能够编写代码实现两种迭代方法&#xff1b;能够利用代码分析线性方程组求解中的误差情况。 三、实验内容及要求 用代码实现&#xff1a;对下列方程中重新组织…

基于盲源分离和半盲源分离的心电信号伪影消除方法(MATLAB 2018)

心电信号是通过测量放置在人体皮肤上的电极之间的电位差来获取的&#xff0c;其本身具有信号微弱、频段低、不稳定等特性。因此ECG信号在实际采集时极易受到不同噪声的影响&#xff0c;这会造成心电图本身的波形形态特征的失真&#xff0c;从而导致错误诊断和对患者的不当治疗。…

2024年5月软考成绩什么时候出?附查询方式

2024年5月软考成绩查询时间及查询方式&#xff1a; 查询时间&#xff1a;预计在2024年7月上旬进行。 查询方式&#xff1a; 方式一&#xff1a;登陆中国计算机技术职业资格网&#xff08;www.ruankao.org.cn&#xff09;&#xff0c;点击报名系统&#xff0c;输入注册账号和…

echart图表legend每列固定宽度

修改前&#xff1a; 修改后&#xff1a; 关键代码&#xff1a; 设置一个背景并使之透明&#xff0c;否则宽度不生效&#xff0c;配合formatter使用 formatter: {a|{name}},rich:{a: {width: 48,fontSize: 12,backgroundColor: "rgba(11, 39, 52, 0)" // 关键代码&a…

高效编写大模型 Prompt 提示词,解锁 AI 无限创意潜能

随着 ChatGPT 的出现&#xff0c;AI 成为新的焦点&#xff0c;有人说过“未来 50%的工作将是提示词工作”&#xff0c;目前很多公司也在开始招聘 Prompt 提示词工程师。Prompt&#xff08;提示词&#xff09;成为了连接创意与技术的桥梁&#xff0c;它不仅是简单的指令&#xf…