springboot配置扫描生效顺序

news2025/1/11 10:02:39

文章目录

  • 举例分析
    • 项目结构如下
    • noddles-user-backend 两个配置文件
    • noddles-user-job 配置文件
    • noddles-user-server 配置文件
    • 问题:server和Job启动时对应加载的数据库配置为哪一个?
  • 总结

在微服务架构中,backend模块会定义一个基础的配置文件,在每个微服务中,也会定义一个自己的配置文件,每个微服务通过继承方式,每个服务都需要的内容放在backend模块,避免在每个微服务中重复定义,减少管理成本。

在实际工作中,本地开发、测试和上线环节,需要使用不一样的配置信息运行服务,再加上有些服务要同时支持国内和海外,需要管理的配置信息就达到了3 * 2=6套,有的甚至同一个场景下,提供了多种资源选择,如何控制在对应运行环境下加载正确的配置信息?

举例分析

下面是公司的一个实际项目中所有配置文件,

项目结构如下

<modules>
        <module>noodles-user-common</module>
        <module>noodles-user-client</module>
        <module>noodles-user-server</module>
        <module>noodles-user-job</module>
        <module>noodles-user-backend</module>
    </modules>

其中noddles-user-server(提供http和rpc接口)、noddles-user-job(定时任务)是两个可以独立运行的服务。

noddles-user-backend 两个配置文件

application.yaml

authFilter:
  appKey: Ape
  internationalEnabled: true
  defaultProductId: 1000

# ServiceInstanceMeta
serviceInstanceMeta:
  serviceName: noddles-user

security.filterOrder: 20

# MySQL 连接配置
noddlesUser.mysql:
  dynamicConfigEnabled: true
  dynamicConfigKey: noddles_user-pyIXkE-test
  dynamicConfigGroup: op-dba-mysql-conf
  readWriteSplit: true
  testOnBorrow: true
  validationQuery: SELECT 1

# 数据库自动初始化 默认关闭
spring.datasource.initialize: false

# Actuator 配置
actuator:
  project: noddles-user

fdc.projectIdentity: noddles-user

spring.profiles.active: local,sg-test,soho-test

logging.access.directory: /home/shared/log

spring:
  profiles:
    include: backend-oversea

# 本地环境
---
spring:
  profiles: local

rpcServer.zkNode: false
logging.access.enabled: false
actuator.enabled: false

---
# 测试服务环境
spring:
  profiles: test

logging.config: classpath:log4j2.test.yaml

---
# 线上服务环境
spring:
  profiles: online

remind.env: 线上

---
# 测试服务环境
spring:
  profiles: bj-test

alimq.topics:
  userLogin:
    cluster: noddles_test
    topic: JIALIDUN_NOODLES_USER_LOGIN_TEST
    consumerId: GID_JIALIDUN_NOODLES_USER_LOGIN_TEST

---
# 线上服务环境
spring:
  profiles: bj-online

noddlesUser.mysql:
  dynamicConfigEnabled: true
  dynamicConfigKey: noddles-user-online-noddles_user-online
  dynamicConfigGroup: op-dba-mysql-conf
  readWriteSplit: true
  testOnBorrow: true
  validationQuery: SELECT 1

alimq.topics:
  userLogin:
    cluster: noddles_online
    topic: JIALIDUN_NOODLES_USER_LOGIN_ONLINE
    consumerId: GID_JIALIDUN_NOODLES_USER_LOGIN_ONLINE

---
# 大兴测试机房
spring:
  profiles: soho-test

# ZooKeeper 配置
zkServers: zk1-test,zk2-test,zk3-test,zk4-test,zk5-test

---
# 廊坊测试机房
spring:
  profiles: rz-test

# ZooKeeper 配置
zkServers: zk1-test,zk2-test,zk3-test,zk4-test,zk5-test

---
# 大兴线上机房
spring:
  profiles: dx-online

zkServers: dx-zk1,dx-zk2,dx-zk3,dx-zk4,dx-zk5

---
# 廊坊线上机房
spring:
  profiles: lf-online

zkServers: lf-zk1,lf-zk2,lf-zk3,lf-zk4,lf-zk5

---
# 阿里新加坡线上机房
spring:
  profiles: alisg-online

zkServers: lf-zk1,lf-zk2,lf-zk3,lf-zk4,lf-zk5

application-backend-oversea.yaml

# 海外测试服务环境
spring:
  profiles: sg-test

noddlesUser.mysql:
  dynamicConfigEnabled: true
  dynamicConfigKey: noddles_sg_user-NwQVE1-test
  dynamicConfigGroup: op-dba-mysql-conf
  readWriteSplit: true
  testOnBorrow: true
  validationQuery: SELECT 1
  
alimq.topics:
  userLogin:
    cluster: noddles_sg_test
    topic: JIALIDUN_NOODLES_USER_LOGIN_TEST
    consumerId: GID_JIALIDUN_NOODLES_USER_LOGIN_TEST

---
# 海外线上服务环境
spring:
  profiles: sg-online

noddlesUser.mysql:
  dynamicConfigEnabled: true
  dynamicConfigKey: noddles_sg_user-r5vJDb-online
  dynamicConfigGroup: op-dba-mysql-conf
  readWriteSplit: true
  testOnBorrow: true
  validationQuery: SELECT 1

alimq.topics:
  userLogin:
    cluster: noddles_sg_online
    topic: JIALIDUN_NOODLES_USER_LOGIN_ONLINE
    consumerId: GID_JIALIDUN_NOODLES_USER_LOGIN_ONLINE

---
# 测试环境海外机房
spring:
  profiles: qcbj3-test

# ZooKeeper 配置
zkServers: soho-zk1,soho-zk2,soho-zk3,soho-zk4,soho-zk5

---
# 线上海外虚拟机房
spring:
  profiles: alibj1-online

zkServers: lf-zk1,lf-zk2,lf-zk3,lf-zk4,lf-zk5

---
# 线上新加坡机房
spring:
  profiles: alisg-online

zkServers: lf-zk1,lf-zk2

noddles-user-job 配置文件

spring:
  profiles:
    include: backend

common.xxl.job.executor:
  appname: noddles-user-job

mailer:
  biz: noddles

---
# 配置类型:region+环境相关配置
# 配置用途:用于同时与region和环境相关的配置,或者仅与region相关的配置
# region-环境:新加坡-测试
spring:
  profiles: sg-test

common.xxl.job.executor:
  appname: noddles-user-job-sg

---
# 配置类型:region+环境相关配置
# 配置用途:用于同时与region和环境相关的配置,或者仅与region相关的配置
spring
  profiles: sg-online

common.xxl.job.executor:
  appname: noddles-user-job-sg

noddles-user-server 配置文件

authFilter:
  appKey: Ape
  internationalEnabled: true
  defaultProductId: 1000

# ServiceInstanceMeta
serviceInstanceMeta:
  serviceName: noddles-user

common.xxl.job.executor:
  appname: noddles-user

# Web Server 配置
server:
  port: 8080
  tomcat:
    maxThreads: 500

# Rpc Server 配置
rpcServer:
  port: 5000
  zkNode: /noddles-user/rpc/v1 
---
spring.profiles.include: backend

---
# 配置类型:region+环境相关配置
# 配置用途:用于同时与region和环境相关的配置,或者仅与region相关的配置
# region-环境:新加坡-测试
spring:
  profiles: sg-test

common.xxl.job.executor:
  appname: noddles-user-sg

---
# 配置类型:region+环境相关配置
# 配置用途:用于同时与region和环境相关的配置,或者仅与region相关的配置
# region-环境:新加坡-线上
spring:
  profiles: sg-online

common.xxl.job.executor:
  appname: noddles-user-sg

问题:server和Job启动时对应加载的数据库配置为哪一个?

先公布答案时noddles_sg_user-NwQVE1-test这个数据库,位于soho-test环境下。

以noodles-user-server项目启动为例,对数据配置扫描加载顺序进行分析。

启动noodles-user-server,加载对应配置信息,扫描到spring.profiles.include: backend,解析并合并application-backend.yaml中配置信息(springBoot按照规定进行二者的关联和查找),在application-backend.yaml,指明了在默认情况下要使用环境spring.profiles.active: local,sg-test,soho-test,这样配置之后,会将公共配置信息和 local,sg-test,soho-test配置信息都进行扫描加载,相同配置项,后加载的覆盖之前加载,公共配置的数据库为noddles_user-pyIXkE-test,local没有配置数据库,soho-test也没有配置数据库信息,sg-test配置了noddles_sg_user-NwQVE1-test,因此最终生效的是noddles_sg_user-NwQVE1-test数据库,详细扫描并加载数据配置顺序如下图:
在这里插入图片描述

总结

在多文件,多profile环境下,配置信息扫描加载顺序为「同一个文件,从上到下-》遇到include,递归扫描加载-〉spring.profiles.active多个环境,从左到右依次扫描加载」,后加载的总是覆盖先加载的。

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

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

相关文章

Python网络爬虫:Scrapy框架的全面解析

Python网络爬虫&#xff1a;Scrapy框架的全面解析 一、引言 在当今互联网的时代&#xff0c;数据是最重要的资源之一。为了获取这些数据&#xff0c;我们经常需要编写网络爬虫来从各种网站上抓取信息。Python作为一种强大的编程语言&#xff0c;拥有许多用于网络爬虫的工具和库…

永磁同步电机无速度算法--滑模观测器(反正切、反余弦)

一、原理介绍 在永磁同步电机滑模观测器控制中&#xff0c;转子的位置和转速信息与反动电势密切相关。滑模观测器控制基本设计思路是&#xff1a;利用永磁同步电机的电压、电流信息&#xff0c;通过永磁同步电机数学模型&#xff0c;估算出电机在两相静止坐标系中的反电动势信…

鸿蒙NEXT不再支持安卓这条路真的走的通吗?

前言 看到高赞又是一片嘲讽&#xff0c;“apk换种打包方式”等等轻松拿几百赞&#xff0c;我也是无语。 国内多家互联网大厂都已经启动HarmonyOS Next应用开发&#xff0c;预计明年正式上线&#xff0c;如今业内很多人都已经知道了。 网络上相关报道也有很多&#xff0c;新浪…

[数据结构] 归并排序快速排序 及非递归实现

&#xff08;&#xff09;标题&#xff1a;[数据结构] 归并排序&&快速排序 及非递归实现 水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 (一)快速排序 类比递归谋划非递归 快速排序的非递归实现&#xff1a; &#xff08;二&#xff09;归并排序 归…

antdesignvue对话框用户可移动并缩放

原贴 轻松搞定Ant Design Modal对话框拖拽缩放 - ByteZoneX社区https://www.bytezonex.com/archives/IFRuoJhd.html Ant Design 模态对话框&#xff1a;实现拖拽缩放功能 **子 Ant Design 是一个流行的前端 UI 框架&#xff0c;提供了一系列实用的组件&#xff0c;包括模态对…

数据结构——二叉树相关题目

1.寻找二叉树中数值为x的节点 //寻找二叉树中数值为x的节点 BTNode* TreeFind(BTNode* root, BTDataType x)//传过来二叉树的地址和根的地址&#xff0c;以及需要查找的数据 {if (root Null){return Null;}//首先需要先判断这个树是否为空&#xff0c;如果为空直接返回空if (…

Linux下fcitx框架输入法输入中文标点时为半角(英文)标点符号的解决

目录 引入解决1.打开fcitx设置2.打开全局配置3. 随便找个可以输入地方敲下快捷键 总结 本文由Jzwalliser原创&#xff0c;发布在CSDN平台上&#xff0c;遵循CC 4.0 BY-SA协议。 因此&#xff0c;若需转载/引用本文&#xff0c;请注明作者并附原文链接&#xff0c;且禁止删除/修…

RNN 交叉熵

RNN善于处理时序 序列数据 简单RNN 展开就是 LSTM 遗忘门f_t决定上期记忆保留多少 隐藏层 在神经网络中&#xff0c;隐藏层指的是除了输入层和输出层之外的层&#xff0c;它们的输出不会直接用于网络的最终输出&#xff0c;而是作为中间步骤用于提取和转换数据。因此&#x…

构件软件开发-系统架构师(二十五)

1、一路和二路公交车都将在10分钟随机到达同一车站&#xff0c;他们相隔四分钟的概率是&#xff08;&#xff09;。 A0.36 B0.48 C0.64 D0.76 解析&#xff1a; 如果把x为1路&#xff0c;y为2路&#xff0c;则x-y4&#xff0c;y-x4 所以可以得到坐标 (4,0)(10,6)(0,4)(6,1…

(ECCV,2022)Mask-CLIP:从CLIP中提取自由密集标签

文章目录 Extract Free Dense Labels from CLIP相关资料摘要引言方法Mask-CLIPMask-CLIP 实验 Extract Free Dense Labels from CLIP 相关资料 代码&#xff1a;https://github.com/chongzhou96/MaskCLIP 论文&#xff1a;https://arxiv.org/abs/2112.01071 摘要 对比语言-…

PyVideoTrans:一款功能全面的视频翻译配音工具!【送源码】

PyVideoTrans是一款功能全面的视频翻译配音工具&#xff0c;专为视频内容创作者设计。它能够将视频中的语言翻译成另一种语言&#xff0c;并自动生成与之匹配的字幕和配音。支持多种语言&#xff0c;包括但不限于中文&#xff08;简繁体&#xff09;、英语、韩语、日语、俄语、…

算法010:无重复字符的最长子串

无重复字符的最长子串. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/longest-substring-without-repeating-characters/ 使用的算法&#xff1a;滑动窗口 在这个…

apk反编译修改教程系列-----修改apk 解除软件限制功能 实例操作步骤解析_3【二十二】

在前面的几期博文中有过解析去除apk中功能权限的反编译步骤。另外在以往博文中也列举了修改apk中选项功能权限的操作方法。今天以另外一款apk作为演示修改反编译去除软件功能限制的步骤。兴趣的友友可以参考其中的修改过程。 课程的目的是了解apk中各个文件的具体作用以及简单…

C-11 三角剖分的调研

C-11 三角剖分算法 三角剖分就是将输入的多边形&#xff0c;分割成一系列互不重叠的三角形&#xff0c;其重要性就在这不多赘述。这个是一个别人总结的链接&#xff1a;http://vterrain.org/Implementation/Libs/triangulate.html 图片链接&#xff1a;http://www-cgrl.cs.m…

STM32点灯闪烁

stm32c8t6引脚图 开发板引脚图 GPIO端口的每个位可以由软件分别配置成 多种模式。 ─ 输入浮空 ─ 输入上拉 ─ 输入下拉 ─ 模拟输入 ─ 开漏输出 ─ 推挽式输出 ─ 推挽式复用功能 ─ 开漏复用功能 配置GPIO端口步骤&#xff1a;开启时钟->使用结构体设置输出模式…

Android项目中,查看项目依赖树的多种方式

1.使用预设的Task来进行查看 1.1 命令行 查看某个模块的所有依赖树&#xff1a; gradlew [模块名称]:dependencies 例如&#xff1a;gradlew app:dependencies查看某个模块的某功能的依赖树&#xff1a; gradlew [模块名称]:dependencies --configuration [功能名称] 例如&…

国内采用docker部署open-metadata

背景 最近看看开源的元数据管理项目&#xff0c;比较出名点的有open-metadata、datahub、OpenLineage、atlas。 open-metadata有1千多的贡献者&#xff0c;4.8K的stars&#xff0c;社区现在也比较活跃&#xff0c;支持的数据库类型还蛮多&#xff0c;基本市面上常见的都有支持…

C++ 函数高级——函数的占位参数

C中函数的形参列表里可以有占位参数&#xff0c;用来做占位&#xff0c;调用函数时必须填补改位置 语法&#xff1a; 返回值类型 函数名&#xff08;数据类型&#xff09;{ } 在现阶段函数的占位参数存在意义不大&#xff0c;但是后面的课程中会用到该技术 示例&#xff1a;…

离线开发(VSCode、Chrome、Element)

一、VSCode 扩展 使用能联网的电脑 A&#xff0c;在VSCode官网下载安装包 使用能联网的电脑 A&#xff0c;从扩展下载vsix扩展文件 将VSCode安装包和vsix扩展文件通过手段&#xff08;u盘&#xff0c;刻盘 等&#xff09;导入到不能联网的离线电脑 B 中 在离线电脑 B 中安装…

Gitlab Fork Workflow(协作工作流)

Gitlab Fork WorkFlow&#xff08;协作工作流&#xff09; Fork WorkFlow用于团队间的协作开发。在开发过程中&#xff0c;我们都需要将最新修改的代码合并到代码库上&#xff0c;在代码合并之前&#xff0c;为了保证代码符合上传要求&#xff08;符合需求、代码规范等&#xf…