《后端程序员 · Nacos 配置优先级动态刷新》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

    • 写在前面的话
    • 配置加载顺序和优先级
    • 配置支持动态刷新
    • 代码读取配置属性
    • 总结陈词

CSDN.gif

写在前面的话

博主所在公司,采用Nacos作为注册中心和配置中心,在作为配置中心的过程中,总结了一些常见问题点,提供给各部门研发人员查阅。
此篇文章就介绍一下,Nacos 关于加载顺序和动态刷新的那些事情。

Tips:黄四娘家花满蹊,千朵万朵压枝低,留连戏蝶时时舞,自在娇莺恰恰啼。


配置加载顺序和优先级

【配置文件分类】
1、本地配置文件:
bootstrap.yml / bootstrap.yaml
application.yml / application.yaml
2、Nacos 配置中心的配置文件:
共享配置文件 (shared-configs)
扩展配置文件 (extension-configs)
项目应用名配置文件 (${spring.application.name}.yaml/.properties)

【加载顺序】

  1. 本地的 bootstrap.yml / bootstrap.yaml:首先加载,用于配置应用的启动环境。
  2. Nacos 配置中心的配置文件:

先加载 共享配置文件 (shared-configs)
然后是 扩展配置文件 (extension-configs)
最后是 项目应用名配置文件 (${spring.application.name}.yaml / .properties)

  1. 本地的 application.yml / application.yaml:在 Nacos 配置加载之后。

【优先级】

原则上加载顺序和优先级相反,后面加载的会覆盖前面的配置,但Nacos的优先级默认比本地高。

  1. Nacos 项目应用名配置文件:具有最高优先级。
  2. Nacos 扩展配置文件:次之,覆盖共享配置。
  3. Nacos 共享配置文件:优先级低于扩展配置。
  4. 本地 application.yml / application.yaml:优先级低于所有从 Nacos 加载的配置。
  5. 本地 bootstrap.yml / bootstrap.yaml:优先级最低。

【本地配置优先】
在 Nacos 中,可以通过特定的配置来设置本地配置优先,这可以在 bootstrap.yml 或 application.yml 文件中设置:

spring:
  cloud:
    config:
      override-none: true

Tips:作为框架制定人员,不建议这样设置,因为存在某些属性是需要框架设定的,防止被研发人员覆盖。若一些需要被本地覆盖的就不需要定义在Nacos里面了,框架内对应属性实体文件设定默认值即可,有需要可以本地直接覆盖。


配置支持动态刷新

【功能描述】
何谓热更新:Nacos中的配置文件修改后,微服务无需重启就能直接生效。
要实现代码可以实时读取Nacos刷新的配置,有两个重要步骤:
1、检查属性所在的 yml 文件,是否来自于Nacos,并且设置了refresh为true;
2、代码中是否正确的引用属性;

【配置检查】

Tips:共享配置或扩展配置要支持的话,需要添加 refresh 为 true,如下所示。
Tips:external-system.yml refresh配置为true 修改nacos上数据变化会通知刷新
Tips:external-system-old.yml refresh配置为false 修改nacos上数据变化不会动态刷新

system:
  external:
    adapterUrl: http://10.30.120.226:18618/services/
spring:
  application:
    name: pres-service
  cloud:
    nacos:
      # 配置中心
      config:
        # 如果refresh-enabled为false下面shared-configs 所有dataId刷新功能也会失效
        # refresh-enabled 控制是否nacos配置刷新,默认为true 开启的刷新能力。
        # refresh 控制具体dataId指定的配置文件是否动态刷新. 必须在refresh-enabled开启下才能生效。
        refresh-enabled: true
        shared-configs:
          - dataId: external-system.yml # refresh配置为true nacos中external-system.yml数据变化会通知刷新
            group: SERVICE_GROUP
            refresh: true
          - dataId: external-system-old.yml # refresh配置为false nacos中external-system-old.yml数据变化不会动态刷新
            group: SERVICE_GROUP
            refresh: false

【实现方式1:使用@Value + @RefreshScope】 - 不推荐
使用@Value注解的类必须配合@RefreshScope,否则只会使用第一读取到的配置。
不推荐理由:
1、引用属性过于分散,团队开发中,一组类型(system.external)属性最好统一在一个类中,方便统一管理使用,如使用 SystemExternalProperties对象集中管理;
2、开发需要在使用的地方都加上@RefreshScope,容易产生疏漏;

@Component
@RefreshScope
public class HelloService {

    @Value("${system.external.adapterUrl:adapterUrl_undefined}")
    private String adapterUrl;

    public void testAdapterUrl() {
        if ("adapterUrl_undefined".equals(adapterUrl)) {
            //配置为空程序校验处理
        }    
        System.out.println(adapterUrl);
    }
}

【实现方式:使用@ConfigurationProperties】** - 推荐**
使用SpringBoot属性注入,只要adapterUrl对应配置所属dataId开启refresh,则代码中的配置属性可以实时获取nacos中的配置。

//系统外部参数配置都西昂 
@Configuration
@ConfigurationProperties(prefix = "system.external")
public class SystemExternalProperties implements Serializable {
    private String adapterUrl;
    // 其他地址省略
  	// setter/getter省略
}    

【如何查询Nacos监听效果】
image.png


代码读取配置属性

使用@Value读取
配置属性,使用@Value(“${my.name}”)方式注入成员变量,@Value是实现把配置文件的单个属性的提取。
属性若不存在,启动时候就会报错,如下所示:
image.png

Tips:自定义增加的配置,非特殊情况,尽量使用冒号(代表默认值),否则若某现场没该配置,会启动失败。
Tips:添加上冒号代表后面是默认值,冒号后面是空的代表空字符串。

为防止这种情况,可以指定默认值,例如:

@Value("${system.defaultReply:不能识别的信息}")
private String defaultReply;

@Value("${sql.maxRow:1000}")
private String maxRow;

//#{SPEL} Spring表达式
@Value("#{11*2}") 

// 字面量
@Value("true") 

使用 @ConfigurationProperties 绑定实体

@Value 仅适合单个属性的情况,如果属性很多建议用绑定实体的方式。
@ConfigurationProperties可以实现把配置文件的某前缀开始的key自动映射为实体的初值。

1、添加相应的配置文件信息

ali:
  oss:
    accessKeyId: LTAI4FhYdxC7YY8RR6shfXjk
    accessKeySecret: LmVvWUJCQzdQpJyX621Xnf43GasQDO
    bucketName: cjwmy1013
    endPoint: oss-cn-beijing.aliyuncs.com
    fileHost: https://cjwmy1013.oss-cn-beijing.aliyuncs.com/

2、新建一个实体,和配置文件对应,如下:

@Component
@ConfigurationProperties(prefix = "ali.oss")
@Data
public class AliOSSProperties {
    private String accessKeyId;
    private String accessKeySecret;
    private String endPoint;
    private String bucketName;
    private String fileHost;
}

3、注入实体使用。

@Autowired
private AliOSSProperties aliOss;

4、引入 configuration-processor 依赖,这样绑定后可以有提示,也可以跳转,如下:

<!-- 配置文件对应 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

补充:@ConfigurationProperties
配置文件和属性不匹配也不会报错,需要校验,可以添加@Validated和@NotNull注解,如下:

@ConfigurationProperties(prefix = "author")
@Validated
@Component
public class AuthorBean {
    @NotNull
    private String name;
}

总结陈词

此篇文章介绍了Nacos 关于加载顺序和动态刷新的那些事情,仅供学习参考。
💗 近期在整理职场入职新人必读的N各系列,积极备战!

CSDN_END.gif

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

J025_斗地主游戏案例开发(简版)

一、需求描述 完成斗地主游戏的案例开发。 业务&#xff1a;总共有54张牌&#xff1b; 点数&#xff1a;3、4、5、6、7、8、9、10、J、Q、K、A、2 花色&#xff1a;黑桃、红桃、方片、梅花 大小王&#xff1a;大王、小王 点数分别要组合4种花色&#xff0c;大小王各一张。…

mysql不初始化升级

1、下载mysql&#xff0c;下载地址&#xff1a;MySQL :: Download MySQL Community Server 2、解压下载好的mysql&#xff0c;修改配置文件的datadir指定目录为当前数据存储的目录 3、通过管理员cmd进入新版本mysql的bin目录&#xff0c; 然后执行命令安装mysql服务&#xff…

性能测试(2)

jmeter参数化 loadrunner Jmeter IP欺骗&#xff0c;也称为IP欺诈&#xff0c;是指通过伪装、篡改IP地址的方式&#xff0c;进行网络攻击或欺骗行为。这种行为可能会导致网络安全问题&#xff0c;包括身份盗窃、数据泄露、DDoS攻击等。为了保护自己的网络安全&#xff0c;用户…

「C++系列」一篇文章讲透【运算符】

文章目录 一、运算符1. 算术运算符2. 关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 条件运算符&#xff08;三元运算符&#xff09;7. 成员访问运算符8. 指针和地址运算符9. 类型转换运算符10. 其他运算符 二、其他特殊运算符1. 成员访问运算符2. 指针和地址运算符3. 类…

C语言 ——— 模拟实现strcpy函数

目录 strcpy函数功能介绍 strcpy函数的模拟实现 strcpy函数功能介绍 学习并使用strcpy函数-CSDN博客 strcpy函数的模拟实现 代码演示&#xff1a; #include<stdio.h> #include<assert.h> char* my_strcpy(char* destination, const char* source) {assert(des…

OpenCV下的单目标定,双目标定与立体校正(calibrateCamera, stereoCalibrate and stereoRectify)

OpenCV下的单目标定&#xff0c;双目标定与立体校正(calibrateCamera, stereoCalibrate and stereoRectify) 文章目录 1. 杂话2. 单目标定2.1 先看代码2.2 一点解释2.3 calibrateCamera参数 3. 双目标定3.1 先看代码3.2 stereoCalibrate参数 4. 立体校正4.1 先看代码4.2 一点解…

Spring Security 授权

基于request的授权 HttpSecurity 权限配置 Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize -> {authorize// 放行请求:针对含有 admin 权限的用户放行 /user/get 接口.requestMatchers("/us…

训练营第十一天 | 150. 逆波兰表达式求值

150. 逆波兰表达式求值 做题思路 遇到操作符&#xff0c;出栈&#xff0c;从栈口取出俩元素&#xff1b;遇到数字&#xff0c;入栈 栈的应用场景&#xff1a;相邻元素的消除 逆波兰表达式&#xff1a;即后缀表达式 来自二叉树的后序遍历&#xff1a;左右中 代码细节 class …

有限元中弱形式的一些数学基础

有限元方法在求解PED时&#xff0c;一般先将控制方程转化为等效的若积分形式&#xff0c;本文试图总结一下这一过程的一些数学基础&#xff0c;本文主要从工程的角度出发和理解&#xff0c;不探讨严谨的数学证明过程。 PDE强形式 强形式是PDE及其边界条件的原始形式。求解强…

Java巅峰之路---基础篇---综合练习(面向对象)

目录 文字版格斗游戏 基础版 souf输出语句 进阶版 键盘录入的说明 复杂对象数组练习 需求&#xff1a; 添加和遍历 删除和遍历 修改和遍历 文字版格斗游戏 基础版 格斗游戏&#xff0c;每个游戏角色的姓名&#xff0c;血量&#xff0c;都不相同&#xff0c;在选定人…

[BJDCTF2020]Mark loves cat

黑盒直接扫 dirsearch -u http://bba9a212-64d3-4a16-88b4-3605fe3ef749.node5.buuoj.cn:81/ -w /home/kali/Desktop/dirsearch/db/dicc.txt我们用GitHack拿一下源码 没有的去下载一下&#xff0c;开源代码 cd GitHackpython GitHack.py http://bba9a212-64d3-4a16-88b4-3605…

排序算法3_冒泡排序、快速排序

一、冒泡排序 1.1 冒泡排序定义和思路 冒泡排序的基本思想是&#xff1a;通过相邻两个元素之间的比较和交换&#xff0c;使较大的元素逐渐从前面移向后面&#xff08;升序&#xff09;&#xff0c;就像水底下的气泡一样逐渐向上冒泡&#xff0c;所以被称为“冒泡”排序。  在…

垃圾收集篇

文章目录 垃圾收集算法垃圾的概念对象存活的判断引用计数器法可达性分析算法 算法标记清除算法复制算法标记压缩算法 垃圾收集的相关概念STW安全点安全区域 垃圾收集器重要指标吞吐量停顿时间 垃圾收集器的分类Serial 收集器&#xff1a;串行回收ParNew 收集器&#xff1a;并行…

【可视化大屏系列】Echarts之饼图绘制

本文为个人近期学习总结&#xff0c;若有错误之处&#xff0c;欢迎指出&#xff01; Echarts之饼图绘制 前言1.需求2.实现效果3.大概思路4.代码实现子组件写法父组件写法 5.附加&#xff08;1&#xff09;圆环饼图的绘制&#xff08;2&#xff09;南丁格尔玫瑰饼图A.半径展示数…

新手小白的pytorch学习第三弹-------tensor的基本操作

reshape, view, stacking, squeeze(), unsqueeze(),permute()torch.tensor 和 numpy 的 array切片&#xff0c;张量里面获取元素值随机种子 1 导入torch import torch2 reshape() tensor_A torch.arange(1, 11) tensor_Atensor_A.reshape(2, 5) tensor_A.reshape(2, 5)tenso…

浮点数存储方法(float,double,long double)

前言&#xff1a; 浮点数家族包括float、double、long double 类型。 如果你打出3.14&#xff0c;编译器默认是double类型的。若想让他为float类型&#xff0c;则要在前面加f&#xff1b; 1E10是科学计数法&#xff0c;代表1.010^10 (1) 浮点型如何在内存中存放&#xff1f;…

husky 和 lint-staged 构建代码项目规范

目录 前言 最简单的方法 过 scripts 来解决如果检测工具多&#xff0c;需要多次处理 通过 husky(哈士奇)来解决容易遗忘的问题 1. 安装 2. husky init 3. 试一试​ lint-stadge 只 lint 改动的 1. 安装 2. 修改 package.json 配置 3. 添加 npm 脚本: 4.使用 Husky…

Linux的load(负载)

负载(load)是Linux机器的一个重要指标&#xff0c;直观了反应了机器当前的状态。 在Linux系统中&#xff0c;系统负载是对当前CPU工作量的度量&#xff0c;被定义为特定时间间隔内运行队列中的平均线程数。 Linux的负载高&#xff0c;主要是由于CPU使用、内存使用、10消…

【AI】目标检测算法【R-CNN:Regions with CNN features】

1. 常用目标检测算法介绍 目标检测是计算机视觉领域的一个重要分支&#xff0c;它旨在识别并定位图像中的各种对象。以下是一些流行的目标检测算法&#xff1a; 1.1 二阶段目标检测算法 R-CNN (Regions with CNN features): 通过选择性搜索算法选取候选区域&#xff0c;然后…

【C语言】详解结构体(上)

文章目录 前言1. 结构体类型的含义2.结构体的声明2.1 结构体声明的语法2.2 结构体变量的创建和初始化 3.结构体的特殊声明4. 结构体的自引用5.小结 前言 C语言的数据类型分为内置数据类型和自定义的数据类型。所谓的内置的数据类型可以认为是C语言自带的数据类型&#xff08;c…