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

目录

  • 背景
  • 工具版本
  • 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:- includeactive:- dev- dev2

bootstrap-dev.yaml

spring:cloud:nacos:config:server-addr: 127.0.0.1:8848namespace: testfile-extension: yamlusername: nacospassword: nacosgroup: DEFAULT_GROUPprefix: springcloud_app_config_learningshared-configs:- dataId: springcloud_app_config_learning-shared.yamlgroup: group-sharedextension-configs:- dataId: springcloud_app_config_learning-ext.yamlgroup: 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.mzph.cn/news/178040.shtml

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

相关文章

Boot工程快速启动【Linux】

Boot工程快速启动【Linux】 在idea中打包cd usr/在local文件夹下mkdir app进入app文件夹把打包好的文件(只上传其中的jar)上传到app文件下检查linux中的Java版本,保证和项目的Java 版本保持一致运行 java -jar sp补全***.jar想看效果得查询当…

UniApp项目中 使用微信小程序原生语言 进行开发

看效果 wxcomponents 下放的是微信小程序原生代码写的组件。我进行了封装 上干货 在你下uniApp 项目的根目录创建一个 wxcomponents 名字千万不要错 京东、支付宝灯参考下面图片 官方文档也有介绍 然后在你需要引入原生功能的页面里面引入你的组件(我这里提前已经放…

初识Java 18-2 泛型

目录 构建复杂模型 类型擦除 C中的泛型 迁移的兼容性 类型擦除存在的问题 边界的行为 对类型擦除的补偿 创建类型实例 泛型数组 本笔记参考自: 《On Java 中文版》 构建复杂模型 泛型的一个优点就是,能够简单且安全地创建复杂模型。 【例子&am…

nginx反向代理解决跨域前端实践

需求实现 本地请求百度的一个搜索接口,用nginx代理解决跨域思路:前端和后端都用nginx代理到同一个地址8080,这样访问接口就不存在跨域限制 本地页面 查询一个百度搜索接口,运行在http://localhost:8035 index.js const path …

elment Loading 加载组件动态变更 text 值bug记录

先上效果图: 倒计时4分钟组件方法 // 倒计时 4分钟getSencond() {this.countDown 4分00秒this.interval setInterval(() > {this.maxTime--;let minutes Math.floor(this.maxTime / 60);let seconds Math.floor(this.maxTime % 60);minutes minutes < 10 ? 0 minu…

台式机加独显引发的故事

弄到一块NVIDIA1660显卡&#xff0c;想要加到台式机&#xff0c;枯树逢春&#xff1b;中间引发不少事情&#xff0c;记录下来共勉 1.台式机插入显卡 1&#xff09;拆开主机后部的接口片 2&#xff09;显卡插入显卡巢&#xff0c;很内存条结构类似&#xff08;长短布局&#xff…

电子学会C/C++编程等级考试2022年06月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:小白鼠再排队 N只小白鼠(1 < N < 100),每只鼠头上戴着一顶有颜色的帽子。现在称出每只白鼠的重量,要求按照白鼠重量从小到大的顺序输出它们头上帽子的颜色。帽子的颜色用 “red”,“blue”等字符串来表示。不同的小白…

React 之 airbnb - 项目实战

一、开发前言 1. 规范 2. 创建项目 node -v > 18.0.0 npm -v > 8.6.0 create-react-app star-airbnb 3. 项目基本配置 配置jsconfig.json {"compilerOptions": {"target": "es5","module": "esnext","ba…

kafka2.x常用命令:创建topic,查看topic列表、分区、副本详情,删除topic,测试topic发送与消费

原创/朱季谦 接触kafka开发已经两年多&#xff0c;也看过关于kafka的一些书&#xff0c;但一直没有怎么对它做总结&#xff0c;借着最近正好在看《Apache Kafka实战》一书&#xff0c;同时自己又搭建了三台kafka服务器&#xff0c;正好可以做一些总结记录。 本文主要是记录如…

Spring --- 创建一个Spring项目

文章目录 创建一个Maven项目添加Spring框架支持添加启动类 创建一个Maven项目 注&#xff1a;我们需要使用 Maven 来管理依赖&#xff0c;所以需要创建一个Maven项目 添加Spring框架支持 注&#xff1a; 添加这两个依赖才能正确使用 Spring在添加依赖后记得刷新&#xff0c;把依…

【Nginx篇】Nginx轻松上手

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Unity2D-URP基于ShaderGraph创建带粒子特效的激光光束

文章目录 创建Shader新建Node: UV新建Node: Split......参数说明 基于Shader创建Material创建Line创建粒子系统StartVFX创建粒子材质更改粒子系统的材质设置透明模式设置粒子效果创建一个Beam设置EndVFX效果预览激光光束管理脚本最终预览 创建Shader Create --> Shader Gra…

零信任、SASE还在因不标准的身份系统难对接而无法发挥真正力量?这份标准化的解决方案助您一臂之力

身份安全是网络安全的一个重要领域&#xff0c;旨在确保用户的身份安全可信&#xff0c;防止未经授权的访问和数据泄漏等问题。目前主流的信息安全趋势强调可持续验证、多源信任评估、动态防护、可持续数据防护、一体化安全审计等&#xff0c;特别是零信任、SASE等技术均以身份…

vue elementUI 自定义框组织树,选择select下拉组织树横行滑动条出现方法

背景&#xff1a;最近公司开发需要使用到组织树进行组织结构的选择&#xff0c;在开发途中遇到两个次组织树已超过外框&#xff0c;但超出部分不显示横向滑动条。 自定义组织树框代码如下&#xff1a; <el-row><el-col :span"20" style"padding: 0px…

《数据结构、算法与应用C++语言描述》-线索二叉树的定义与C++实现

_23Threaded BinaryTree 可编译运行代码见&#xff1a;GIithub::Data-Structures-Algorithms-and-Applications/_24Threaded_BinaryTree 线索二叉树定义 在普通二叉树中&#xff0c;有很多nullptr指针被浪费了&#xff0c;可以将其利用起来。 首先我们要来看看这空指针有多少…

Leetcode刷题之设计循环队列(C语言版)

Leetcode刷题之设计循环队列&#xff08;C语言版&#xff09; 一、题目描述二、题目示例三、题目解析Ⅰ、typedef structⅡ、MyCircularQueue* myCircularQueueCreate(int k)Ⅲ、bool myCircularQueueIsEmpty(MyCircularQueue* obj)Ⅳ、bool myCircularQueueIsFull(MyCircularQ…

P19 C++ 构造函数的成员初始化列表

目录 前言 01 如果不用成员列表如何初始化变量 02 成员列表初始化 03 为什么要使用成员列表初始化呢&#xff1f; 04 案例代码 前言 本期我们聊聊构造函数初始化列表。 你应该经常使用成员初始化列表&#xff0c;如果你不喜欢这种代码风格&#xff0c;建议你还是慢慢习惯吧…

立即修复计算机显示msvcp110.dll丢失问题!4个快速解决方法大揭秘

在计算机使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“msvcp110.dll丢失”。这个错误通常会导致某些程序无法正常运行&#xff0c;给用户带来诸多不便。那么&#xff0c;当我们遇到这个问题时&#xff0c;应该如何进行修复呢&#xff1f;本文将…

搭建一个可以发送邮箱验证码的接口,内含前端处理 接口返回、请求处理

环境搭建 在node安装好的情况下&#xff08;一般vue环境有的node也有 没有可以使用winr回车输入node -v 有版本号则已经安装好 找一个空文件夹作为此项目文件夹 点击上面的地址栏输入cmd回车 输入npm init -y 再输入npm install nodemailer安装发送邮件的插件 环境配置 使用v…

vue3中toRef创建一个ref对象

为源响应式对象上的某个属性创建一个 ref对象, 二者内部操作的是同一个数据值, 更新时二者是同步的 区别ref: 拷贝了一份新的数据值单独操作, 更新时相互不影响 应用: 当要将 某个prop 的 ref 传递给复合函数时&#xff0c;toRef 很有用 父组件代码: <template><…