相信朋友們在工作中都用到了多環境配置,在啟動或打包時指定
spring.profiles.active
同時spring還提供了一個配置
spring.profiles.include
整個多環境配置的核心就是用到了這兩個配置。
在應用時,spring.profiles.include的值一般是固定的,而spring.profiles.active是可變的,具體值一般由兩種途徑指定
1. 打包時,透過maven的profile配置獲取
2. 啟動時,透過引數指定, --spring.profiles.active=dev
spring: profiles: active: @spring.profiles.active@ # 比如下面配置了nacos,那麼Spring會在所有jar的classes路徑下查詢application-nacos.yml, bootstrap-nacos.yml,找不到會忽略 include: all,web,business,seata,nacos application: name: @artifactId@
以前只知道application-nacos.yml, 並不知道原來bootstrap也可以這樣。
SpringCloud有兩種配置檔案,bootstrap.yml的載入會比較早,方便配置nacos, 然後從nacos讀取配置,而application.yml大家都比較熟悉了,用來配置具體項。
我們開始的方案是把nacos的addr和namespace放在maven的profile, 透過打包替換bootstrap.yml中的值,
spring: profiles: # @變數@,用來替換maven的properties的值 active: @spring.profiles.active@ include: all,web,business,seata,nacos application: name: @artifactId@ cloud: nacos: # 配置中心 config: server-addr: @nacos.server.addr@ namespace: @nacos.namespace@ file-extension: yml shared-configs[0]: data-id: maternal-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} refresh: true # 註冊中心 discovery: server-addr: @nacos.server.addr@ namespace: @nacos.namespace@
pom.xml的profiles
但隨著我們需求的變化,發版,有時候會同時釋出多個環境,每個環境打一次包,太耗時;當然,我們是透過提前寫好的shell指令碼啟動的,可以在啟動時指定引數,
如下:
nacosadder='127.0.0.1:8848'nacosnamespace='uuid'springenv='dev'startup=" --spring.profiles.active=${springenv} --spring.cloud.nacos.config.server-addr=${nacosadder} --spring.cloud.nacos.config.namespace=${nacosnamespace} --spring.cloud.nacos.discovery.namespace=${nacosnamespace} --spring.cloud.nacos.discovery.server-addr=${nacosadder} "
但這引數實在是太長了,有沒有更好的方案呢? 一次靈感閃現,想到了bootstrap.yml是不是也可以像application-xx.yml這些寫,然後實踐嘗試,果真可以,隨後進行了改造。
由於nacos用到了註冊和配置兩個功能,啟動時變數需要指定4個配置,曾經構想用${xx}引用的方式來避免nacos配置指定兩次,然後Spring並不支援啟動時指定變數a, 然後b又引用a,必須直接指定具體配置項。
下面上最終圖
可能會有同學說,既然用到了nacos配置中心,那就把配置都放上去就行了,本地不用搞這麼複雜的配置,
我的想法是這樣的,優先以本地配置為主,就算沒有nacos也可以正常執行,當需要實時修改配置時,再在nacos加上相關配置,用於覆蓋本地配置。
畢竟大部分配置的修改頻率不高,如果把配置都放在nacos,那每個環境都需要去加上配置,這對於開發人員還是很煩的,更嚴重的是容易忘記或遺漏。