有時候在配置中心有些參數是須要修改的,這時候如何不重啓而達到實時生效的效果呢?web
本文基於如下講解:spring
在引用配置中心的項目中添加如下 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 系列文章。微信
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 { ... }
當配置更改時,標有 @RefreshScope
的 Bean
將獲得特殊處理來生效配置,否則改了配置不會刷新的。@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 系列教程,都是實戰乾貨。