springboot配置扫描生效顺序

文章目录

  • 举例分析
    • 项目结构如下
    • 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多个环境,从左到右依次扫描加载」,后加载的总是覆盖先加载的。

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

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

相关文章

java集合(2)

目录 一. Map接口下的实现类 1. HashMap 1.1 HashMap常用方法 2. TreeMap 2.1 TreeMap常用方法 3. Hashtable 3.1 Hashtable常用方法 4.Map集合的遍历 4.1 根据键找值 4.2 利用map中的entrySet()方法 二.Collections类 1.Collections类中的常用方法 三. 泛型 1. 为什…

运维锅总详解系统启动流程

本文详细介绍Linux及Windows系统启动流程&#xff0c;并分析了它们启动流程的异同以及造成这种异同的原因。希望本文对您理解系统的基本启动流程有所帮助&#xff01; 一、Linux系统启动流程 Linux 系统的启动流程可以分为几个主要阶段&#xff0c;从电源开启到用户登录。每个…

揭秘IP:从虚拟地址到现实世界的精准定位

1.IP地址介绍 1.内网 IP 地址&#xff08;私有 IP 地址&#xff09; 内网 IP 地址&#xff0c;即私有 IP 地址&#xff0c;是在局域网&#xff08;LAN&#xff09;内部使用的 IP 地址。这些地址不会在公共互联网中路由&#xff0c;因此可以在多个局域网中重复使用。私有 IP 地…

设计模式探索:责任链模式

1. 什么是责任链模式 责任链模式 (Chain of Responsibility Pattern) 是一种行为型设计模式。定义如下&#xff1a; 避免将一个请求的发送者与接收者耦合在一起&#xff0c;让多个对象都有机会处理请求。将接收请求的对象连接成一条链&#xff0c;并且沿着这条链传递请求&…

14-43 剑和诗人17 - ActiveRAG之主动学习

​​​​​ 大型语言模型 (LLM) 的出现开启了对话式 AI 的新时代。这些模型可以生成非常像人类的文本&#xff0c;并且比以往更好地进行对话。然而&#xff0c;它们在仅依赖预训练知识方面仍然面临限制。为了提高推理能力和准确性&#xff0c;LLM 需要能够整合外部知识。 检索…

文件存储的方法一

文章目录 概念介绍实现方法示例代码 我们在上一章回中介绍了"如何实现本地存储"相关的内容&#xff0c;本章回中将介绍如何实现文件存储.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在上一章回中介绍的本地存储只能存储dart语言中基本类型的数值…

ffmpeg图片视频编辑器工具的安装与使用

title: ffmpeg图片视频编辑器工具的安装与使用 tags: [ffmpeg, 图片, 音频, 视频, 工具, 流媒体] categories: [工具, ffmpeg] FFmpeg是一个开源的命令行工具&#xff0c;广泛用于处理视频和音频文件&#xff0c;包括转换格式、剪辑、混流、解码、编码等。以下是一些基本的FFmp…

Zabbix 的部署和自定义监控内容

前言 一个完整的项目的业务架构包括 客户端 -> 防火墙 -> 负载均衡层&#xff08;四层、七层 LVS/HAProxy/nginx&#xff09; -> Web缓存/应用层&#xff08;nginx、tomcat&#xff09; -> 业务逻辑层(php/java动态应用服务) -> 数据缓存/持久层&#xff08;r…

智慧水利的变革之路:如何通过大数据、物联网和人工智能构建高效、智能、可持续的水利管理新模式

目录 一、引言&#xff1a;智慧水利的时代背景与意义 二、大数据&#xff1a;水利管理的数据基石 &#xff08;一&#xff09;数据收集与整合 &#xff08;二&#xff09;数据分析与挖掘 三、物联网&#xff1a;水利管理的感知神经 &#xff08;一&#xff09;智能感知与监…

Git 操作补充:cherry-pick、变基

1. 挑选提交合并 git cherry-pick 对于多分支的代码库&#xff0c;将代码从一个分支转移到另一个分支是一种常见的需求&#xff0c;这可以分成两种情况&#xff1a;一种情况是&#xff0c;你需要另一个分支的所有代码变动&#xff0c;那么就采用 git merge&#xff1b;另一种情…

【Unity2D 2022:UI】制作角色血条

一、创建血底UI 1. 创建画布&#xff08;Canvas&#xff09; 2. 在画布上添加血底图像&#xff08;Image&#xff09;子物体 二、编辑血底UI 1. 将血底图片拖入源图像&#xff08;Source Image&#xff09;中 2. 点击设置为图片的原大小&#xff08;Set Native Size&#x…

算法重新刷题

基础算法 前缀和 一维前缀和 [USACO16JAN] Subsequences Summing to Sevens S - 洛谷 这一题主要是需要结合数学知识来求解&#xff0c; #include <iostream> #include <cstring> #include <cstdio> #include <algorithm>using namespace std;con…

java花店管理系统eclipse开发mysql数据库

1 绪论 1.1 系统开发目的 随着人们物质生活水平和经济水平的不断提高&#xff0c;室内绿化布置、家庭园艺装饰、礼仪鲜花等日益受到重视和青睐&#xff0c;以及送鲜花给亲朋好友来表达自己的情谊。传统的花店对于信息的管理的主要方式是基于文本、表格等纸质手工处理&#xf…

【经验篇】Spring Data JPA开启批量更新时乐观锁失效问题

乐观锁机制 什么是乐观锁&#xff1f; 乐观锁的基本思想是&#xff0c;认为在大多数情况下&#xff0c;数据访问不会导致冲突。因此&#xff0c;乐观锁允许多个事务同时读取和修改相同的数据&#xff0c;而不进行显式的锁定。在提交事务之前&#xff0c;会检查是否有其他事务…

mac M1安装 VSCode

最近在学黑马程序员Java最新AI若依框架项目开发&#xff0c;里面前端用的是Visual Studio Code 所以我也就下载安装了一下&#xff0c;系统是M1芯片的&#xff0c;安装过程还是有点坑的写下来大家注意一下 1.在appstore中下载 2.在系统终端中输入 clang 显示如下图 那么在终端输…

【Linux进程】命令行参数 环境变量(详解)

目录 前言 1. 命令行参数 什么是命令行参数? 2. 环境变量 常见的环境变量 如何修改环境变量? 获取环境变量 环境变量的组织方式 拓展问题 导入环境变量 3. 本地变量* 总结 前言 在使用Linux指令的时候, 都是指令后边根命令行参数, 每个指令本质都是一个一个的可执行程…

JAVA集合框架、CAS、AQS

目录 一、java 的集合框架有哪些? 二、说-下 ArrayList 和 LinkedList? 三、HashSet和TreeSet的区别? 四、HashMap 的数据结构是什么? 五、CAS机制 六、AQS理解 一、java 的集合框架有哪些? Collection 是 Java 集合框架中的一个根接口&#xff0c;位于 java.util 包中。它…

亲密数对C++函数

自定义函数 #include<bits/stdc.h> using namespace std; //求n的因子和自定义函数 int yinzihe(int n){//使用2~sqrt(n)成对求解因子和int r0,i;//变量 r 初始值为0&#xff0c;因为要存放因子和for(i2;i<sqrt(n);i) {//回顾sqrt()课程//如果 i 是 n 的因子&#xf…

微笑背后的秘密:理解自闭症儿童的面部表情控制

在星贝育园自闭症儿童康复学校&#xff0c;我们常常遇到家长们提出的一个有趣而引人深思的问题&#xff1a;“为什么我的孩子似乎控制不住面部表情&#xff0c;尤其是频繁地笑&#xff1f;”这个问题背后&#xff0c;隐藏着自闭症谱系障碍&#xff08;ASD&#xff09;儿童独特的…

Caffeinated for Mac v2.0.6 Mac防休眠应用 兼容 M1/M2/M3

Caffeinated 可以防止您的 Mac 进入休眠状态、屏幕变暗或者启动屏幕保护。 应用介绍 您的屏幕是否总是在您不希望的时候变暗&#xff1f;那么Caffeinated就是您解决这个大麻烦的最好工具啦。Caffeinated是在Caffeine这个非常便捷、有用的工具的基础上开发而来的。Caffeinated…