本文基于以下講解:
- 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 端點的,需要我們主動暴露,在引用配置中心的項目中添加以下配置:
management:
endpoints:
web:
exposure:
include: refresh,info,health
添加重新整理範圍
引用了配置中心的項目,在需要重新整理的
Bean
上添加
@RefreshScope
注解。
示例1:
@RefreshScope
@RestController
public class TestController {
@Value("${username}")
private String username;
...
}
@RefreshScope
@ConfigurationProperties(prefix = "spring.mail")
public class MailProperties {
...
}
當配置更改時,标有 @RefreshScope 的 Bean 将得到特殊處理來生效配置,不然改了配置不會重新整理的。@RefreshScope 的原理可以參考這篇文章:Spring Cloud @RefreshScope 原理是什麼?,很詳細。
手動重新整理配置
修改配置後,我們可以通過 post 到 /actuator/refresh 即可手動重新整理配置。
如下圖所示:
如果參數有變更,重新整理成功的話,會傳回一個含有參數名的變更數組。
自動重新整理配置
如果你使用了 Gitlab 或者 Github 倉庫,可以配置
Webhooks
來做到自動更新,當參數變更時,能做到自動通知。
Gitlab配置如下圖所示:
Github也差不多的,可以配置一個 URL(用于變更通知)和一個 Secret Token(用于請求驗證)。
但這種方式僅限于單台,如果有多台或者多個系統,該如何通知,恐怕需要加一個公共接口來繞一圈了。
如果需要請求頭認證的,可以使用這種方式:
https://user:password@ip:port/xxxx
擴充問題
如果使用配置中心項目少的情況,我們是可以通過上面的方式進行配置動态重新整理,如果項目比較複雜的情況呢?
上面的方式肯定都是行不通的,Spring Cloud Bus 消息總線可以解決配置修改的真正的動态重新整理,請看下回分解。關注微信公衆号:Java技術棧,第一時間推送。在公衆号背景回複:cloud,還能擷取棧長整理的 Spring Cloud 系列教程,都是實戰幹貨。