知識庫 / Spring / Spring Cloud RSS 訂閱

Spring Cloud Bus

Jakarta EE,Spring Cloud
HongKong
5
02:26 PM · Dec 06 ,2025

1. 概述

本文將介紹新的 Spring Cloud Bus 項目。Spring Cloud Bus 使用輕量級消息中間件來連接分佈式系統節點。其主要用途是廣播配置變更或其他管理信息。可以將其視為一個分佈式 Actuator。

該項目使用 AMQP 消息中間件作為傳輸,但也可以使用 Apache Kafka 或 Redis 代替 RabbitMQ。其他傳輸方式目前尚未支持。

在本文教程中,我們將使用 RabbitMQ 作為我們的主要傳輸方式——當然,我們已經默認會運行 RabbitMQ。

2. 先決條件

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

2.1. 兔子MQ

讓我們從兔子MQ開始,我們建議將其作為 Docker鏡像運行。 設置起來相當簡單——為了在本地運行兔子MQ,我們需要 安裝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

當我們執行該命令後,我們可以前往瀏覽器並打開 http://localhost:15672,這將顯示管理控制枱登錄表單。默認用户名是:‘guest’;密碼:‘guest’。RabbitMQ 也會監聽 5672 端口。

3. 添加 Actuator 到 Cloud Config Client

我們應該同時運行 Cloud Config Server 和 Cloud Config Client。為了刷新配置更改,每次都需要重啓 Client,這不太理想。

停止 Config Client,並對 ConfigClient 控制器類進行標註,添加 @RefreshScope

@SpringBootApplication
@RestController
@RefreshScope
public class SpringCloudConfigClientApplication {
    // Code here...
}

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-actuator</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

最新版本可在此處找到:https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-actuator

默認情況下,actuator添加的所有敏感端點均已啓用安全保護,包括‘/refresh’端點。為了簡化操作,可以通過更新application.yml來關閉安全保護:

management:
  security:
    enabled: false

此外,從 Spring Boot 2 開始,默認情況下 actuator 端點不會被暴露。要使它們可供訪問,需要在 application.yml 中添加以下內容:

management:
  endpoints:
    web:
      exposure:
        include: "*"

讓我們首先啓動客户端,然後在 GitHub 的 properties 文件中將用户角色從現有的 ‘Developer’更新為 ‘Programmer’。配置服務器會立即顯示更新後的值;但是,客户端不會。為了使客户端看到新的文件,只需向 ‘/refresh’ 端點發送一個空 POST 請求,該端點由 actuator 添加的:

$> 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’</em/> 接口完成。客户端在不重啓的情況下更新了配置。

4. Spring Cloud Bus

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

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

4.1. 客户端

我們需要更新雲配置客户端,使其能夠訂閲 RabbitMQ 交換機:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    <version>4.1.1</version>
</dependency>

最新版本可在此處找到:https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-bus-amqp

為了完成配置客户端的更改,我們需要在 application.yml 文件中添加 RabbitMQ 詳細信息並啓用雲總線:

---
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
  cloud:
    bus:
      enabled: true
      refresh:
        enabled: true

請注意,我們使用的是默認用户名和密碼。這需要在實際生產應用中更新。對於本教程而言,這沒問題。

現在,客户端將擁有另一個端點 ‘/bus-refresh’。調用此端點將導致:

  • 從配置服務器獲取最新的配置並對其進行標註 @RefreshScope 更新
  • 向 AMQP 交換髮送消息,告知刷新事件
  • 所有訂閲節點也將更新其配置

這樣,我們就不需要逐個節點地觸發配置更新。

4.2. 服務器

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

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-monitor</artifactId>
    <version>4.1.1</version>
</dependency>

最新版本可以在這裏找到:這裏

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
    <version>4.1.1</version>
</dependency>

最新版本可在此處找到:https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-stream-rabbit

我們將使用 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 按鈕。

Payload URL 是我們配置服務器的 ‘/monitor’ 接口地址。在我們的例子中,URL 類似於:

http://root:s3cr3t@REMOTE_IP:8888/monitor

我們只需要在下拉菜單中更改 Content typeapplication/json。 接下來,請將 Secret 留空,然後點擊 Add webhook 按鈕——之後,我們一切都已就緒。

5. 測試

讓我們確保所有應用程序都在運行。如果返回並檢查客户端,它將顯示 <em user.role</em><em ‘Programmer’</em>><em user.password</em><em d3v3L</em>

$> curl http://localhost:8080/whoami/Mr_Pink
Hello Mr_Pink! You are a(n) Programmer and your password is 'd3v3L'.

之前,我們必須使用 ‘/refresh’</em/> 端點來刷新配置更改。請打開 properties 文件,將 user.role</em/> 更改回 Developer</em/>,然後提交更改:

user.role=Programmer

如果現在檢查客户端,我們會看到:

$> curl http://localhost:8080/whoami/Mr_Pink
Hello Mr_Pink! You are a(n) Developer and your password is 'd3v3L'.

配置客户端在未重啓且未進行顯式刷新的情況下,幾乎同時更新了配置。我們可返回 GitHub 並打開最近創建的 Webhook。在最底部,有“最近交付”列表。我們可以選擇列表頂部的其中一個(假設這是第一次更改——無論如何只有唯一一個),並檢查向配置服務器發送的 JSON 數據。

我們還可以檢查配置和服務器日誌,並會看到以下記錄:

o.s.cloud.bus.event.RefreshListener: Received remote refresh request. Keys refreshed []

6. 結論

本文介紹瞭如何將現有的 Spring Cloud Config Server 和 Client 與 Actuator Endpoint 集成,以實現客户端配置的刷新。 此外,我們利用 Spring Cloud Bus 廣播配置變更並實現客户端自動更新。 此外,我們還配置了 GitHub Webhook 並進行了整個方案的測試。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.