天天訊息:使用 Spring Cloud Bus 和 Spring Cloud Stream 集成實(shí)現(xiàn)基于消息的事件驅(qū)動(dòng)
基于消息的事件驅(qū)動(dòng)是一種常見的微服務(wù)架構(gòu)設(shè)計(jì)模式,它將不同的微服務(wù)之間通過消息進(jìn)行通信,實(shí)現(xiàn)松耦合、高可伸縮性和高可靠性。在這種架構(gòu)下,每個(gè)微服務(wù)都是獨(dú)立的,它們可以在消息傳遞的過程中進(jìn)行異步操作,這使得整個(gè)系統(tǒng)的性能得到了很大的提升。
在 Spring Cloud 中,我們可以使用 Spring Cloud Bus 和 Spring Cloud Stream 集成來實(shí)現(xiàn)基于消息的事件驅(qū)動(dòng)。Spring Cloud Bus 是一個(gè)消息總線,它可以在微服務(wù)之間傳遞消息,可以將所有微服務(wù)視為一個(gè)整體,向所有微服務(wù)廣播消息或向指定的微服務(wù)發(fā)送消息。Spring Cloud Stream 是一個(gè)消息驅(qū)動(dòng)的微服務(wù)框架,它可以輕松地將消息通道與微服務(wù)進(jìn)行集成。
(資料圖)
準(zhǔn)備工作
首先,我們需要在 pom.xml 文件中添加以下依賴:
org.springframework.cloud spring-cloud-starter-bus-amqp org.springframework.cloud spring-cloud-stream-binder-rabbit
這些依賴將會(huì)引入 Spring Cloud Bus 和 Spring Cloud Stream 的相關(guān)庫,并且使用 RabbitMQ 作為消息代理。如果你想使用其他消息代理,可以根據(jù)實(shí)際需求進(jìn)行修改。
創(chuàng)建消息通道
在這個(gè)例子中,我們將創(chuàng)建一個(gè)名為 myChannel 的消息通道,用于在微服務(wù)之間傳遞消息。在創(chuàng)建消息通道之前,我們需要在 application.yml 文件中添加以下配置:
spring: cloud: stream: bindings: myChannel: destination: myChannel
這個(gè)配置將創(chuàng)建一個(gè)名為 myChannel 的消息通道,并將它綁定到 RabbitMQ 的 myChannel 隊(duì)列上?,F(xiàn)在,我們可以在代碼中使用 @Input 和 @Output 注解來定義輸入和輸出消息通道了。
public interface MyChannel { String INPUT = "myInput"; String OUTPUT = "myOutput"; @Input(INPUT) SubscribableChannel input(); @Output(OUTPUT) MessageChannel output();}
這個(gè)接口定義了一個(gè)名為 MyChannel 的消息通道,其中包括一個(gè)名為 myInput 的輸入消息通道和一個(gè)名為 myOutput 的輸出消息通道。
發(fā)布消息
在這個(gè)例子中,我們將創(chuàng)建一個(gè)名為 MyController 的控制器類,該類將發(fā)布一個(gè)名為 MyMessage 的消息到 myOutput 消息通道上。
@RestControllerpublic class MyController { @Autowired private MessageChannel output; @PostMapping("/send") public void sendMessage(@RequestBody MyMessage message) { output.send(MessageBuilder.withPayload(message).build()); }}
這個(gè)控制器類注入了名為 output 的 MessageChannel,用于向 myOutput 消息通道發(fā)送消息。在 sendMessage 方法中,我們通過 MessageBuilder 創(chuàng)建一個(gè)名為 message 的 MyMessage 消息,然后通過 output.send 方法將這個(gè)消息發(fā)送到 myOutput 消息通道上。
處理消息
在這個(gè)例子中,我們將創(chuàng)建一個(gè)名為 MyListener 的監(jiān)聽器類,該類將監(jiān)聽 myInput 消息通道上的消息,并將消息打印到控制臺(tái)上。
@EnableBinding(MyChannel.class)public class MyListener { @StreamListener(MyChannel.INPUT) public void handleMessage(MyMessage message) { System.out.println("Received message: " + message); }}
這個(gè)監(jiān)聽器類使用 @EnableBinding 注解將 MyChannel 消息通道綁定到 Spring Cloud Stream 上。在 handleMessage 方法中,我們使用 @StreamListener 注解監(jiān)聽 myInput 消息通道上的消息,當(dāng)有消息到來時(shí),Spring Cloud Stream 將自動(dòng)將消息轉(zhuǎn)換為 MyMessage 類型,并將其傳遞給 handleMessage 方法進(jìn)行處理。在這個(gè)例子中,我們只是簡單地將消息打印到控制臺(tái)上,你可以根據(jù)實(shí)際需求進(jìn)行修改。
運(yùn)行測試
現(xiàn)在,我們已經(jīng)創(chuàng)建了消息通道、發(fā)布了消息和處理了消息,我們可以啟動(dòng)應(yīng)用程序并測試它了。首先,我們需要在終端窗口中啟動(dòng) RabbitMQ,執(zhí)行以下命令:
cssCopy codedocker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
這個(gè)命令將啟動(dòng)一個(gè)名為 rabbitmq 的容器,并將其映射到本地主機(jī)的 5672 和 15672 端口上?,F(xiàn)在,我們可以啟動(dòng)應(yīng)用程序并訪問 http://localhost:8080/send發(fā)送消息了。在控制臺(tái)中,你應(yīng)該可以看到類似下面的輸出:
Received message: MyMessage{id=1, content="Hello, world!"}
這表明消息已經(jīng)成功傳遞到了 myInput 消息通道,并被 MyListener 監(jiān)聽到并處理了。
關(guān)鍵詞:
[責(zé)任編輯:xwzkw]
相關(guān)閱讀
- (2023-04-24)天天訊息:使用 Spring Cloud Bus 和 Spring Cloud Stream 集成實(shí)現(xiàn)基于消息的事件驅(qū)動(dòng)
- (2023-04-24)保立佳(301037):技術(shù)指標(biāo)出現(xiàn)看漲信號(hào)-KDJ 低位金叉(04-24)|全球熱推薦
- (2023-04-24)用歌聲來溝通,這支視障患者組成的樂隊(duì)帶來與EYE“瞳”行音樂會(huì) 天天熱點(diǎn)評(píng)
- (2023-04-24)焦點(diǎn)!日產(chǎn)將電動(dòng)e NV200轉(zhuǎn)變?yōu)闊o冰冰淇淋車
- (2023-04-24)焦點(diǎn)速讀:深圳市招雍置業(yè)擬進(jìn)行增資 擬募集資金對(duì)應(yīng)持股比例為不超30%
- (2023-04-24)湘西高新區(qū)召開文明城市創(chuàng)建工作推進(jìn)會(huì)
- (2023-04-24)突然崩了!暴跌33% 30年不敗神話或破!傳媒互聯(lián)網(wǎng)板塊飆新高!-觀察
- (2023-04-24)布朗:言語無法表達(dá)羅威的貢獻(xiàn) 健康的他可能是聯(lián)盟最佳防守球員
- (2023-04-24)中消協(xié)發(fā)布“五一”消費(fèi)提示:出行安全為先 綠色消費(fèi)、明辨陷阱_每日消息
- (2023-04-24)"五一"在即,二次感染要來?專家:新冠正走向流感化 全球看熱訊
- (2023-04-24)火影忍者觀看順序圖 火影忍者觀看順序 環(huán)球滾動(dòng)
- (2023-04-24)百安居圓滿舉辦工地開放日活動(dòng) 打造透明工地 “鑒”證匠心品質(zhì)
- (2023-04-24)【獨(dú)家】承認(rèn)不正當(dāng)關(guān)系 NBC環(huán)球CEO杰夫·謝爾引咎辭職
- (2023-04-24)4月24日白銀早評(píng):已接近加息周期尾聲 白銀行情下行-每日資訊
- (2023-04-24)世界看熱訊:PS二/三檔5月34款游戲離庫:有開發(fā)商一次離庫12款
- (2023-04-24)環(huán)球新資訊:4月24日生意社液氨基準(zhǔn)價(jià)為3050.00元/噸
- (2023-04-24)中國海軍航空兵某團(tuán)長航時(shí)訓(xùn)練見聞_滾動(dòng)
- (2023-04-24)電腦連接電視以后沒有聲音_電腦連接電視沒有聲音怎么辦
- (2023-04-24)許繼電氣:4月21日融券凈賣出500股,連續(xù)3日累計(jì)凈賣出3.19萬股|每日視點(diǎn)
- (2023-04-24)報(bào)道:非全日制用工是臨時(shí)工嗎?不是!要簽合同,單位應(yīng)繳工傷保險(xiǎn)
- (2023-04-24)中國一冶??诿捞m機(jī)場過夜用房及配套項(xiàng)目竣工驗(yàn)收|全球時(shí)快訊
- (2023-04-24)境外大學(xué)可在海南自由貿(mào)易港辦學(xué) 辦學(xué)學(xué)科限于理工農(nóng)醫(yī)類
- (2023-04-24)山西省人才市場管理?xiàng)l例
- (2023-04-24)怎樣注銷支付寶賬號(hào)注銷_怎樣注銷支付寶賬號(hào)
- (2023-04-24)丹柯主題_丹柯
- (2023-04-24)王鳳文:?齊抓共管壓實(shí)責(zé)任 筑牢大慶安全生產(chǎn)防線
- (2023-04-24)長沙地鐵5號(hào)線什么時(shí)候開通 要聞
- (2023-04-24)河北省圖書館開啟4·23世界讀書日系列活動(dòng)
- (2023-04-24)3hk電話卡_3hk|天天觀焦點(diǎn)
- (2023-04-24)焦點(diǎn)簡訊:范丞丞坐小卡車走紅毯 究竟為了什么?