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並打開包含配置屬性的存儲庫。現在,讓我們選擇Settings
和Webhook
。讓我們單擊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上找到討論期間使用的代碼。