Spring Cloud 如何動態刷新 Git 倉庫配置?

有時候在配置中心有些參數是須要修改的,這時候如何不重啓而達到實時生效的效果呢?web

本文基於如下講解:spring

  • Spring Cloud Greenwich.SR3
  • Spring Boot 2.1.7.RELEASE
  • 基於 Git 的配置中心倉庫

添加 actuator 依賴

在引用配置中心的項目中添加如下 actuator 依賴:數組

<dependencies>
    ...
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>    
    ...
</dependencies>

spring-boot-starter-actuator:這個模塊的 /actuator/refresh (POST請求)端點能夠刷新配置,更多的使用參考 Spring Boot 系列文章。微信

暴露 refresh 端點

actuator 默認是不暴露 refresh 端點的,須要咱們主動暴露,在引用配置中心的項目中添加如下配置:spring-boot

management:
  endpoints:
    web:
      exposure:
        include: refresh,info,health

添加刷新範圍

引用了配置中心的項目,在須要刷新的 Bean 上添加 @RefreshScope 註解。post

示例1:spa

@RefreshScope
@RestController
public class TestController {

    @Value("${username}")
    private String username;
    
...

}

示例2:code

@RefreshScope
@ConfigurationProperties(prefix = "spring.mail")
public class MailProperties {

...

}

當配置更改時,標有 @RefreshScopeBean 將獲得特殊處理來生效配置,否則改了配置不會刷新的。@RefreshScope 的原理能夠參考這篇文章:Spring Cloud @RefreshScope 原理是什麼?,很詳細。blog

手動刷新配置

修改配置後,咱們能夠經過 post 到 /actuator/refresh 便可手動刷新配置。教程

以下圖所示:

若是參數有變動,刷新成功的話,會返回一個含有參數名的變動數組。

自動刷新配置

若是你使用了 Gitlab 或者 Github 倉庫,能夠配置 Webhooks 來作到自動更新,當參數變動時,能作到自動通知。

Gitlab配置以下圖所示:

Github也差很少的,能夠配置一個 URL(用於變動通知)和一個 Secret Token(用於請求驗證)。

但這種方式僅限於單臺,若是有多臺或者多個系統,該如何通知,恐怕須要加一個公共接口來繞一圈了。

若是須要請求頭認證的,能夠使用這種方式:

https://user:password@ip:port/xxxx

擴展問題

若是使用配置中心項目少的狀況,咱們是能夠經過上面的方式進行配置動態刷新,若是項目比較複雜的狀況呢?

上面的方式確定都是行不通的,Spring Cloud Bus 消息總線能夠解決配置修改的真正的動態刷新,請看下回分解。關注微信公衆號:Java技術棧,第一時間推送。在公衆號後臺回覆:cloud,還能獲取棧長整理的 Spring Cloud 系列教程,都是實戰乾貨。

相關文章
相關標籤/搜索