SpringCloud - 整合MQ實現消息總線服務

一、背景介紹

每當修改配置文件內容,如果需要客戶端也同步更新,就需要手動調用/refresh接口,以便客戶端能獲取到最新的配置內容。

當客戶端越來越多的時候,通過人工進行處理顯然非常雞肋。有沒有一種更加高效的辦法,當手動調用其中一個客戶端的/refresh接口,其它的客戶端也自動更新?

在 Spring Cloud 體系里,有一個叫做 Spring Cloud Bus 模塊,也被業界稱為消息總線。它可以將分布式系統內的節點以消息代理方式連接起來,開發者可以通過消息代理服務向其它節點傳輸數據的變更,例如配置文件的更改,也可以用于收集節點監控數據。其中常用的消息代理服務有 RabbitMQ 和 Kafka。

換言之,我們可以借助 Spring Cloud Bus 模塊來實現上文介紹的訴求,引入 Spring Cloud Bus 模塊后,客戶端獲取遠程配置文件的方式,可以用如下流程圖來描述。
在這里插入圖片描述

熟悉 MQ 服務的可能一眼就看出來了,其原理就是借助 MQ 服務的發布與訂閱功能向其它節點進行廣播數據,從而實現客戶端自動刷新配置功能。

其交互流程可以用如下內容來概括。

1.當外部請求調用客戶端 A 的/refresh接口后,除了主動刷新配置意外,還會通過 Spring Cloud Bus 模塊,將刷新配置接口的指令數據發送到 MQ 服務器
2.MQ 服務器會將指令數據通過 Spring Cloud Bus 模塊推送給其它客戶端
3.客戶端 B、C 接收到最新的消息指令后,主動調用刷新配置服務,獲取最新的配置內容
下面我們通過具體的例子,結合之前介紹的知識,看看如何利用 Spring Cloud Bus 實現客戶端配置文件自動刷新的效果。

二、方案實踐

在此,我們采用 RabbitMQ 服務器來搭建消息總線,因此需要事先準備一臺可用的 RabbitMQ 服務器,具體的安裝教程之前有所介紹,大家也可以百度搜索一下,具體的安裝過程就不再重復撰述。

2.1、添加依賴
根據eureka-config-client復制一個服務消費者工程,命名為eureka-config-client-bus,并在pom.xml中引入spring-cloud-starter-bus-amqp依賴包,示例如下:

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

2.2、添加配置文件
接著,在bootstrap.properties配置文件中添加消息代理相關的屬性信息,示例如下:

# 配置rabbitmq服務器地址
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

2.3、服務測試
然后,依次將eureka-server、eureka-config-server、eureka-config-client-bus (分別在不同的端口上,比如9022、9023) 服務啟動起來。訪問 eureka 可視化頁面,如果服務都正常,可以看到類似于如下的界面。
在這里插入圖片描述

將遠程倉庫配置文件中的blog.name=hahaha修改成blog.name=hahaha123456,以便測試客戶端配置文件是否能自動更新。

接著,向其中一個客戶端發送一個/bus/refresh的 POST 請求。

需要注意的是,這里的路徑是/bus/refresh,而不是/refresh

在這里插入圖片描述

最后,在瀏覽器中重新訪問另一個客戶端讀取配置文件的接口,不意外的話,客戶端獲取的是最新的配置信息。

說明客戶端已經成功讀取到最新的配置內容。

查看客戶端的日志,也會看到類似于如下的信息。

Received remote refresh request. Keys refreshed [config.client.version, blog.name]

2.4、WebHook
可能有人會發出一個疑問,不可能每次修改倉庫的配置文件,自己都需要手動調用/bus/refresh接口吧。

實際上,GIT 里面有個 WebHooks 功能,每次 push 代碼后,我們可以利用它給遠程 HTTP URL 發送一個 POST 請求,以此省去手動調用的工作。

在這里插入圖片描述

操作非常簡單,只需要將其中一個客戶端/bus/refresh接口地址添加進去即可。需要注意的是,這里的 HTTP URL 必須是一個能請求通過的公網地址哈!

三、升級版

在以上的方案中,雖然我們利用消息總線實現了手動刷新一個客戶端的配置文件更新,其它客戶端也同步跟著一起刷新的目的,但在實際的實踐過程中,發現還是有一些不便的地方。

例如客戶端因為業務的快速迭代會頻繁的發布服務,同時也會根據服務的并發量適度的增減服務實例數量,這種情況下,客戶端的 IP 和端口會經常發生變動,每次人工運維起來會很繁瑣。

因此,我們可以將上面的交互流程改變一下,由服務配置中心通過 Spring Cloud Bus 模塊向客戶端發送重刷配置文件的指令。

整個流程,可以用如下圖來描述。
在這里插入圖片描述

因為服務配置中心基本上很少會去迭代,客戶端的 IP 和端口發生變動的可能性較小,由它向客戶端推送消息,運維的工作量可以顯著的下降。

改造的流程也很簡單,只需要兩步即可!

3.1、添加依賴
與上文類似,根據eureka-config-server復制一個服務消費者工程,命名為eureka-config-server-bus,并在pom.xml中引入spring-cloud-starter-bus-amqp依賴包,示例如下:

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency>
</dependencies>

3.2、添加配置文件
接著,在application.properties中添加消息代理服務相關的屬性,示例如下:

spring.application.name=eureka-config-server
server.port=9020# 配置git倉庫地址
spring.cloud.config.server.git.uri=https://gitee.com/pzblogs/config-demo
spring.cloud.config.server.git.username=
spring.cloud.config.server.git.password=# 設置與Eureka Server交互的地址,多個地址可使用【,】分隔
eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/# 關閉安全認證
management.security.enabled=false# 配置rabbitmq服務器地址
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

3.3、服務測試
然后,依次將eureka-server、eureka-config-server-bus、eureka-config-client-bus服務啟動起來。

接著,修改倉庫中的配置文件內容,完成之后,以 POST 方式調用服務配置中心的刷新配置接口,例如http://localhost:9020/bus/refresh。

最后,在瀏覽器訪問客戶端http://localhost:9023/hello,不意外的話,能看到最新的信息。

四、小結

最后總結一下,當我們手動更新某個倉庫配置文件的時候,想要實現所有客戶端同時也自動更新配置,可以利用消息總線來實現節點之間數據的同步變更操作。

如果想要用 Kafka 來做消息代理服務,實現思路也類似,將bus-amqp換成bus-kafka,示例子如下

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>

最后在配置文件中添加 Kafka 相關服務地址配置參數即可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906650.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906650.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906650.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

測試W5500的第3步_使用ioLibrary庫創建TCPServer

W5500是一款具有8個Socket的網絡芯片&#xff0c;支持TCP Server模式&#xff0c;最多可同時連接8個客戶端。本文介紹了基于STM32F10x和W5500的TCP Server實現&#xff0c;包括SPI初始化、W5500復位、網絡參數配置、Socket狀態管理等功能&#xff0c;適用于需要多客戶端連接的嵌…

Web攻防-SQL注入數據庫類型用戶權限架構分層符號干擾利用過程發現思路

知識點&#xff1a; 1、Web攻防-SQL注入-產生原理&應用因素 2、Web攻防-SQL注入-各類數據庫類型利用 演示案例-WEB攻防-SQL注入-數據庫類型&架構分層&符號干擾 一、數據庫知識 1、數據庫名&#xff0c;表名&#xff0c;列名&#xff0c;數據 2、自帶數據庫&…

手機合集(不定期更新)

一、華為手機&#xff1a; 1.華為手機自助維修的方法&#xff1a; https://blog.csdn.net/humors221/article/details/145946128 2.華為手機實用功能介紹&#xff1a; https://blog.csdn.net/humors221/article/details/132514011 3.華為手機清理大數據的方法&#xff1a;…

移動安全Android——ROOT檢測繞過

工具準備 Magisk GitHub - topjohnwu/Magisk: The Magic Mask for Android ZygisckNext GitHub - Dr-TSNG/ZygiskNext at v1.2.8 Shamiko Releases LSPosed/LSPosed.github.io 安卓ROOT教程 Magisk 安裝教程 - Magisk 中文網 問題 大多數手機在ROOT狀態下會出現APP閃…

Python高效網絡爬蟲開發指南

Python 網絡爬蟲入門與實戰 一、引言 隨著互聯網數據的爆炸性增長&#xff0c;獲取和分析這些數據變得越來越重要。網絡爬蟲作為數據采集的重要工具&#xff0c;在這其中扮演了不可或缺的角色。 二、環境搭建 首先我們需要安裝Python環境以及一些必要的庫&#xff1a; req…

wireshark: Display Filter Reference

https://www.wireshark.org/docs/dfref/// 這個里面的擴展功能還是很強大&#xff0c;可以幫著問題分析。支持大量的自定義化的字段讀取功能&#xff0c;支持很多的協議。 https://www.wireshark.org/docs/dfref///f/frame.html frame.time_delta Time delta from previous ca…

dify創建銀行客服系統例子

傳統的銀行客服系統&#xff0c;通常以會話管理的方式實現&#xff0c;配置繁瑣復雜&#xff0c;固定且不靈活。如&#xff1a; 智能體的出現&#xff0c;為實現銀行客服系統提供了想象空間&#xff0c;可以集知識庫和業務流程為一體實現靈活可控的智能客服系統&#xff0c;即能…

前端函數防抖(Debounce)完整講解 - 從原理、應用到完整實現

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有堅忍不拔之志 &#x1f390; 個人CSND主頁——Micro麥可樂的博客 &#x1f425;《Docker實操教程》專欄以最新的Centos版本為基礎進行Docker實操教程&#xff0c;入門到實戰 &#x1f33a;《RabbitMQ》…

服務接口鑒權與內部認證:自定義注解與AOP實現的企業級實踐

本文深入解析企業級系統中接口安全管控的核心需求&#xff0c;提出基于Spring AOP與自定義注解的輕量級鑒權方案。通過解構注解元數據定義、切面攔截邏輯、上下文傳遞機制等關鍵技術環節&#xff0c;系統闡述零侵入式鑒權體系的構建路徑。結合金融支付網關、多租戶SaaS平臺、物…

26考研|高等代數:線性變換

前言 線性變換這一章節是考頻較高的一部分&#xff0c;此部分涉及考點較多&#xff0c;涉及的考題也較多&#xff0c;學習線性變換時&#xff0c;應該注意搭建線性變換與矩陣之間的聯系&#xff0c;掌握如何利用矩陣表示一個線性變換結構&#xff0c;同時介紹了最簡單的線性變…

電磁兼容(EMC)仿真(精編版)

寫在前面 本系列文章主要講解電磁兼容(EMC)仿真的相關知識,希望能幫助更多的同學認識和了解電磁兼容(EMC)仿真。 若有相關問題,歡迎評論溝通,共同進步。(*^▽^*) 隨著產品復雜性和密集度的提高以及設計周期的不斷縮短,在設計周期的后期解決電磁兼容性(EMC)問題變得…

解決:dpkg: error: dpkg frontend lock is locked by another process

1、等待其他進程完成 如果后臺有其他包管理操作&#xff08;如自動更新、軟件安裝等&#xff09;&#xff0c;等待幾分鐘再重試。 可以通過以下命令查看是否有相關進程&#xff1a; ps aux | grep -E apt|apt-get|dpkg 2、強制終止占用鎖的進程 如果確認沒有其他包管理操作&…

LVGL(lv_textarea文本框控件)

文章目錄 一、lv_textarea 是什么&#xff1f;二、基本用法1. 創建 lv_textarea 對象2. 設置提示文字&#xff08;占位符&#xff09;3. 設置最大長度4. 設置密碼模式&#xff08;顯示為\*號&#xff09;5. 獲取和設置內容6. 配合虛擬鍵盤使用&#xff08;常用于觸摸屏&#xf…

【Java高階面經:數據庫篇】18、分布式事務:如何在分庫分表中實現高性能與一致性?

一、分布式事務核心挑戰:分庫分表下的一致性困境 在分布式系統架構中,分庫分表通過將數據分散存儲提升了擴展性和性能,但卻打破了傳統單庫事務的邊界,使得分布式事務成為保障數據一致性的核心難題。其挑戰主要體現在以下三方面: 1.1 ACID特性的分布式撕裂 原子性(Atomi…

【云吶】房地產企業固定資產如何管理

房產類固定資產如辦公樓、門面房、宿舍樓、庫房等&#xff0c;價值高、使用年限長、權屬復雜、變更流程多&#xff0c;是企業最為關鍵的資產類型之一。管理房產類資產不僅要“看得到”&#xff0c;更要“管得住”。 房產資產管理應從權屬明確開始。固定資產管理系統支持房產資產…

oracle數據庫生成awr報告,排查數據庫服務器CPU100%,系統卡頓,慢sql,根據sqlid查詢關鍵信息,如會話SID,客戶端機器名

AWR報告簡介 AWR是Oracle 10g版本推出的特性,全稱叫做 Automatic Workload Repository 全自動負載信息庫 。Oracle啟動后,會有后臺進程定時采集并保存系統快照信息,也可以手工創建快照。AWR通過對比兩個時間點的快照信息,生成該時間段的AWR報告,幫助DBA或開發人員了解 Ora…

kafka吞吐量提升總結

前言 原本自以為閱讀了很久kafka的源碼&#xff0c;對于kafka的了解已經深入到一定程度了&#xff0c;后面在某大廠的面試中&#xff0c;面試官詢問我&#xff0c;如果需要提升kafka的性能&#xff0c;應該怎么做&#xff0c;我發現我能答上來的點非常的少&#xff0c;也暴露了…

鴻蒙 HarmonyOS NEXT 系統 Preference 首選項使用全解析

鴻蒙HarmonyOS系統Preference首選項使用全解析 大家好&#xff0c;我是威哥。在鴻蒙應用開發里&#xff0c;用戶偏好設置的管理是極為重要的一環。HarmonyOS為我們提供了Preference組件&#xff0c;它能讓我們輕松實現應用設置界面&#xff0c;對用戶首選項進行高效管理。接下…

xdc約束學習

對clk的約束 //約束clk為 125M Hz create_clock -period 8.000 -name gt_refclk1_p -waveform {0.000 4.000} [get_ports gt_refclk1_p] 偽時鐘路徑&#xff0c;用于兩個時鐘域之間數據的交互 單邊性&#xff08;unateness&#xff09;對于時序很重要&#xff0c;因為它指定的…

在 Ubuntu 虛擬機中實現 HTML 表單與 C 語言 HTTP 服務器交互

一、環境說明 系統&#xff1a;Ubuntu 虛擬機&#xff08;已安裝基本開發工具&#xff0c;如 GCC&#xff09;目標&#xff1a;通過 C 語言服務器托管 HTML 表單頁面&#xff0c;并實現數據提交交互 二、核心文件準備 1. 創建 HTML 表單頁面&#xff08;xunfei.html&#xf…