Spring Cloud Bus:消息總線
上一篇我們講到統一配置中心Spring Cloud Config,實現了分佈式項目配置文件的統一管理,但是留下了一個問題:修改配置之後如何免重啓自動生效。Spring Cloud Bus組件就可以用來做這件事,值得注意的是,前面我們所使用的版本Greenwich.M1的bus組件存在bug,我們將config和provider項目改爲如下版本(其他項目建議一併修改):
開發環境 | 版本 |
---|---|
IDEA | 2018.2.6 |
JDK | 1.8 |
Spring Boot | 2.0.6 |
Spring Cloud | Finchley.SR2 |
Docker | 18.09.0 |
RabbitMQ | 3.7.8-management |
bug官方github issue鏈接爲https://github.com/spring-cloud/spring-cloud-bus/issues/137,可自行查閱。
準備工作
進行本章內容的學習前期需要準備好環境:Docker的安裝、RabbitMQ容器的安裝和運行、虛擬機IP到宿主機IP的映射等。
簡而言之,訪問http://localhost:15672,應可以到達RabbitMQ管理界面,當然,5672端口的服務也需要能正常運行。
修改Config項目配置
Maven依賴
在配置中心項目中添加bus組件的依賴,以及後續會用到的actuator和monitor依賴。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-monitor</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
配置
暴露配置中心的各項接口,在配置文件添加如下內容:
management:
endpoints:
web:
exposure:
include: "*"
修改provider項目
我們以provider項目爲例,添加bus組件的Maven依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
修改接口爲動態讀取配置項:
@RestController
@RequestMapping("/hello")
@RefreshScope // 使用該註解可在SpringCloudConfig配置刷新時自動更新本類配置
public class HelloController {
@Value("${env}")
private String env;
@GetMapping("/chung")
public String helloChung() {
return "Hello Chung By Provider on env:" + env;
}
}
驗證配置項動態更新
先後運行config和provider項目(保證註冊中心服務可用),發現RabbitMQ自動爲我們創建了兩個消息隊列,如圖所示。
此時我們訪問provider的接口http://localhost:8081/hello/chung可以得到Hello Chung By Provider on env:dev
,接着我們修改git上的配置文件內容env的值env : devDynamic
,然後用postman或curl命令以post方式訪問config暴露的接口http://127.0.0.1:8071/actuator/bus-refresh,RabbitMQ的管理界面可以看到消息的消費情況,如圖所示。
最後刷新http://localhost:8081/hello/chung頁面,發現內容變成了Hello Chung By Provider on env:devDynamic
,證明我們實現了免重啓修改配置。
配置GitHub的Webhooks
真實場景下,我們不可能每次修改配置後手動做一下post請求,而Webhook爲我們提供了這樣的功能。
如果本機IP爲內網地址,可以提前準備一下內網穿透工具,視個人情況而定。
在我們的配置文件git倉庫中,找到設置頁面的Webhooks選項,將Payload URL設置爲${your_url}/monitor
,Content Type選擇application/json,點擊添加Webhook按鈕。
最後我們再修改git上的配置文件內容,稍候幾秒刷新頁面,發現能夠真正實現免重啓自動更新配置,詳細內容和截圖不再贅述。