前言
通過之前的博客: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里進行寫各個分支的配置,分支之間用注釋 ---- 隔開
請看官網截圖介紹:你可以在一個yml里面指定多個具體的profile配置,通過配置spring.profiles,判斷使用哪個配置
##### 公共 配置 ####### 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 配置 ---
當然也可以用后綴.properties的配置文件,來進行根據活躍的profiles分支選擇
創建application-dev.properties,application-dev-test.properties...文件,將具體配置放在具體文件里,同樣與yml效果一致
PS:默認情況下yml沒有中文亂碼問題,而properties有
另外,官網給出了一個yml的缺點,就是不能使用@PropertySource注釋加載yml文件
更多yml介紹請看官網:24.7 Using YAML Instead of Properties https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#boot-features-external-config-yaml
更多配置文件介紹請看官網:24. Externalized Configuration https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#boot-features-external-config
25. Profiles https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#boot-features-profiles
配置環境變量
Windows配置系統環境變量,例如:dev-test
Linux配置系統環境變量,請看這篇文章:Linux環境變量總結,總結下代碼、步驟:
1、
2、
HUANZI_PROFILES
@Value("${msg}") private String msg; /** * 檢查配置分支 */ @RequestMapping("checkProfiles") public String checkProfiles() { return msg; }
后記
有了“智能部署”功能,我們將所有的分支配置好之后,不管是部署在那個環境,只要在對應的環境設置好對應的系統環境變量,每次都可以直接打包發布,非常方便!當你沒空發版,想叫其他同事幫忙發布,但又怕他不太熟悉時,你就告訴他:
1、更新最新代碼
2、打包、上傳
3、啟動項目(先kill掉舊項目、備份舊項目、啟動新項目、查看啟動日志確保啟動過程有無報錯)
媽媽再也不用擔心我不會發版了!