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

  前言

  經過以前的博客:SpringBoot系列——jar包與war包的部署,咱們已經知道了若是實現項目的簡單部署,但項目部署的時候最煩的是什麼?修改爲發佈環境對應的配置!數據庫鏈接地址、Eureka註冊中心地址、Redis服務地址等,部署環境不同,打包的時候就要改爲對應的配置;經常使用的環境有本地開發環境dev,本地測試環境dev-test,生產測試環境prod-test,生產環境prod;html

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

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

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

  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進行分支選擇sql

spring:
  config:
    name: application #配置文件名
  profiles:
    active: ${HUANZI_PROFILES:dev} #選擇配置分支,先讀取系統環境變量,若是沒有則默認值爲 dev


  在application.yml裏進行寫各個分支的配置,分支之間用註釋 ---- 隔開數據庫

  請看官網截圖介紹:你能夠在一個yml裏面指定多個具體的profile配置,經過配置spring.profiles,判斷使用哪一個配置bootstrap

 

##### 公共 配置 #######
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分支選擇vim

  建立application-dev.properties,application-dev-test.properties...文件,將具體配置放在具體文件裏,一樣與yml效果一致springboot

  PS:默認狀況下yml沒有中文亂碼問題,而properties有bash

 

  另外,官網給出了一個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環境變量總結,總結下代碼、步驟:

  一、vim ~/.bash_profile

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

  三、source ~/.bash_profile

  四、查看環境變量  echo $HUANZI_PROFILES ,若是輸出dev-test設置成功

 

  效果

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

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

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

 

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

     

 

 

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

    

 

 

  後記

  有了「智能部署」功能,咱們將全部的分支配置好以後,不論是部署在那個環境,只要在對應的環境設置好對應的系統環境變量,每次均可以直接打包發佈,很是方便!當你沒空發版,想叫其餘同事幫忙發佈,但又怕他不太熟悉時,你就告訴他:

  一、更新最新代碼

  二、打包、上傳

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

  媽媽不再用擔憂我不會發版了!

相關文章
相關標籤/搜索