1. 程式人生 > >使用SpringBoot2.0搭建企業級應用開發框架(五)多環境配置

使用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包