最近遇到Spring-boot的多個profile切換問題,需求是這樣的:微服務中引入了Spring Cloud Config,服務啓動的時候,從Config Server中讀取該實例對應的配置信息。本地開發環境可能使用的profile是default,到了集成測試環境就須要切換到jenkins,到了預發佈環境又變成了prod。多個profile須要之間能夠切換。spring
這邊設置的時候還走了點彎路,先是探索了一遍pom的profile,後來纔到Spring-boot的配置文件。docker
這兩部分實現的功能不太同樣,本文將會具體講下這兩部分。bash
maven切換profile的命令很簡單,加上-P
參數指定你的profile,如指定prod:服務器
mvn clean package -P prod複製代碼
maven使用名字爲prod的profile來打包,即全部的配置文件都使用生產環境。
下面看下pom中的profiles:app
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profileActive>dev</profileActive>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</profile>
<profile>
<id>prod</id>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
</dependencies>
<properties>
<profileActive>prod</profileActive>
</properties>
</profile>
</profiles>複製代碼
對於resources的配置以下:maven
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<!-- 過濾掉全部配置文件-->
<excludes>
<exclude>application-dev.yml</exclude>
<exclude>application-prod.yml</exclude>
</excludes>
</resource>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
<!--根據profile中的變量profileActive指定對應的配置文件-->
<includes>
<include>application-${profileActive}.yml</include>
</includes>
</resource>
</resources>
</build>複製代碼
上面的兩段pom配置相結合,當指定profile爲prod時,環境變量profileActive的屬性值變爲prod。指定打包時,包含application-prod.yml。spring-boot
因此當你有多套配置文件,能夠動態根據mvn命令的參數-P動態指定你所須要加載的配置文件。微服務
Profile是Spring boot用來針對不一樣環境對不一樣配置提供支持的,全局Profile配置使用。
application-{profile}.yml 如:application-yml。測試
spring經過配置spring.profiles.active指定激活某個具體的profile。除了spring.profiles.active來激活一個或者多個profile以外,還能夠用spring.profiles.include來疊加profile。ui
spring.profiles.include: prod,dev複製代碼
下面看一下咱們的application.yml中包含的配置:
spring:
profiles:
active: dev
---
#開發環境配置
spring:
profiles: dev
server:
port: 8080
---
#測試環境配置
spring:
profiles: test
server:
port: 8081
---
#生產環境配置
spring:
profiles: prod
server:
port: 8082複製代碼
application.yml文件分爲四部分,使用一組(---)來做爲分隔符。第一部分,通用配置部分,表示三個環境都通用的屬性,默認激活了dev的profile;後面三部分分別表示不一樣的環境,指定了不一樣的port。
部署到服務器的話,正常會打成jar包,加上參數--spring.profiles.active=test
指定加載哪一個環境的配置。
在IDE中也能夠直接配置激活的profile。
這節講下與Spring cloud config的結合使用。既然使用了config server,動態配置這塊基本就由配置服務器完成了。配置服務器中對該服務指定多個profile。config Server中的配置優先於本地配置,當服務啓動時,根據激活的profile,去配置服務器拉取其對應的配置。
既然知道了上面的主要流程,就能夠明白咱們的需求實際上是要在服務啓動時指定激活的profile。因此上面一節關於Spring boot的profile動態配置,咱們的問題就能解決了。但上面講到的是jar包啓動時指定--spring.profiles.active
,實際都是微服務的容器化部署,服務經過容器直接啓動jar包,這樣就須要容器啓動的時候可以動態指定active profile,因此上面的配置改一下,以下:
spring:
profiles:
active: ${ACTIVE_PROFILE:dev}複製代碼
從容器的啓動截圖來看,指定了docker run -d -e ACTIVE_PROFILE=exp ...
後,active profile 變味了exp,而且從config server中拉取對應的是gatewayserver的exp配置。
本文主要寫了Spring-boot配置服務器切換profile。首先描述了需求背景,而後是對maven pom中profile進行了探索與講解,其次是講解了Spring-boot中的profile切換,最後結合config server實現容器部署微服務的profile。筆者最開始一直認爲經過pom的profile切換就能夠設置服務啓動的profile,通過一番探索,發現與配置服務器結合好像並不須要pom的profile這麼繁瑣,結合配置服務器能夠更方便的使用Spring boot的profile。
訂閱最新消息,關注公衆號,加入個人星球。