微服務之配置服務器切換profile

最近遇到Spring-boot的多個profile切換問題,需求是這樣的:微服務中引入了Spring Cloud Config,服務啓動的時候,從Config Server中讀取該實例對應的配置信息。本地開發環境可能使用的profile是default,到了集成測試環境就須要切換到jenkins,到了預發佈環境又變成了prod。多個profile須要之間能夠切換。spring

這邊設置的時候還走了點彎路,先是探索了一遍pom的profile,後來纔到Spring-boot的配置文件。docker

這兩部分實現的功能不太同樣,本文將會具體講下這兩部分。服務器

1. profile之Maven

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動態指定你所須要加載的配置文件。微服務

2. profile之Spring boot

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。

entry

idea配置

profile

idea配置profile

3. config server的配置

這節講下與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}

startup

容器啓動截圖

從容器的啓動截圖來看,指定了docker run -d -e ACTIVE_PROFILE=exp ...後,active profile 變味了exp,而且從config server中拉取對應的是gatewayserver的exp配置。

4. 總結

本文主要寫了Spring-boot配置服務器切換profile。首先描述了需求背景,而後是對maven pom中profile進行了探索與講解,其次是講解了Spring-boot中的profile切換,最後結合config server實現容器部署微服務的profile。筆者最開始一直認爲經過pom的profile切換就能夠設置服務啓動的profile,通過一番探索,發現與配置服務器結合好像並不須要pom的profile這麼繁瑣,結合配置服務器能夠更方便的使用Spring boot的profile。

相關文章
相關標籤/搜索