最近遇到Spring-boot的多個profile切換問題,需求是這樣的:微服務中引入了Spring Cloud Config,服務啓動的時候,從Config Server中讀取該實例對應的配置信息。本地開發環境可能使用的profile是default,到了集成測試環境就須要切換到jenkins,到了預發佈環境又變成了prod。多個profile須要之間能夠切換。spring
這邊設置的時候還走了點彎路,先是探索了一遍pom的profile,後來纔到Spring-boot的配置文件。docker
這兩部分實現的功能不太同樣,本文將會具體講下這兩部分。服務器
maven切換profile的命令很簡單,加上-P
參數指定你的profile,如指定prod:app
mvn clean package -P prod
maven使用名字爲prod的profile來打包,即全部的配置文件都使用生產環境。
下面看下pom中的profiles:maven
<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的配置以下:ide
<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。
idea配置
idea配置profile
這節講下與Spring cloud config的結合使用。既然使用了config server,動態配置這塊基本就由配置服務器完成了。配置服務器中對該服務指定多個profile。config Server中的配置優先於本地配置,當服務啓動時,根據激活的profile,去配置服務器拉取其對應的配置。
既然知道了上面的主要流程,就能夠明白咱們的需求實際上是要在服務啓動時指定激活的profile。因此上面一節關於Spring boot的profile動態配置,咱們的問題就能解決了。但上面講到的是jar包啓動時指定--spring.profiles.active
,實際都是微服務的容器化部署,服務經過容器直接啓動jar包,這樣就須要容器啓動的時候可以動態指定active profile,因此上面的配置改一下,以下:
1 2 3 |
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。