【世界時(shí)快訊】使用 Spring Cloud Bus 和 Spring Cloud Stream 集成實(shí)現(xiàn)基于消息的事件驅(qū)動(dòng)
基于消息的事件驅(qū)動(dòng)是一種常見(jiàn)的微服務(wù)架構(gòu)設(shè)計(jì)模式,它將不同的微服務(wù)之間通過(guò)消息進(jìn)行通信,實(shí)現(xiàn)松耦合、高可伸縮性和高可靠性。在這種架構(gòu)下,每個(gè)微服務(wù)都是獨(dú)立的,它們可以在消息傳遞的過(guò)程中進(jìn)行異步操作,這使得整個(gè)系統(tǒng)的性能得到了很大的提升。
在 Spring Cloud 中,我們可以使用 Spring Cloud Bus 和 Spring Cloud Stream 集成來(lái)實(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)庫(kù),并且使用 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ì)列上。現(xiàn)在,我們可以在代碼中使用 @Input 和 @Output 注解來(lái)定義輸入和輸出消息通道了。
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 方法中,我們通過(guò) MessageBuilder 創(chuàng)建一個(gè)名為 message 的 MyMessage 消息,然后通過(guò) output.send 方法將這個(gè)消息發(fā)送到 myOutput 消息通道上。
處理消息
在這個(gè)例子中,我們將創(chuàng)建一個(gè)名為 MyListener 的監(jiān)聽(tīng)器類,該類將監(jiān)聽(tīng) 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)聽(tīng)器類使用 @EnableBinding 注解將 MyChannel 消息通道綁定到 Spring Cloud Stream 上。在 handleMessage 方法中,我們使用 @StreamListener 注解監(jiān)聽(tīng) myInput 消息通道上的消息,當(dāng)有消息到來(lái)時(shí),Spring Cloud Stream 將自動(dòng)將消息轉(zhuǎn)換為 MyMessage 類型,并將其傳遞給 handleMessage 方法進(jìn)行處理。在這個(gè)例子中,我們只是簡(jiǎn)單地將消息打印到控制臺(tái)上,你可以根據(jù)實(shí)際需求進(jìn)行修改。
運(yùn)行測(cè)試
現(xiàn)在,我們已經(jīng)創(chuàng)建了消息通道、發(fā)布了消息和處理了消息,我們可以啟動(dòng)應(yīng)用程序并測(cè)試它了。首先,我們需要在終端窗口中啟動(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 端口上。現(xiàn)在,我們可以啟動(dòng)應(yīng)用程序并訪問(wèn) http://localhost:8080/send發(fā)送消息了。在控制臺(tái)中,你應(yīng)該可以看到類似下面的輸出:
Received message: MyMessage{id=1, content="Hello, world!"}
這表明消息已經(jīng)成功傳遞到了 myInput 消息通道,并被 MyListener 監(jiān)聽(tīng)到并處理了。
關(guān)鍵詞:
相關(guān)閱讀
-
【世界時(shí)快訊】使用 Spring Cloud Bu...
基于消息的事件驅(qū)動(dòng)是一種常見(jiàn)的微服務(wù)架構(gòu)設(shè)計(jì)模式,它將不同的微... -
看點(diǎn):Acrobat Distiller是什么軟件?A...
1、AcrobatDistiller是創(chuàng)建PDF文件的執(zhí)行軟件。2、在啟動(dòng)Distiller... -
msvcr100.dll如何下載?msvcr100 dll怎么安裝?
1、需要準(zhǔn)備的材料分別有:電腦、MSVCR100 dll文件。2、通過(guò)一定的... -
焦點(diǎn)熱門:yy會(huì)員怎么開(kāi)通?yy會(huì)員的開(kāi)通...
1、用戶可以訪問(wèn)http: vip yy com YY會(huì)員官網(wǎng):直接在首頁(yè)點(diǎn)... -
真實(shí)之淚是什么游戲?關(guān)于真實(shí)之淚的游...
1、《真實(shí)之淚》(truetears)是P A WORKS首部獨(dú)立作品,于2006年... -
今日熱文:身陷囹圄怎么讀?深陷囹圄是...
1、身陷囹圄línɡ囹yǔ圄囹圄:原意義就是監(jiān)牢的意思,出自《韓非... -
質(zhì)子化常數(shù)是什么?質(zhì)子化是什么概念?
1、簡(jiǎn)單的可以理解為和質(zhì)子化合,即結(jié)合一個(gè)質(zhì)子,一般都是該物質(zhì)有... -
世界新資訊:24寸顯示器有哪些推薦?推...
24寸顯示器的最佳分辨率為1920X1080(參考16:9LCD,16:1024寸為1920X... -
今日關(guān)注:vi系統(tǒng)是什么?vi系統(tǒng)的作用...
1、VI全稱VisualIdentity,即企業(yè)VI視覺(jué)設(shè)計(jì),通譯為視覺(jué)識(shí)別系統(tǒng)。2... -
即時(shí)看!iqoo3參數(shù)是多少?iqoo3參數(shù)配...
1,iqoo3參數(shù)配置:iQOO3主要參數(shù):操作系統(tǒng):全新iQOOUI(基于Andr... -
世界今日?qǐng)?bào)丨阿里文學(xué)是什么業(yè)務(wù)?關(guān)于...
1、阿里巴巴文學(xué)(簡(jiǎn)稱:阿里文學(xué))是阿里巴巴移動(dòng)事業(yè)群于2015年4... -
融資融券余額說(shuō)明什么??jī)扇诓铑~指標(biāo)線...
融資融券余額說(shuō)明什么?股票融資余額是指融資融券的余額,融資越高就... -
世界信息:車展E快評(píng)|比亞迪硬核實(shí)力的...
仰望U8在來(lái)上海車展之前已經(jīng)積攢了足夠的互聯(lián)網(wǎng)熱度,什么原地掉頭... -
融資融券是什么意思?股票融資50萬(wàn)一天...
融資融券是什么意思?融資融券又叫證券信用交易,是指投資者在自身資... -
每日精選:工信部:一季度我國(guó)造船三大...
人民網(wǎng)北京4月19日電(記者申佳平)據(jù)工業(yè)和信息化部官網(wǎng)消息,2023... -
【全球獨(dú)家】一圖了解統(tǒng)計(jì)工作如何服務(wù)...
人民網(wǎng)北京4月19日電(記者楊曦)第四屆聯(lián)合國(guó)世界數(shù)據(jù)論壇即將舉辦... -
信用卡提現(xiàn)影響個(gè)人征信嗎?個(gè)人征信記...
信用卡提現(xiàn)影響個(gè)人征信嗎?不影響。信用卡提現(xiàn)屬于正常使用行為,對(duì)... -
信用卡取現(xiàn)和刷卡有什么區(qū)別?個(gè)人pos機(jī)...
信用卡取現(xiàn)和刷卡有什么區(qū)別?1、概念不同:信用卡取現(xiàn)指的是發(fā)卡銀... -
股權(quán)激勵(lì)需要員工自己出資購(gòu)買嗎?股權(quán)...
股權(quán)激勵(lì)需要員工自己出資購(gòu)買嗎?1、需要。因?yàn)楣蓹?quán)激勵(lì)是一種激勵(lì)... -
股權(quán)激勵(lì)常見(jiàn)的四種模式是什么?股權(quán)激...
股權(quán)激勵(lì)常見(jiàn)的四種模式是什么?1、分紅權(quán)在成長(zhǎng)期的企業(yè)中,需要大...