使用SpringBoot2.0搭建企業級應用開發框架(五)多環境配置
-
血淚背景
在將甲方粑粑的想法實踐於世人之前,我們的專案至少要經歷 開發→測試→執行 3個環境,對於不同的環境我們可能需要連線不同的資料庫、設定不同的上傳路徑、呼叫不同地址的遠端服務等等,這就要求必須有不同的配置來滿足多環境需求
如果我們是通過打包前手動修改檔案內容的話,會由於內容繁多,產生頭暈眼花、手腳無力、反應遲鈍等症狀,從而導致修改出錯,以至於部署失敗、執行出錯、甲方粑粑很生氣、後果很嚴重等問題。筆者就經歷過這樣的老舊專案,總共6個應用需要打包,每個應用至少改3個配置檔案,而且甲方粑粑本著從嚴(sa)肅(le)認(ba)真(ji)的角度出發,設立了3個測試伺服器+1個正式伺服器+2個正式伺服器的備胎???
為了避免在新專案中含淚走我的老路 ,我們就需要多環境的配置,SpringBoot支援通過配置多份不同環境的配置檔案,用打包命令去區分打包
-
配置方式
在SpringBoot中多環境配置檔名需要滿足application-{profile}.properties或application-{profile}.yml格式,其中的{profile}對應當前環境標識,比如:
1、application-dev.yml開發環境
2、application-test.yml測試環境
3、application-pro.yml生成環境
至於哪個配置檔案會被載入,我們需要在application.yml中通過spring.profile.active來設定,它的值即上文中的{profile}
#properties檔案配置
spring.profiles.active=dev
#yml檔案配置
spring:
profiles:
active: dev
這時候我們就可以根據環境執行不同的配置檔案了
方式一:1、修改application.yml後直接打包
2、在對應環境直接執行jar -jar xx.jar命令進行部署
方式二:直接打包,在對應環境直接執行java -jar xxx.jar --spring.profiles.active=**命令進行部署
-
改進
如果我們存在這樣一種情況:不同環境的包由不同的運維人員去維護,他們相互之間要對配置資訊進行隔離(比如資料來源資訊),那麼我們來看下通過上文配置獲取的jar包裡面是什麼樣子。隨便用一個反編譯工具開啟由上文配置打包的jar包
由此可見,該打包方式無法使各自環境的包相互隔離配置資訊,所以我們需要用Maven分環境打包的協助
首先我們在pom.xml新增如下資訊
<profiles>
<profile>
<id>dev</id>
<properties>
<profileActive>dev</profileActive>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<profileActive>test</profileActive>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<profileActive>prod</profileActive>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
</profiles>
<build>
<resources>
<!-- 先在資源根目錄排除所有的資原始檔 -->
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*</exclude>
<exclude>*.*</exclude>
</excludes>
</resource>
<!-- 再單獨指定需要拷貝的資原始檔 -->
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application.yml</include>
<include>application-${profileActive}.yml</include>
<include>logback-spring.xml</include>
</includes>
</resource>
<!-- 此配置不可缺,否則mybatis的Mapper.xml將會丟失 -->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
然後將application.yml中改為
spring:
profiles:
active: @[email protected]
這樣就可以由Maven去控制jar包的版本和資源隔離的問題,為了測試,我們打一個包看下里面的結構,執行mvn: clean package -P test命令,反編譯得到的jar包
可以看到,通過Maven的過濾,我們獲取了單一配置檔案的jar包