文章目录
- 举例分析
- 项目结构如下
- 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: ApeinternationalEnabled: truedefaultProductId: 1000# ServiceInstanceMeta
serviceInstanceMeta:serviceName: noddles-usersecurity.filterOrder: 20# MySQL 连接配置
noddlesUser.mysql:dynamicConfigEnabled: truedynamicConfigKey: noddles_user-pyIXkE-testdynamicConfigGroup: op-dba-mysql-confreadWriteSplit: truetestOnBorrow: truevalidationQuery: SELECT 1# 数据库自动初始化 默认关闭
spring.datasource.initialize: false# Actuator 配置
actuator:project: noddles-userfdc.projectIdentity: noddles-userspring.profiles.active: local,sg-test,soho-testlogging.access.directory: /home/shared/logspring:profiles:include: backend-oversea# 本地环境
---
spring:profiles: localrpcServer.zkNode: false
logging.access.enabled: false
actuator.enabled: false---
# 测试服务环境
spring:profiles: testlogging.config: classpath:log4j2.test.yaml---
# 线上服务环境
spring:profiles: onlineremind.env: 线上---
# 测试服务环境
spring:profiles: bj-testalimq.topics:userLogin:cluster: noddles_testtopic: JIALIDUN_NOODLES_USER_LOGIN_TESTconsumerId: GID_JIALIDUN_NOODLES_USER_LOGIN_TEST---
# 线上服务环境
spring:profiles: bj-onlinenoddlesUser.mysql:dynamicConfigEnabled: truedynamicConfigKey: noddles-user-online-noddles_user-onlinedynamicConfigGroup: op-dba-mysql-confreadWriteSplit: truetestOnBorrow: truevalidationQuery: SELECT 1alimq.topics:userLogin:cluster: noddles_onlinetopic: JIALIDUN_NOODLES_USER_LOGIN_ONLINEconsumerId: 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-onlinezkServers: dx-zk1,dx-zk2,dx-zk3,dx-zk4,dx-zk5---
# 廊坊线上机房
spring:profiles: lf-onlinezkServers: lf-zk1,lf-zk2,lf-zk3,lf-zk4,lf-zk5---
# 阿里新加坡线上机房
spring:profiles: alisg-onlinezkServers: lf-zk1,lf-zk2,lf-zk3,lf-zk4,lf-zk5
application-backend-oversea.yaml
# 海外测试服务环境
spring:profiles: sg-testnoddlesUser.mysql:dynamicConfigEnabled: truedynamicConfigKey: noddles_sg_user-NwQVE1-testdynamicConfigGroup: op-dba-mysql-confreadWriteSplit: truetestOnBorrow: truevalidationQuery: SELECT 1alimq.topics:userLogin:cluster: noddles_sg_testtopic: JIALIDUN_NOODLES_USER_LOGIN_TESTconsumerId: GID_JIALIDUN_NOODLES_USER_LOGIN_TEST---
# 海外线上服务环境
spring:profiles: sg-onlinenoddlesUser.mysql:dynamicConfigEnabled: truedynamicConfigKey: noddles_sg_user-r5vJDb-onlinedynamicConfigGroup: op-dba-mysql-confreadWriteSplit: truetestOnBorrow: truevalidationQuery: SELECT 1alimq.topics:userLogin:cluster: noddles_sg_onlinetopic: JIALIDUN_NOODLES_USER_LOGIN_ONLINEconsumerId: 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-onlinezkServers: lf-zk1,lf-zk2,lf-zk3,lf-zk4,lf-zk5---
# 线上新加坡机房
spring:profiles: alisg-onlinezkServers: lf-zk1,lf-zk2
noddles-user-job 配置文件
spring:profiles:include: backendcommon.xxl.job.executor:appname: noddles-user-jobmailer:biz: noddles---
# 配置类型:region+环境相关配置
# 配置用途:用于同时与region和环境相关的配置,或者仅与region相关的配置
# region-环境:新加坡-测试
spring:profiles: sg-testcommon.xxl.job.executor:appname: noddles-user-job-sg---
# 配置类型:region+环境相关配置
# 配置用途:用于同时与region和环境相关的配置,或者仅与region相关的配置
springprofiles: sg-onlinecommon.xxl.job.executor:appname: noddles-user-job-sg
noddles-user-server 配置文件
authFilter:appKey: ApeinternationalEnabled: truedefaultProductId: 1000# ServiceInstanceMeta
serviceInstanceMeta:serviceName: noddles-usercommon.xxl.job.executor:appname: noddles-user# Web Server 配置
server:port: 8080tomcat:maxThreads: 500# Rpc Server 配置
rpcServer:port: 5000zkNode: /noddles-user/rpc/v1
---
spring.profiles.include: backend---
# 配置类型:region+环境相关配置
# 配置用途:用于同时与region和环境相关的配置,或者仅与region相关的配置
# region-环境:新加坡-测试
spring:profiles: sg-testcommon.xxl.job.executor:appname: noddles-user-sg---
# 配置类型:region+环境相关配置
# 配置用途:用于同时与region和环境相关的配置,或者仅与region相关的配置
# region-环境:新加坡-线上
spring:profiles: sg-onlinecommon.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多个环境,从左到右依次扫描加载」,后加载的总是覆盖先加载的。