Spring Boot配合Maven的Profile機制完成環境適配

weixin_33976072發表於2018-09-29

我們在一個產品的生命週期內,會接觸多個環節:開發環境、測試環境、生產環境,這些環境會對應不同的DataSource、Redis叢集、Zookeeper等配置。

  1. Maven的Profile機制
    Profile能讓你為一個特殊的環境自定義一個特殊的構建;profile使得不同環境間構建的可移植性成為可能。Maven中的profile是一組可選的配置,可以用來設定或者覆蓋配置預設值。有了profile,你就可以為不同的環境定製構建。
<project>
   <profiles>
       <profile>
           <build>
               <defaultGoal>...</defaultGoal>
               <finalName>...</finalName>
               <resources>...</resources>
               <testResources>...</testResources>
               <plugins>...</plugins>
           </build>
           <reporting>...</reporting>
           <modules>...</modules>
           <dependencies>...</dependencies>
           <dependencyManagement>...</dependencyManagement>
           <distributionManagement>...</distributionManagement>
           <repositories>...</repositories>
           <pluginRepositories>...</pluginRepositories>
           <properties>...</properties>
       </profile>
   </profiles>
</project>  

一個Profile可以覆蓋專案構件的最終名稱,專案依賴,外掛配置以影響構建行為,Profile還可以覆蓋分發配置。maven提供了一種針對不同環境引數“啟用”一個profile的方式,這就叫做profile啟用。

使用-P引數顯示的啟用一個profile

我們在進行Maven操作時就可以使用-P引數顯示的指定當前啟用的是哪一個profile了。比如我們需要在對專案進行打包的時候使用id為profileTest1的profile,我們就可以這樣做:

mvn package –P profileTest1 
  1. Spring Boot的支援
    SpringBoot使用一個全域性的配置檔案application.propertiesapplication.yml,配置檔案路徑:src/main/resource目錄下或類路徑下的/config下。

Spring boot支援配置多個環境的配置檔案,其配置檔名字格式application-{profile}.yml

Spring可以在application.properties指定啟用的profile,配置如下:

#properties格式
spring.profiles.active=dev

也可以在啟動應用的時候新增啟動引數--spring.profiles.active=dev
(⚠️Spring Boot的Profile機制和Maven的其實是沒關係的,文末給出了一篇部落格,講解了如何將Maven的Profile機制與Spring Boot的active profile機制同步,未驗證)

  1. 微服務環境下的配置檔案
    前面介紹的兩種方式,配置檔案都顯式的暴露在專案中,這對於實際運營的專案,是有比較多的問題的:

    1. 對於線上運營的專案有安全隱患,資料庫等資訊都會暴露出來,給產品的安全帶來很大的隱患
    2. 對於微服務場景,不利於維護
      (1)配置分散在不同的專案中,不利於統一管理
      (2)配置和程式碼處於同一個版本體系下,不利於版本管理
      (3)多個系統共同使用的配置更改時,需要一處處去修改,非常麻煩,容易出錯
      (4)對於動態配置的檔案,也不利於OPS維護
      因此,業界普遍採用了Config Server的方式,Spring Cloud提供了Spring Cloud Config的元件,幫助我們管理微服務的配置。

    Consu可以l作為配置服務,並採用git儲存。另外Spring Cloud Config也支援git版本管理,Consul在可用性的支援上更勝一籌;對於動態配置,Consul也會方便一些不需要藉助Spring Cloud Bus這樣的中介軟體。(Spring Cloud Bus將Spring的事件處理機制和訊息中介軟體訊息的傳送和接收整合起來,可以輕鬆的將分散式應用中連線有訊息中介軟體的多個服務節點連線起來,實現訊息互通。)

參考文獻:
https://www.cnblogs.com/wxgblogs/p/6696229.html(Maven Profiles詳解)
https://www.jianshu.com/p/8c48f4fd69da(Profile之Maven、Spring Boot、Spring Cloud Config)
https://www.cnblogs.com/softidea/p/6375806.html(從Maven的Profile環境獲取Spring Boot的active profile)
https://yq.aliyun.com/articles/468274(阿里巴巴微服務配置中心介紹)
https://www.jianshu.com/p/b1463c1df5a2(Consul作為微服務配置中心)

相關文章