Spring Cloud Alibaba Nacos Config - - - >@RefreshScope动态获取刷新后的配置内容

news2024/11/20 1:32:11

初学者不知道有没有这个疑惑:我明明已经在 SpringBoot 应用的 bootstrap.yml 配置文件中,通过 spring.cloud.nacos.config.refresh-enabled=true 开启配置文件动态刷新了,为什么在 Controller 控制类中使用 @Value 注解无法获取到配置文件修改后的值 ? ? ?

这是因为你理解错了:动态刷新配置文件 和 动态获取配置文件的值

  • 动态刷新配置文件:在 SpringBoot 应用的 bootstrap.yml 配置文件中,可以通过 spring.cloud.nacos.config.refresh-enabled=true 开启配置文件动态刷新。也就是配置文件发生修改后,会自动刷新配置文件,使修改后的配置文件生效,否则你获取的还是原本的哪个旧的配置文件。

  • 动态获取配置文件的值:是指在配置文件发生修改,并经过spring.cloud.nacos.config.refresh-enabled=true刷新生效后。通过 @Value 可以获取到配置文件更新后的值。这需要使用 @RefreshScope 注解来实现。


动态刷新配置文件

1. 在 SpringBoot 应用的 bootstrap.yml 配置文件中,对配置中心中 data-id 为 config-caidong-redis.properties 的配置文件开启动态刷新。

spring:
    cloud:
        nacos:
            config:
                   #配置中心
                server-addr: 192.168.184.129:8849
                   #需要配置nacos的 用户名和密码,否则报unknown user!错误
                username: nacos
                password: nacos
                   #对于非public命名空间的配置文件,需要指定命名空间ID
                namespace: 29f2547c-ce20-40b4-b76c-e4ae53f481fe
                extension-configs:
                    - data-id: config-caidong-redis.properties #配置data-id
                      group: dev #分组名称
                      refresh: true #开启动态刷新,默认为false

2. 启动 Spring Boot 应用测试的代码如下:

@SpringBootApplication
public class Nacos8030Apllication {

    public static void main(String[] args) throws InterruptedException {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(Nacos8030Apllication.class, args);
        while(true) {
            //当动态配置刷新时,会更新到 Enviroment中,因此这里每隔一秒中从Enviroment中获取配置
            String redisName = applicationContext.getEnvironment().getProperty("com.redis.name");
            System.out.println("redisName: " + redisName);
            TimeUnit.SECONDS.sleep(1);
    }

}

3. 如下所示,当变更 com.redis.name 时,应用程序中能够获取到最新的值:
cd

redisName: 缓存配置
redisName: 缓存配置
redisName: 缓存配置
2022-12-11 20:24:46.918  INFO 1636 --- [  restartedMain] com.cd.nacos.Nacos8030Apllication        : Started Nacos8030Apllication in 6.054 seconds (JVM running for 75.326)
2022-12-11 20:24:46.920  INFO 1636 --- [  restartedMain] c.a.c.n.refresh.NacosContextRefresher    : listening config: dataId=config-caidong-redis02.properties, group=dev
//从 Enviroment 中 读取到更改后的值
redisName: 缓存配置--update
redisName: 缓存配置--update

将 refresh 属性注释 或者 设置成false,关闭配置自动刷新。也就是配置文件内容发生变更后,从 Enviroment 中 读取到的还是未更改前的值。



动态获取配置文件的值

配置通常用在 Bean 里面,在 Bean 中通过@Value 注解来获取配置信息,但 @Value 可以获取到配置中心的值,却无法动态感知获取修改后的配置内容。想要 @Value 可以动态获取配置修改后的值,需要在 Bean 上添加 @RefreshScope 注解。


使用 @RefreshScope 注解的前提是,变更后的配置文件进行了动态刷新 (spring.cloud.nacos.config.refresh-enabled=true开启了动态刷新)。否则配置文件都没有刷新,那肯定就不可能获取到变更后的配置内容。


1. 在 SpringBoot 应用的 bootstrap.yml 配置文件中,对配置中心中 data-id 为 config-caidong-redis.properties 的配置文件开启动态刷新。

spring:
    cloud:
        nacos:
            config:
                   #配置中心
                server-addr: 192.168.184.129:8849
                   #需要配置nacos的 用户名和密码,否则报unknown user!错误
                username: nacos
                password: nacos
                   #对于非public命名空间的配置文件,需要指定命名空间ID
                namespace: 29f2547c-ce20-40b4-b76c-e4ae53f481fe
                extension-configs:
                    - data-id: config-caidong-redis.properties #配置data-id
                      group: dev #分组名称
                      refresh: true #开启动态刷新,默认为false

2. 在 SpringBoot 应用中的 ConfigController 控制类中,使用 @Value 注解获取配置中心的配置内容。

@RestController
@RequestMapping("/config")
//@RefreshScope /*动态获取最新配置内容*/
public class ConfigController {

    @Value("${com.mysql.name}")
    private String mysqlName;

    @Value("${com.redis.name}")
    private String redisName;

    @Value("${com.rocketmq.name}")
    private String rocketmqName;

    @GetMapping("/common")
    public String show(){
        return "mysqlName: " + mysqlName + ", redisName: " + redisName + ", rocketmqName: " + rocketmqName;
    }

}

3. 如下所示,当变更 com.redis.name 时,应用程序中无法获取到修改后的最新内容:
cd
cd


4. 在 Bean 上添加 @RefreshScope 注解。

@RestController
@RequestMapping("/config")
@RefreshScope /*动态获取最新配置内容*/
public class ConfigController {

    @Value("${com.mysql.name}")
    private String mysqlName;

    @Value("${com.redis.name}")
    private String redisName;

    @Value("${com.rocketmq.name}")
    private String rocketmqName;

    @GetMapping("/common")
    public String show(){
        return "mysqlName: " + mysqlName + ", redisName: " + redisName + ", rocketmqName: " + rocketmqName;
    }

}

5. 变更 com.redis.name 时,应用程序中能够动态获取最新配置内容咯。
cd

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

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

相关文章

猿如意中的【取色器】效率工具详情介绍

目录 一、工具名称 二、下载安装渠道 2.1 什么是猿如意? 2.2 如何下载猿如意? 2.3 如何在猿如意中下载取色器? 三、取色器介绍 四、软件安装过程 五、软件界面 六、取色器功能特点介绍 七、取色器使用/体验感受 一、工具名称…

Typescript学习(第三弹)

泛型 定义 不预先确定的数据类型,具体的类型在使用的时候才确定,把泛型理解为代表类型的参数 泛型函数 泛型函数类型 泛型接口 引用泛型接口要指定一个类型,否则会报错 或者在泛型接口里指定一个默认类型 泛型类 泛型放在类的后面这样…

项目上线后我是如何通过慢查询和索引让系统快起来的

1、前言 最近对mysql的操作比较多一些,主要是项目上线以后,难免会有一些数据上的问题。开始的时候还主要由后端来处理,后面数据问题确实比较多,于是我就找后端要来服务器的账号密码,连上数据库顺便来看看数据的问题。…

C语言小项目-----员工管理系统

目录 项目要求: 考虑点: 实现过程 所用知识点 最终效果如下: 项目要求: 考虑点: 服务器端用select监听多个客户端,考虑点在于,公司内部的系统管理系统,不会有太多人每天都登陆&a…

【web前端开发】CSS的元素显示模式

前言 元素的显示模式可以更好的帮助我们布局页面,了解元素的显示模式,可以让我们布局页面时更加简单清晰 什么是元素显示模式 元素显示模式就是元素(标签)以什么样的方式进行显示 HTML元素一般分为块元素和行内元素两种类型 以下是块级元素和行内元素在网页中的显示: 块元…

3.神经网络-深度学习入门

3.神经网络 深度学习入门 本文的文件和代码链接:github地址 1.激活函数 sigmoid h(x)11e−xh(x) \frac{1}{1 e^{-x}} h(x)1e−x1​ def sigmod(x):return 1 / (1 np.exp(-1 * x))ReLU h(x){x:x>00:x≤0h(x) \left\{ \begin{array}{lr} x & : x > …

CMake静态库和动态库构建实例

任务 建⽴⼀个静态库和动态库,提供 HelloFunc 函数供其他程序编程使⽤,HelloFunc 向终端输出 Hello World 字 符串。安装头⽂件与共享库。 构建过程 构建动态库 目录结构 jyhlinuxubuntu:~/share/makefile_cmake/cmake01$ tree . ├── build #在…

m基于多用户MIMO系统的分布式可重构注水算法的matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 在单用户MIMO场景中,空间复用技术能够带来高数据速率的传输,但是也需要一些前提条件,比如发射端的预编码或者接收端的信道估计与信号检测。然而,在…

java项目-第169期ssm二手交易平台网站-ssm毕业设计_计算机毕业设计

java项目-第169期ssm二手交易平台网站-ssm毕业设计 【源码请到下载专栏下载】 《ssm二手交易平台网站》 该项目分为3个角色,管理员、用户、商家。 用户可以浏览前台商品并且进行购买。在个人后台可以看到自己的商品。 商家可以对商品进行商品分类管理、商品信息管理…

React 学习笔记:组件通信

组件通信 组件为什么需要通信呢?这是因为组件是独立且封闭的单元,默认情况下,组件只能使用自己的数据,但是多个组件之间不可避免的要共享某些数据,为了实现这些功能,就需要打破组件的独立封闭性&#xff0…

深度学习入门(五十九)循环神经网络——通过时间反向传播

深度学习入门(五十九)循环神经网络——通过时间反向传播前言循环神经网络——通过时间反向传播教材1 循环神经网络的梯度分析1.1 完全计算1.2 截断时间步1.3 随机截断1.4 比较策略2 通过时间反向传播的细节3 小结前言 核心内容来自博客链接1博客连接2希…

基于java+springboot+vue+mysql的甜品蛋糕销售商城网站

项目介绍 随着社会的快速发展,计算机的影响是全面且深入的。人们生活水平的不断提高,日常生活中用户对网上蛋糕商城方面的要求也在不断提高,网上蛋糕商城得到广大用户的青睐,使得网上蛋糕商城的开发成为必需而且紧迫的事情。本系…

Docker笔记--使用数据卷实现容器与宿主机的数据交互

1--数据卷的介绍和作用 在 Docker 架构中,宿主机系统和容器之间不能直接传递数据,同时当容器被删除时,容器所有的数据都会被清除; 数据卷能够在宿主机与容器、容器与容器之间搭建数据传输和共享的通道,当容器内的目录与…

C++ 快速复习-数据类型

内置数据类型 int、unsigned int 、long、unsigned long 、short、char、signed char、bool、 long long float、double、long double 等 无符号的数据类型 主要在于 不在区分 -,数据波动范围变大。另外,值得注意的是 unsigned 类型的数据 不建议在输出…

玩以太坊链上项目的必备技能(变量作用域-Solidity之旅五)

在前文我们讲过 Solidity 是一种静态类型的语言,这就意味着在声明变量前需先指定类型。 而 Solidity 对变量划分了以下三种作用域范围: 状态变量(State Variable): ​ 该变量的值被永久地存放在合约存储中&#xff…

JS新年倒计时

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:前端案例分…

Java---线程详解

目录 一、线程的介绍 二、线程的使用 (1)多线程的实现 1:继承Thread类 2:实现Runnable接口 (2)设置和获取线程名称 1:继承Thread类 2:实现Runnable接口 (3)线程…

Java学习—多线程Thread

多线程1. 线程简介1.1 普通方法和多线程1.2 程序、进程、线程2. 线程创建2.1 Thread类案例:下载图片2.2 Runnable接口案例:龟兔赛跑2.3 Callable接口3. 静态代理4. Lamda表达式5. 线程状态5.1 线程方法5.2 停止线程5.3 线程休眠5.4 线程礼让-yield5.5 Jo…

揭秘SpringMVC-DispatcherServlet之九大组件(二)

前言 上回聊到了HandlerAdapter,今天继续聊后面的组件。今天的主角是HandlerMapping,这篇文章全为他服务了。 HandlerMapping 上回说的Handler,我们说是处理特定请求的。也就是说,不是所有的请求都能处理。那么问题来了&#x…

gateway初始化与配置

1、排除依赖 spring-boot-starter-webflux 2、添加依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency><groupId>org.springf…