關於多環境配置幾種方法
在實際專案開發過程中,我們往往需要區分開發,測試,預釋出,生產等環境,而這幾個環境的配置也會有些不同。今天我給大家介紹下用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可以寫為配置檔案的名稱,然後通過增加官方提供元件,進行讀取。
五.寫在最後
以上幾種方法是本人實際開發中使用過的,每種方法都有其優缺點,我們根據實際需要進行選擇。不知道大家一般使用哪種方式或者有其他方式推薦,可以留言討論,一起學習下。