一、前言
一般環境分爲三種:開發環境、測試環境、部署環境。
舉個簡單的例子,當完成開發,向服務器部署時,就要更改項目配置文件裏的內容。這對於小的單體項目來說尚可接受,但對於微服務這樣的項目可是麻煩死了。
有沒有一種可以一鍵切換開發環境的按鈕
二、Spring Boot Profile
Spring Boot已經提供了配置管理的功能,如下:
spring:
profiles:
active: prod
---
spring:
profiles: dev
cloud:
config:
name: consumer
profile: dev
label: master
uri: http://127.0.0.1:8888
---
spring:
profiles: prod
cloud:
config:
name: consumer
profile: prod
label: master
uri: http://*.*.*.*:8888
使用spring.profiles.active來指定配置,不同的配置之間使用—分隔,以及使用spring.profiles來指定當前配置的名字。
對於單體應用來說已經很方便了,無非就是多寫幾個配置,到時候手動的將spring.profiles.active的值一改就行了。
但是對於微服務來說,手動的改依然很麻煩,畢竟那麼多服務呢。儘管用了配置管理中心,我們可以將不同環境的配置文件託管到git上讓配置管理中心讀取,但是每個服務仍然需要有一個配置文件與配置管理中心打交道,就是上面舉的例子的代碼。這就需要我們依然要去管理這些配置未見的profiles了。
三、Maven Profile
Maven也提供了Profile切換功能,而且Idea支持的也很好,將微服務的所有module的pom文件裏添加如下代碼:
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profile.active>dev</profile.active>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profile.active>prod</profile.active>
</properties>
</profile>
<profile>
<id>remo</id>
<properties>
<profile.active>remo</profile.active>
</properties>
</profile>
</profiles>
就可以看到Idea右側的Maven工具欄裏多出了Profiles選項,裏面是上面代碼定義的環境名。
但是此時任然不能使用。
四、@profile.active@
用Maven的@profile.active@替換掉Spring Profile,如下:
spring:
profiles:
active: @profile.active@
一把情況下這樣已經可以使用了,無論是Idea運行還是Maven打包,都會遵從你選的環境將@profile.active@替換掉。
但Spring cloud比較特殊,使用配置中心後不會在使用application.yml,而是使用bootstrap.yml。但是Maven只認application.yml,bootstrap.yml裏的@profile.active@不會被替換掉。
如果將bootstrap.yml改名爲application.yml,那麼由於兩者加載優先級不一樣,會導致程序只按照默認環境執行。
那麼只剩一種辦法了,在pom文件的build標籤裏添加如下代碼,用於過濾yml文件:
<resources>
<resource>
<directory>src/main/resources</directory>
<!--可以在此配置過濾文件 -->
<includes>
<include>**/*.yml</include>
</includes>
<!--開啓filtering功能 -->
<filtering>true</filtering>
</resource>
</resources>
這樣一來就能替換成功了