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

news2024/11/26 6:50:35

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 {

    @Resource
    private 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.coloradmin.cn/o/1708778.html

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

相关文章

Pytorch 1.9.0环境安装

pytorch官方链接: https://pytorch.org/get-started/previous-versions/ 安装指令&#xff1a;conda install pytorch1.9.0 torchvision0.10.0 torchaudio0.9.0 cudatoolkit11.3 -c pytorch -c conda-forge 报错&#xff1a;Solving environment: unsuccessful initial attemp…

「Python Socket超能力:网络世界的隐形斗篷!」

Hi&#xff0c;我是阿佑&#xff0c;今天将带领大家揭开Python Socket编程的神秘面纱&#xff0c;赋予我们的网络应用隐形斗篷般的超能力&#xff01; 深入探讨Socket编程的革命性力量&#xff0c;教你如何用Python的Socket模块来构建强大的网络应用。从简单的HTTP服务器到复杂…

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

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

Grafana详解

目录 ​编辑 一、Grafana的主要特点 二、Grafana的基本功能 三、Grafana的使用方法 Grafana是一款开源的数据可视化工具&#xff0c;主要用于大规模指标数据的可视化展现。下面将详细介绍Grafana的特点、功能以及基本使用方法。 一、Grafana的主要特点 跨平台性&#xff…

在Ubuntu系统中使用Systemctl添加启动项的详细指南

在Ubuntu系统中使用Systemctl添加启动项的详细指南 在Ubuntu系统中&#xff0c;systemctl 是管理systemd服务的主要工具。通过它&#xff0c;你可以添加、启动、停止、重启、启用和禁用服务。 什么是Systemctl&#xff1f; systemctl 是一个用于管理systemd系统和服务管理器…

【每日刷题】Day50

【每日刷题】Day50 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 654. 最大二叉树 - 力扣&#xff08;LeetCode&#xff09; 2. 119. 杨辉三角 II - 力扣&#xff08…

Vue:快速上手

一、简介 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0c;…

vue3-api之provide与inject

传值&#xff1a; 父组件 > 子组件 > 孙组件 // 父组件 <template><div class"app"><h3>我是app组件(祖) --- {{ name }} {{ price }}</h3><child /></div> </template><script> import { reactive, toRefs,…

第二证券股市行情:未来钢铁行业产业格局有望稳中趋好

机构指出&#xff0c;未来钢铁职业工业格式有望稳中趋好&#xff0c;叠加当时部分公司现已处于价值低估区域&#xff0c;现阶段仍具结构性出资机遇&#xff0c;尤其是拥有较高毛利率水平的优特钢企业和本钱管控力度强、具有规模效应的龙头钢企&#xff0c;未来存在估值修复的时…

大模型主流 RAG 框架TOP10

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接…

MySQL--复合查询

之前学过了基本的查询&#xff0c;虽然已经够80%的使用场景了&#xff0c;但是依旧需要了解剩下的20%。 一、多表笛卡尔积&#xff08;多表查询&#xff09; 以前我们使用基本查询的时候&#xff0c;from后面就跟一张表名&#xff0c;在多表查询这里&#xff0c;from后面可以跟…

BUUCTF:Misc 解析(七)

前言 Buuctf Web 是一个在线安全挑战平台&#xff0c;旨在提高参与者对网络安全的理解和实践能力。本文将详细介绍 Buuctf Web 的特点、挑战和机遇&#xff0c;帮助读者更好地了解这一领域。 一、Buuctf Web 的特点 多样化的挑战场景&#xff1a;Buuctf Web 提供了多种挑战场…

SCI一区 | Matlab实现PSO-TCN-LSTM-Attention粒子群算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现PSO-TCN-LSTM-Attention粒子群算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现PSO-TCN-LSTM-Attention粒子群算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测预测效果基本介绍程序设…

Transformer模型架构笔记

0. 简介 Transformer是一种用于自然语言处理&#xff08;NLP&#xff09;和其他序列到序列&#xff08;sequence-to-sequence&#xff09;任务的深度学习模型架构&#xff0c;它在2017年由Vaswani等人首次提出。Transformer架构引入了自注意力机制&#xff08;self-attention …

大规模语言模型的书籍分享

在当今人工智能领域&#xff0c;大规模语言模型成为了研究和应用的热点之一。它们以其大规模的参数和强大的性能表现&#xff0c;推动着机器学习和深度学习技术的发展。对于GPT 系列大规模语言模型的发展历程&#xff0c;有两点令人印象深刻。 第一点是可拓展的训练架构与学习范…

所以研究生有不变胖的吗?

天天吃 记得和骏骏一样减肥 分享昨天无人机拍的照片

dubbo复习:(10)使用tripple协议进行通信

一、pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.…

开源与闭源:AI大模型发展路径的博弈

一、引言 在人工智能&#xff08;AI&#xff09;领域&#xff0c;大模型以其卓越的性能和广泛的应用前景&#xff0c;成为了近年来技术发展的热点。然而&#xff0c;在大模型的发展路径上&#xff0c;开源与闭源两种模式一直存在着激烈的博弈。本文将深入探讨这两种模式在大模…

【python】删除一个列表中的所有的1

删除所有的1 x [1, 1, 6, 3, 9, 4, 5, 1, 1, 2, 1, 9, 6, 4] 使用lambda函数和filter来过滤掉x中的1 filtered_x list(filter(lambda n: n ! 1, x)) 不是1的数字&#xff0c;存进x列表&#xff0c;filter用于插入元素到第二个位置 print(filtered_x) # 输出: [6, 3, 9, …

K8s 部署prometheus

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