SpringBoot系列——利用系統環境變量與配置文件的分支選擇實現“智能部署”


  前言

  通過之前的博客:SpringBoot系列——jar包與war包的部署,我們已經知道了如果實現項目的簡單部署,但項目部署的時候最煩的是什么?修改成發布環境對應的配置!數據庫連接地址、Eureka注冊中心地址、Redis服務地址等,部署環境不一樣,打包的時候就要改成對應的配置;常用的環境有本地開發環境dev,本地測試環境dev-test,生產測試環境prod-test,生產環境prod;

  開發的時候我們用dev,項目直接運行,不用改配置;發布本地測試環境的時候,打包之前我們要先改成對應配置;上線前發布生產測試環境的時候要改成對應配置;正式上線發布生產環境的時候要改成對應配置;每次這樣改很麻煩,要是不小心漏改了部分地方,還會造成報錯,當換一個人來部署時,還得先告訴他需要修改的地方,麻煩;

  那么有什么好辦法能解決這個問題呢?我就是不想每次在打包之前改配置,我就直接打包、發布。下面記錄一下利用系統環境變量與.yml配置文件的活躍分支實現“智能部署”;

  想了解springboot的配置優先級可以參考這篇大佬的博客:Spring Boot 配置優先級順序,我這里簡單總結一下:

  1. 命令行參數。
  2. 通過 System.getProperties() 獲取的 Java 系統參數。
  3. 操作系統環境變量。
  4. 從 java:comp/env 得到的 JNDI 屬性。
  5. 通過 RandomValuePropertySource 生成的“random.*”屬性。
  6. 應用 Jar 文件之外的屬性文件。(通過spring.config.location參數)
  7. 應用 Jar 文件內部的屬性文件。
  8. 在應用配置 Java 類(包含“@Configuration”注解的 Java 類)中通過“@PropertySource”注解聲明的屬性文件。
  9. 通過“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、vim ~/.bash_profile

  2、export HUANZI_PROFILES=dev-test ,esc :wq保存退出

  3、source ~/.bash_profile

  4、查看環境變量  echo $HUANZI_PROFILES ,如果輸出dev-test設置成功

 

  效果

  添加一個checkProfiles測試接口,方便檢查分支使用情況:

    @Value("${msg}")
    private String msg;

    /**
     * 檢查配置分支
     */
    @RequestMapping("checkProfiles")
    public String checkProfiles() {
        return msg;
    }

 

  沒有設置系統環境變量:默認使用dev

     

 

 

  設置系統環境變量后:使用環境變量的值dev-test

    

 

 

  后記

  有了“智能部署”功能,我們將所有的分支配置好之后,不管是部署在那個環境,只要在對應的環境設置好對應的系統環境變量,每次都可以直接打包發布,非常方便!當你沒空發版,想叫其他同事幫忙發布,但又怕他不太熟悉時,你就告訴他:

  1、更新最新代碼

  2、打包、上傳

  3、啟動項目(先kill掉舊項目、備份舊項目、啟動新項目、查看啟動日志確保啟動過程有無報錯)

  媽媽再也不用擔心我不會發版了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM