【Java】Maven Profile管理Spring cloud多環境配置

一、前言

一般環境分爲三種:開發環境、測試環境、部署環境。
舉個簡單的例子,當完成開發,向服務器部署時,就要更改項目配置文件裏的內容。這對於小的單體項目來說尚可接受,但對於微服務這樣的項目可是麻煩死了。
有沒有一種可以一鍵切換開發環境的按鈕

二、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>

這樣一來就能替換成功了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章