springcloud nacos配置优先级研究及配置管理最佳实践

news2024/11/24 18:35:38

目录

  • 背景
  • 工具版本
  • SpringCloud配置存放位置及相应优先级
    • 代码中
    • nacos
    • jar包外挂
  • 多种配置共同存在时的优先级
  • 项目配置管理最佳实践
    • 无nacos的情况
    • 有nacos的情况
  • 参考文献

背景

公司有很多应用是基于SpringBoot/SpringCloud开发。由于在配置文件中经常会涉及数据库账号密码之类的敏感信息,因此之前项目管理过程中,配置与代码要求分开管理,在打包jar的时候不允许将配置打包到jar中,导致在jar启动时需要外挂一个很大的配置文件。以前配置项较少时还好,但后来配置项越来越多,部署的环境、代码的版本也越来越多之后,运维人员一个头两个大,经常出现配置版本和代码版本不一致的现象。本文先对SpringCloud及nacos的配置优先级进行研究,再提出一种多环境、多版本代码的项目配置管理最佳实践方案。

工具版本

工具名称版本
SpringBoot2.7.17
SpringCloud2021.0.8
Nacos Client Version2021.0.5.0
Nacos Server version2.1.2
JDK1.8.0_391
操作系统win10

SpringCloud配置存放位置及相应优先级

代码中

SpringBoot/SpringCloud应用,代码中有四个地方可以存放配置文件,文件名统一为application[-profile].propertis/yaml。properties比yaml优先级要高,在指定了spring.profiles.active的情况下,带profile(如dev)后缀的,比不带profile的高。按优先级低到高排序依次是

  1. classpath根目录(即resources根目录)
  2. classpath下的config目录(即resources/config目录)
  3. 项目根目录
  4. 项目config目录

在这里插入图片描述
注意上述3、4位置的配置,在mvn package的时候,是不会被打包进jar的。而1和2会被打包到代码根目录(classes目录)
在这里插入图片描述

nacos

在使用nacos的情况下,只需要添加一个bootstrap.propertis/yaml(最新版的nacos已经默认不使用bootstrap了,但为了兼容旧的代码,此处以bootstrap为例来讲),nacos会自动根据prefix(默认为spring.application.name)、spring.profiles.active、spring.profiles.include、file-extension、shared-configs、extension-configs、group等条件来拼接所要的nacos配置文件名,例如下述场景

bootstrap.yaml

spring:
  profiles:
    include:
      - include
    active:
      - dev
      - dev2

bootstrap-dev.yaml

spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: test
        file-extension: yaml
        username: nacos
        password: nacos
        group: DEFAULT_GROUP
        prefix: springcloud_app_config_learning
        shared-configs:
          - dataId: springcloud_app_config_learning-shared.yaml
            group: group-shared
        extension-configs:
          - dataId: springcloud_app_config_learning-ext.yaml
            group: group-ext

项目启动的时候则会在nacos找如下文件(找不到不会报错)。由于nacos需要指定文件后缀,因此不存在properties与yaml优先级的区别,但在有spring.profile.active的情况下,带profile的文件优先级一样高于不带profile后缀,非共享非扩展配置比共享扩展配置优先级高,扩展配置比共享配置优先级高。总的来讲,优先级从高到低排序为:

优先级文件名group
1springcloud_app_config_learning-dev2.yamlDEFAULT_GROUP
2springcloud_app_config_learning-dev.yamlDEFAULT_GROUP
3springcloud_app_config_learning-include.yamlDEFAULT_GROUP
4springcloud_app_config_learning.yamlDEFAULT_GROUP
5springcloud_app_config_learningDEFAULT_GROUP
6springcloud_app_config_learning-ext.yamlgroup-ext
7springcloud_app_config_learning-shared.yamlgroup-shared

jar包外挂

主要是指启动jar时,使用spring.profiles.active、spring.config.location 以及 spring.config.additional-location 三个命令指定配置。这三命令的功能分别是:

命令作用
spring.profiles.active指定active的profile,如果有此命令,则其它区域指定的spring.profiles.active将被覆盖
spring.config.location指定jar将从指定的区域找配置,并忽略其它区域的配置
spring.config.additional-location指定jar从指定的区域寻找配置,并同classpath、nacos等区域的配置进行merge

如果使用了spring.config.location,例如java -jar application.jar spring.config.location=/1.yaml,classpath:/config/2.yaml,程序启动时将只会从虚拟机/1.yaml和resources目录下的2.yaml中寻找配置,并且不会与其它配置做merge操作。2.yaml优先级高于1.yaml。

在使用 spring.config.additional-location 时,会与classpath和nacos中的配置进行merge,additional-location的优先级高于classpath及nacos。

spring.config.additional-location与spring.profiles.active一起使用时,spring.profiles.active的优先级高于spring.config.additional-location中指定的spring.profiles.active。例如java -jar application.jar --spring.config.additional-location=/app.yaml --spring.profiles.active=test

# app.yaml:
spring:
  profiles:
    active:
      - dev

多种配置共同存在时的优先级

当同时存在代码、nacos和jar包外挂配置时,优先级从高到底是

jar包外挂配置 > nacos > 代码

归纳一下,按优先级从高到低排序:

  1. jar运行命令中的spring.config.location
  2. jar运行命令中的spring.profiles.active
  3. jar运行命令中的spring.config.additional-location
  4. nacos中带profile的配置(当有spring.profiles.active时)
  5. nacos中spring.profiles.include的配置(当有spring.profiles.include时)
  6. nacos中不带profile的配置
  7. nacos中的ext配置
  8. nacos中shared配置
  9. 代码根目录/config/(此配置不会打包打jar)
  10. 代码根目录(此配置不会打包打jar)
  11. 代码classpath/config(即resouces/config)
  12. 代码classpath根目录

使用spring.config.location时,其它位置的配置全部不生效。
不使用spring.config.location时,配置优先级从高到低进行merge。

项目配置管理最佳实践

配置文件中的内容,可以大体分成两类,一类是随着环境需要调整的配置,例如mysql、redis、nacos的地址、账号、密码;另一类是跟业务相关的配置,一般不会随着环境变动。

结合上述配置优先级,结合有无nacos两种情况,适合多环境开发、部署的配置管理方案为

无nacos的情况

  • 将业务配置放到resources/config/application.yaml中,如果有多个profile,将最常用的环境的配置置于application.yaml,不要加profile,其它不常用的环境加上profile后缀。
    在这里插入图片描述

  • 将环境相关配置,以及spring.profiles.include、spring.profiles.active放到根目录/config/application.yaml中。
    在这里插入图片描述

  • 部署时,外挂环境相关配置,格式与环境相关配置一致,命令为java -jar xxx.jar --spring.config.additional-location=/app.yaml

有nacos的情况

  • 将业务配置放到resources/config/application.yaml中,如果有多个profile,将最常用的环境的配置置于application.yaml,不要加profile,其它不常用的环境加上profile后缀。
    在这里插入图片描述
  • 将nacos的配置,spring.profiles.include、spring.profiles.active放到根目录/config/bootstrap.yaml中。如果有多个profile,将最常用的环境的配置置于bootstrap.yaml,不要加profile,其它不常用的环境加上profile后缀。不同的profile对应不同的nacos的namespace
    在这里插入图片描述
  • 将环境相关配置放到nacos中,如果有多个profile,设置多个namespace
    在这里插入图片描述
    在这里插入图片描述
  • 通过java -jar启动时,外挂nacos相关配置,格式与/config/bootstrap.yaml一致。命令为java -jar xxx.jar --spring.config.additional-location=/bootstrap.yaml

打包时,与业务相关的配置会随着jar一起发布,而与环境有关的配置,又跟jar进行了隔离,如此,运维人员在部署新环境或升级新版本时,只需要专注修改与环境相关的少量配置即可,既不会造成敏感信息泄露,又降低了运维人员变更配置的难度。

参考文献

SpringBoot 配置加载优先级详解
SpringBoot配置及Nacos配置中心加载顺序及覆盖生效优先关系
SpringBoot加载外部/内部配置文件的顺序和覆盖优先级总结
Spring Boot的配置文件加载优先级
SpringBoot配置加载,各配置文件优先级对比

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

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

相关文章

Gson的用法详解

一、简介 Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为序列化Java对象为JSON字符串,或反序列化JSON字符串成Java对象。 Gson官网:gson Gson源码地址:google/gson 二、依赖…

Long-Context下LLM模型架构全面介绍

深度学习自然语言处理 原创作者:cola 随着ChatGPT的快速发展,基于Transformer的大型语言模型(LLM)为人工通用智能(AGI)铺平了一条革命性的道路,并已应用于知识库、人机界面和动态代理等不同领域。然而,存在一个普遍的限制:当前许多…

Linux处理文件常见命令

目录 1 cp 2 rm 3 zip与unzip 3.1 zip 3.2 unzip 4 cd 5 ls 6 chmod 7 scp 7.1 文件在你操作的机器上,你要传给另一个机器 7.1.1 文件 7.1.2 文件夹 7.2 文件在另一个机器上,你要把文件搞到你操作的机器上 7.2.1 文件 7.2.…

NX二次开发UF_CURVE_create_arc_3point 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_arc_3point Defined in: uf_curve.h int UF_CURVE_create_arc_3point(tag_t point1, tag_t point2, tag_t point3, UF_CURVE_limit_p_t limit_p [ 2 ] , tag_t supp…

开发知识点-CSS样式

CSS样式 fontCSS 外边距 —— 围绕在元素边框的空白区域# linear-gradient() ——创建一个线性渐变的 "图像"# transform ——旋转 元素![在这里插入图片描述](https://img-blog.csdnimg.cn/20191204100321698.png)# rotate() [旋转] # 边框 (border) —— 围绕元素内…

无分类编址 CIDR

在域名系统出现之后的第一个十年里,基于分类网络进行地址分配和路由IP数据包的设计就已明显显得可扩充性不足(参见RFC 1517)。为了解决这个问题,互联网工程工作小组在1993年发布了一新系列的标准——RFC 1518和RFC 1519——以定义…

时尚和美容网站的技术 SEO:提示和最佳实践

如果你对美容和时尚感兴趣,做了一个网站,但不知道如何在上面做技术SEO?此外,时尚和美容网站的技术 SEO 没有任何特别的指南! 我们听到了你的声音!但首先,请记住,技术性SEO不是在一两…

Docker监控Weave Scope的安装和使用

1.本地安装Weave Scope 1)创建文件夹。 mkdir /usr/local/bin/scope 2)从本地上传文件。 rz scope.bin以资源形式已上传到文章开篇。 3)修改scope.bin文件为可执行文件。 chmod 755 /usr/local/bin/scope/scope.bin 4)执行sco…

使用 SwiftUI 创建一个灵活的选择器

文章目录 前言可选择协议自定义化FlexiblePicker 逻辑FlexiblePicker 视图总结 前言 最近,在我正在开发一个在 Dribbble 上找到的设计的 SwiftUI 实现时,我想到了一个点子,可以通过一些酷炫的筛选器扩展该项目以缩小结果列表。 我决定筛选视…

2023.11.28-电商平台建设03 - 大数据调优手段

1.优化手段 1.1分桶表 HIVE的分桶本质上就是MR的分区操作 建表语句: create table 表名(字段 类型,.... ) clustered by(分桶字段) [sorted by (字段 [asc | desc])] into N buckets --- 定义分桶表核心语句 row format...... 分桶的作用 1) 进行数据采样工作 1.1) …

Vim多行编辑

Vim多行编辑 Ctrlq进入多行编辑模式,然后上下选择要编辑的行 按下I或者Shifti,进入编辑模式 编辑的时候多行不会同时变化,不要担心,确实是多行编辑 编辑完成,想要结束多行编辑,按下Esc,此时…

BGP综合实验(IP)

实验要求: 实验思路: 1.划分IP地址: 将172.16.0.0/16的网段划分为172.16.0.0/24的多个网段,因为在实际工程当中,24的网段更符合用户网段,因此先将网段划分为172.16.0.0 /24的多个子网掩码为24的网段&…

使用Pytorch从零开始构建扩散模型-DDPM

知识回顾: [1] 生成式建模概述 [2] Transformer I,Transformer II [3] 变分自编码器 [4] 生成对抗网络,高级生成对抗网络 I,高级生成对抗网络 II [5] 自回归模型 [6] 归一化流模型 [7] 基于能量的模型 [8] 扩散模型 I, 扩散模型 II 引言 去噪…

算法 离散化

整数离散化 适用条件 适用于有序的整数序列该序列的值域很大,该序列的数的个数很少使用的是数的相对大小而非绝对大小 算法思路 原数组 a : 数组下标:0 1 2 3 4 数组元素:1 2 2 5 109 映射数组 : 数组下标&…

gRPC Java、Go、PHP使用例子

文章目录 1、Protocol Buffers定义接口1.1、编写接口服务1.2、Protobuf基础数据类型 2、服务器端实现2.1、生成gRPC服务类2.2、Java服务器端实现 3、java、go、php客户端实现3.1、Java客户端实现3.2、Go客户端实现3.3、PHP客户端实现 4、运行效果 本文例子是在Window平台测试&a…

从 0 到 1 开发一个 node 命令行工具

G2 5.0 推出了服务端渲染的能力,为了让开发者更快捷得使用这部分能力,最写了一个 node 命令行工具 g2-ssr-node:用于把 G2 的 spec 转换成 png、jpeg 或者 pdf 等。基本的使用如下: $ g2-ssr-node g2png -i ./bar.json -o ./bar.…

【Intel FPGA】D5005 使用笔记

项目总目标,在AFU中实现xx算法DDR 1.FPGA device :1SX280HN2F43E2VG 2 .硬件架构图 3.DDR信息 4.FIM (FPAG Interface Manager) The FIM contains the FPGA logic to support the accelerators, including the PCIe IP core, …

UE5、CesiumForUnreal实现加载GeoJson绘制多面(MultiPolygon)功能(支持点选高亮)

文章目录 1.实现目标2.实现过程2.1 数据与预处理2.2 GeoJson解析2.3 Mesh构建与属性存储2.4 核心代码2.5 材质2.6 蓝图应用测试3.参考资料1.实现目标 在之前的文章中,基于GeoJson数据加载,实现了绘制单面功能,但只支持单个要素Feature。本文这里实现对Geojson内所有面要素的…

【CVE-2023-49103】ownCloud graphapi信息泄露漏洞(2023年11月发布)

漏洞简介 ownCloud owncloud/graphapi 0.2.x在0.2.1之前和0.3.x在0.3.1之前存在漏洞。graphapi应用程序依赖于提供URL的第三方GetPhpInfo.php库。当访问此URL时,会显示PHP环境的配置详细信息(phpinfo)。此信息包括Web服务器的所有环境变量&a…

Python字典类型

目录 目标 版本 官方文档 简介 实战 创建 循环 常用方法 目标 掌握字典类型的使用方法,包括:创建、循环、常用方法等操作。 版本 Python 3.12.0 官方文档 Mapping Types — dicthttps://docs.python.org/3/library/stdtypes.html#mapping-type…