SpringBoot系列——利用系統環境變數與配置檔案的分支選擇實現“智慧部署”
前言
通過之前的部落格: SpringBoot系列——jar包與war包的部署 ,我們已經知道了如果實現專案的簡單部署,但專案部署的時候最煩的是什麼?修改成釋出環境對應的配置!資料庫連線地址、Eureka註冊中心地址、Redis服務地址等,部署環境不一樣,打包的時候就要改成對應的配置;常用的環境有本地開發環境dev,本地測試環境dev-test,生產測試環境prod-test,生產環境prod;
開發的時候我們用dev,專案直接執行,不用改配置;釋出本地測試環境的時候,打包之前我們要先改成對應配置;上線前釋出生產測試環境的時候要改成對應配置;正式上線釋出生產環境的時候要改成對應配置;每次這樣改很麻煩,要是不小心漏改了部分地方,還會造成報錯,當換一個人來部署時,還得先告訴他需要修改的地方,麻煩;
那麼有什麼好辦法能解決這個問題呢?我就是不想每次在打包之前改配置,我就直接打包、釋出。下面記錄一下利用系統環境變數與.yml配置檔案的活躍分支實現“智慧部署”;
想了解springboot的配置優先順序可以參考這篇大佬的部落格: Spring Boot 配置優先順序順序 ,我這裡簡單總結一下:
- 命令列引數。
- 通過 System.getProperties() 獲取的 Java 系統引數。
- 作業系統環境變數。
- 從 java:comp/env 得到的 JNDI 屬性。
- 通過 RandomValuePropertySource 生成的“random.*”屬性。
- 應用 Jar 檔案之外的屬性檔案。(通過spring.config.location引數)
- 應用 Jar 檔案內部的屬性檔案。
- 在應用配置 Java 類(包含“@Configuration”註解的 Java 類)中通過“@PropertySource”註解宣告的屬性檔案。
- 通過“SpringApplication.setDefaultProperties”宣告的預設屬性。
程式碼編寫
配置選擇分支
首先我們利用bootstrap.yml先於application.yml載入的順序,在bootstrap.yml進行分支選擇
spring: config: name: application #配置檔名 profiles: active: ${HUANZI_PROFILES:dev} #選擇配置分支,先讀取系統環境變數,如果沒有則預設值為 dev
在application.yml裡進行寫各個分支的配置,分支之間用註釋 ---- 隔開
##### 公共 配置 ####### server: port: 10086 #埠號 servlet: context-path: / #訪問根路徑 spring: application: name: springdatejpa #應用名 --- ##### dev 配置 ####### spring: profiles: dev datasource: #連線資料庫 url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&characterEncoding=utf-8 username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver msg: 正在使用 dev 配置 --- ##### dev-test 配置 ####### spring: profiles: dev-test datasource: #連線資料庫(暫時也先用同一個庫,否則專案報錯起不來) url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&characterEncoding=utf-8 username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver msg: 正在使用 dev-test 配置 --- ##### prod-test 配置 ####### spring: profiles: prod-test msg: 正在使用 prod-test 配置 --- ##### prod 配置 ####### spring: profiles: prod msg: 正在使用 prod 配置 ---
配置環境變數
Windows配置系統環境變數,例如:dev-test
Linux配置系統環境變數,請看這篇文章: Linux環境變數總結 ,總結下程式碼、步驟:
1、 vim ~/.bash_profile
2、 export HUANZI_PROFILES =dev-test
3、 source ~/.bash_profile
效果
新增一個checkProfiles測試介面,方便檢查分支使用情況:
@Value("${msg}") private String msg; /** * 檢查配置分支 */ @RequestMapping("checkProfiles") public String checkProfiles() { return msg; }
沒有設定系統環境變數:預設使用dev
設定系統環境變數後:使用環境變數的值dev-test
後記
有了“智慧部署”功能,我們將所有的分支配置好之後,不管是部署在那個環境,只要在對應的環境設定好對應的系統環境變數,每次都可以直接打包釋出,非常方便!當你沒空發版,想叫其他同事幫忙釋出,但又怕他不太熟悉時,你就告訴他:
1、更新最新程式碼
2、打包、上傳
3、啟動專案(先kill掉舊專案、備份舊專案、啟動新專案、檢視啟動日誌確保啟動過程有無報錯)
媽媽再也不用擔心我不會發版了!