文章目錄
- 舉例分析
- 項目結構如下
- 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多個環境,從左到右依次掃描加載」,后加載的總是覆蓋先加載的。