需求
系統遇到這樣一個需求,線上環境在配置檔案發生變動時,可以不用經過重新開機,通過重新整理接口的方式得到配置檔案的加載,主要目的是為了迅速部署,避免因手動重新開機,出現資料或任務丢失的問題
問題
1.程式中如何擷取修改後的配置
2.某些配置值是應用在bean裡面的,在程式初始化的時候已經注入,如何修改這一部分。
解決
第一步,添加适合自己springboot版本的Springcloud context依賴,若Springboot版本低,maven可能會引不上高版本的context
我們這裡參考 Spring-Cloud-Config 主要借助 org.springframework.cloud.context.refresh.ContextRefresher 這個類來實作配置重新整理,是以需要對 SpringBoot 項目做一點修改。
配置檔案: application.yml
讀取配置的Bean,兩種擷取方式分别如下
開啟重新整理<code>@Value的</code>注解方式,注意下面的<code>@RefreshScoe</code>注解,這個必須有,否則更新後的配置不會同步
測試 <code>Controller </code>如下
啟動上面的應用,然後開啟愉快的測試,調用refresh接口,發現每次的傳回都不一樣(因為配置檔案使用了random随機生成),但是通路show接口時,每次傳回的都是一樣的,也就是說refresh接口中确實實作了配置的重新整理。
說明
使用<code>ConfigurationProperties</code>方式擷取注解時,自動支援重新整理配置
使用<code>@Value</code>注解的方式,需要開啟<code>@RefreshScope</code>注解(上面沒有示範不開啟這個注解的情況, 建議有興趣的可以自己嘗試一下)
既然配置能重新整理,那麼如果我希望擷取配置變更的事件,然後做一些其他的事情,是否ok呢?
其實進入 <code>ContextRefresher</code> 的源碼,看下refresh接口,就很明确了
從上面的源碼中,借助spring的事件通知機制,很簡單就可以知道該怎麼做了
注意下控制台的輸出即可