Spring Cloud Bus

1.概述

在本文中,我們將研究新的Spring Cloud Bus項目。 Spring Cloud Bus使用輕量級消息代理來鏈接分佈式系統節點。主要用途是廣播配置更改或其他管理信息。我們可以將其視為分佈式執行器。

該項目使用AMQP代理作為傳輸工具,但是可以使用Apache Kafka或Redis代替RabbitMQ。目前尚不支持其他傳輸方式。

在本教程的整個過程中,我們將使用RabbitMQ作為主要傳輸器,我們自然已經在運行它了。

2.先決條件

在開始之前,建議您已經完成“ Spring Cloud配置快速入門”。我們將採用現有的雲配置服務器和客戶端來擴展它們,並添加有關配置更改的自動通知。

2.1 RabbitMQ

讓我們從RabbitMQ開始,我們建議將它作為RabbitMQ作為docker image運行。設置非常簡單–要使RabbitMQ在本地運行,我們需要安裝Docker並在Docker成功安裝後運行以下命令:

docker pull rabbitmq:3-management

默認情況下,此命令將RabbitMQ docker映像與管理插件一起拉出。

接下來,我們可以運行RabbitMQ:

docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management

執行完命令後,我們可以轉到Web瀏覽器並打開http:// localhost:15672 ,該頁面將顯示管理控制台登錄表單。默認的用戶名是: 'guest' ;密碼: 'guest' 。 RabbitMQ也將偵聽端口5672。

3.將執行器添加到Cloud Config Client

我們應該同時運行雲配置服務器和雲配置客戶端。要刷新配置更改,每次都需要重新啟動客戶端,這是不理想的。

讓我們停止配置客戶端和註釋ConfigClient與控制器類@RefreshScope

@SpringBootApplication

 @RestController

 @RefreshScope

 public class SpringCloudConfigClientApplication {

 // Code here...

 }

最後,讓我們更新pom.xml文件並添加Actuator:

<dependency>

 <groupId>org.springframework.boot</groupId>

 <artifactId>spring-boot-actuator</artifactId>

 <version>2.2.6.RELEASE</version>

 </dependency>

最新版本可在此處找到。

默認情況下,執行器添加的所有敏感端點都是安全的。這包括'/refresh'端點。為簡單起見,我們將通過更新bootstrap.properties來關閉安全性:

management.security.enabled=false

另外,從Spring Boot 2開始, 默認情況下不公開執行器端點。為了使它們可供訪問,我們需要將此添加到application.yml

management:

 endpoints:

 web:

 exposure:

 include: "*"

讓我們首先啟動客戶端,並將GitHub上屬性文件中的用戶角色從現有的'Developer'更新為'Programmer' 。配置服務器將立即顯示更新的值;但是,客戶不會。為了使客戶看到新文件,我們只需要向執行器添加的'/refresh'端點發送一個空的POST請求:

$> curl -X POST http://localhost:8080/actuator/refresh

我們將返回顯示更新屬性的JSON文件:

[

 "user.role"

 ]

最後,我們可以檢查用戶角色是否已更新:

$> curl http://localhost:8080/whoami/Mr_Pink

 Hello Mr_Pink! You are a(n) Programmer and your password is 'd3v3L'.

通過調用'/refresh'端點成功更新了用戶角色。客戶端無需重新啟動即可更新配置。

4. Spring Cloud Bus

通過使用Actuator,我們可以刷新客戶端。但是,在雲環境中,我們將需要訪問每個客戶端並通過訪問執行器端點來重新加載配置。

為了解決這個問題,我們可以使用Spring Cloud Bus。

4.1。客戶端

我們需要更新雲配置客戶端,以便它可以訂閱RabbitMQ交換:

<dependency>

 <groupId>org.springframework.cloud</groupId>

 <artifactId>spring-cloud-starter-bus-amqp</artifactId>

 <version>2.2.1.RELEASE</version>

 </dependency>

最新版本可在此處找到。

要完成配置客戶端更改,我們需要添加RabbitMQ詳細信息並在application.yml文件中啟用云總線:

---

 spring:

 rabbitmq:

 host: localhost

 port: 5672

 username: guest

 password: guest

 cloud:

   bus:

      enabled: true

 refresh:

        enabled: true

請注意,我們使用的是默認的用戶名和密碼。需要針對現實生活中的生產應用程序進行更新。對於本教程,這很好。

現在,客戶端將具有另一個端點'/bus-refresh' 。調用此端點將導致:

  • 從配置服務器獲取最新配置,並更新由@RefreshScope註釋的@RefreshScope
  • 向AMQP交換發送消息,通知刷新事件
  • 所有訂閱的節點也會更新其配置

這樣,我們不需要去各個節點並觸發配置更新。

4.2。服務器端

最後,讓我們向配置服務器添加兩個依賴項以完全自動化配置更改。

<dependency>

 <groupId>org.springframework.cloud</groupId>

 <artifactId>spring-cloud-config-monitor</artifactId>

 <version>2.2.2.RELEASE</version>

 </dependency>

最新版本可在此處找到。

<dependency>

 <groupId>org.springframework.cloud</groupId>

 <artifactId>spring-cloud-starter-stream-rabbit</artifactId>

 <version>3.0.4.RELEASE</version>

 </dependency>

最新版本可以在這裡找到。

我們將使用spring-cloud-config-monitor監視配置更改,並使用RabbitMQ作為傳輸來廣播事件。

我們只需要更新application.properties並提供RabbitMQ詳細信息:

spring.rabbitmq.host=localhost

 spring.rabbitmq.port=5672

 spring.rabbitmq.username=guest

 spring.rabbitmq.password=guest

4.3。 GitHub Webhook

現在一切就緒。一旦服務器收到有關配置更改的通知,它將作為消息廣播到RabbitMQ。發送配置更改事件時,客戶端將偵聽消息並更新其配置。但是,服務器現在將如何進行修改?

我們需要配置一個GitHub Webhook。讓我們轉到GitHub並打開包含配置屬性的存儲庫。現在,讓我們選擇SettingsWebhook 。讓我們單擊Add webhook按鈕。

有效負載URL是我們的配置服務器'/monitor'端點的URL。在我們的例子中,URL將是這樣的:

http:// root: [受電子郵件保護] _IP:8888 / monitor

我們只需要在下拉菜單中將Content type更改為application/json.接下來,請將Secret保留為空,然後單擊Add webhook按鈕-之後,我們已經準備Add webhook

5.測試

讓我們確保所有應用程序都在運行。如果我們返回並檢查客戶端,它將user.role顯示為'Programmer'user.password為“ d3v3L ”:

$> curl http://localhost:8080/whoami/Mr_Pink

 Hello Mr_Pink! You are a(n) Programmer and your password is 'd3v3L'.

以前,我們必須使用'/refresh'端點重新加載配置更改。讓我們打開屬性文件,將user.role更改回Developer並推送更改:

user.role=Programmer

如果我們現在檢查客戶,我們將看到:

$> curl http://localhost:8080/whoami/Mr_Pink

 Hello Mr_Pink! You are a(n) Developer and your password is 'd3v3L'.

Config客戶端幾乎不同步地更新其配置,而無需重新啟動和顯式刷新。我們可以回到GitHub並打開最近創建的Webhook。在最底部,有“最近交貨”。我們可以在列表頂部選擇一個(假設這是第一個更改–仍然只有一個),然後檢查已發送到配置服務器的JSON。

我們還可以檢查配置和服務器日誌,我們將看到以下條目:

oscloud.bus.event.RefreshListener: Received remote refresh request. Keys refreshed []

六,結論

在本文中,我們採用了現有的spring cloud配置服務器和客戶端,並添加了執行器端點來刷新客戶端配置。接下來,我們使用Spring Cloud Bus廣播配置更改並自動執行客戶端更新。我們還配置了GitHub Webhook並測試了整個設置。

與往常一樣,可以在GitHub上找到討論期間使用的代碼。