1. 程式人生 > >關於多環境配置幾種方法

關於多環境配置幾種方法

在實際專案開發過程中,我們往往需要區分開發,測試,預釋出,生產等環境,而這幾個環境的配置也會有些不同。今天我給大家介紹下用spring實現這種需求,常見幾種方法:

一.使用yml檔案進行區分

這種方法又可以細分為兩種方法:
1.使用application.yml 配置共同的引數,並確定當前執行環境(也可以在啟動部署包時指定,例如:java -jar test.jar --spring.profiles.active=dev)

mybatis: 
  mapper-locations: classpath:mapping/*.xml
  type-aliases-package: com.fhbean.springboot.mybatisdemo.model
pagehelper:
  helperDialect: mysql
  reasonable: true
  supportMethodsArguments: true
  params: count=countSql
spring: 
  profiles: 
    active: dev
//表示單前為dev環境,取值可為開發dev、測試test、預生產stage,生產pro

緊接著編寫application-{profile}.yml不同檔案,{profile}的取值可以是dev, test, rc,pro,可以配置不同環境個性化配置。
2.可以只需要一個application.yml 檔案,在這個檔案中用 ---區分不同環境,首先第一部分為公共配置,不同環境之間用 ---隔開(確定當前環境的方式同上)
例如:

spring:
  profiles:
    active: dev
    //該部分為公共配置部分,可以配置當前要使用哪個環境
    ---
    server:
      port: 8081
    spring:
      profiles: dev
    ---
    server:
      port: 8081
    spring:
      profiles: test
    ---
    server:
      port: 8081
    spring:
      profiles: stage
    ---
    server:
      port: 8081
    spring:
      profiles: stage
    ---
    server:
      port: 8081 
    spring:
      profiles: prod

二.使用properties檔案進行區分

這種方法跟使用yml檔案方法類似,可以通過生成application-{profile}.properties,其中({profile}的取值可以是dev, test, rc,pro)區分不同環境,application.properties配置公共屬性以及確定當前使用的環境。與yml區分在於,properties檔案相對冗餘些,spring預設優先使用yml檔案。

三.使用maven進行區分

一般來說我們都會在src/main/resources 目錄下面建一個資料夾,裡面分別放三個環境對應的檔案dev、pre、pro,如下
在這裡插入圖片描述
實際專案中引用的配置檔案是config.properties

  driver=${db_driver}
    url=${db_url}
    username=${db_username}
    password=${db_password}

把在config.properties檔案中所有用到的變數都放到對於環境的資料夾中,例如dev.properties檔案內容:

db_driver=com.mysql.jdbc.Driver
db_url=jdbc:mysql://localhost:3306/anhoo
db_username=root
db_password=root

緊接著,就需要在pom裡面進行設定了三個環境對應的變數:

  <profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <env>dev</env>
                <!--<redis_host>127.0.0.1</redis_host>-->
            </properties>
        </profile>
        <profile>
            <id>pre</id>
            <properties>
                <env>pre</env>
            </properties>
        </profile>
        <profile>
            <id>pro</id>
            <properties>
                <env>pro</env>
            </properties>
        </profile>
    </profiles>
        <!-- 使用指定的filter進行過濾,在執行mvn命令的時候帶上-Ppro就代表生產環境,就會載入生產環境的properties,-Pdev就代表開發環境(預設) -->
        <filters>
            <filter>src/main/resources/properties/env/${env}.properties</filter>
        </filters>
        <!-- 資原始檔位置src/main/resources/,這下面的資原始檔的${}會全部被替換成filter中的標籤內容。
                 directory指定的value會作為classes的資源跟目錄,
                 比如指定:src/main/resources/,則classes下會出現jdbc等包,
                 若指定:src/main/resources/jdbc/,則classes下直接出現jdbc包下的檔案,不會額外出現jdbc等其他包結構。因為他把jdbc作為了根目錄
         -->
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <!--
                      exclude可以排除指定檔案,支援萬用字元 ,匹配項不會生成到classes目錄下,路徑是以directory開始的
                      在這裡就是directory(src/main/resources/)/properties/env/pro.properties
                 -->
                <!--<excludes>-->
                <!--<exclude>properties/env/pro.properties</exclude>-->
                <!--</excludes>-->
            </resource>
        </resources>

當然我們也可以把所有的變數放在pom的環境分類的properties節點裡面,如被註釋的部分,這樣一來也是可以的,當然如果這樣做的話,filters部分就多此一舉了,而且我們可以直接在.xml檔案中進行這些變數的引用。兩種方法效果都一樣,沒啥區別,就看個人愛好了。
打包命令:
mvn clean package -Pdev(-Ppre,-Ppro)
打包war包後,裡面對應的配置就變了

四.使用分散式配置檔案

前面幾種我們都是通過原生代碼配置檔案實現,當我們需要修改裡面配置時候,需要修改檔案,再進行打包釋出。在這個追求效率時代,在我們推崇自動化管理的情況下,使用前面幾種方式,就很難做到。於是我們可以使用分散式配置,這裡我簡單介紹下以下兩種,詳細內容建議大家去它們官網檢視demo練習:
1.springcloud中的config元件,我們可以將我們要配置的application.{profiles}\properties等檔案寫到git上面或者svn上面,config元件可以實現去遠端讀取這些檔案,這樣我們就可以根據需要到svn或git上修改檔案,而不用去修改程式碼檔案,也就不用去重新打包釋出程式碼,從而實現熱部署。
2.可以使用阿里提供的edas配置中心形式,我們可以通過裡面的groupId區分不同環境,dataId可以寫為配置檔案的名稱,然後通過增加官方提供元件,進行讀取。

五.寫在最後

以上幾種方法是本人實際開發中使用過的,每種方法都有其優缺點,我們根據實際需要進行選擇。不知道大家一般使用哪種方式或者有其他方式推薦,可以留言討論,一起學習下。