走進Spring Cloud之十 高可用配置中心動態重新整理(Greenwich版本)
走進Spring Cloud之十 高可用配置中心動態重新整理(Greenwich版本)
動態重新整理
前一篇章,我們演示了SpringCloud Config配置中心的遠端配置載入和高可用,但是在實際開發中唯一不變的是配置在一直變化,同時我們需要我們的客戶端能夠時時與配置中心變化的配置保持一致。
這裡我們一次啟動我們的eureka-server註冊中心/配置服務端config-server/配置客戶端config-client
訪問 http://localhost:8888/master/springcloud-config-pro.yml 測試config-server載入配置。
訪問 http://localhost:8889/writer 測試config-client的配置讀取。
這裡需求出現改變,我們需要修改我們的配置資訊
#springcloud-config-pro.yml
writer: jason(silent silent silent)
提交到我們的git倉庫
再次訪問 http://localhost:8888/master/springcloud-config-pro.yml
很明顯我們的server能夠自動拿到最新的配置。
再次訪問 http://localhost:8889/writer 測試config-client的配置讀取。
很明顯我們的配置資訊不會更新。(這裡是因為client在啟動的時候就從配置中心拿到了配置資訊並且儲存在了本地)
很明顯,這不是我們想要的。雖然我們可以重新啟動client來載入我們的最新配置,當然這也是最不可取的。
refresh
上面的問題,我們可以通過spring-boot-starter-actuator
來解決,spring-boot-starter-actuator
是一套監控的功能,可以監控程式在執行時狀態,其中就包括/refresh
接下來,我們將對config-client對應作出修改來達到我們的目標。
pom.xml
在pom.xml新增spring-boot-starter-actuator
依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.yml
#關閉安全認證
management:
security:
enabled: false
#refresh接入點顯式暴露出來
endpoints:
web:
exposure:
include: refresh,health,info
開啟更新機制
我們可以給需要載入變數的bean
上面載入@RefreshScope
註解,在客戶端執行/refresh
的時候就會更新此bean
下面的變數值。
例如 :ConfigClientController.java
@RestController
@RefreshScope // 使用該註解的類,會在接到SpringCloud配置中心配置重新整理的時候,自動將新的配置更新到該類對應的欄位中。
public class ConfigClientController {
@Value("${writer}")
String writer;
@RequestMapping(value = "/writer")
public String writer(){
return writer;
}
}
啟動測試
再次更新git倉庫的配置
再次訪問 http://localhost:8889/writer 測試config-client的配置讀取。
很明顯還是上一次的配置,那麼我們應該怎麼通知config-client進行配置更新呢?
#curl -X POST http://localhost:8889/actuator/refresh
#["config.client.version","writer"]
再次訪問 http://localhost:8889/writer 測試config-client的配置讀取。
Webhooks
Webhooks 允許在Github上的某些事件(例如Push)發生時通知外部服務。當指定的事件發生時,GitHub將向您提供的每個URL傳送一個POST請求。瞭解更多請訪問 Webhooks Guide.如果我們設定了一個監測push事件的Webhook,那麼每當你的這個專案有了任何提交,這個Webhook都會被觸發,這時Github就會發送一個HTTP POST請求到你配置好的地址。
例如:如下案例,我們就可以用於自動通知配置更新。