基于消息的事件驅(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ì)列上?,F(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)到并處理了。
新化月報(bào)網(wǎng)報(bào)料熱線:886 2395@qq.com
相關(guān)文章
你可能會(huì)喜歡
最近更新
- 環(huán)球快看:使用 Spring Cloud Bus 和 Spring Cloud Stream 集成實(shí)現(xiàn)基于消息的事件驅(qū)動(dòng)2023-04-23
- 探訪中國(guó)近現(xiàn)代新聞出版博物館:百年夙愿,圓夢(mèng)今朝 全球今頭條2023-04-23
- 【世界新要聞】助殘圓夢(mèng)促就業(yè) 第七屆甘肅省殘疾人職業(yè)技能競(jìng)賽開(kāi)幕2023-04-23
- 世界即時(shí)看!“動(dòng)物中國(guó)”系列科普讀物閱讀分享會(huì)舉行2023-04-23
- 全球快訊:“書香隴原·愛(ài)蘭州愛(ài)閱讀”全民閱讀活動(dòng)啟動(dòng)2023-04-23
- 蘭州市七里河區(qū):讀書月活動(dòng)開(kāi)啟2023-04-23
- 簽約2.5億元 甘肅優(yōu)勢(shì)產(chǎn)業(yè)特色商品推介會(huì)在西班牙馬德里舉辦2023-04-23
- 空調(diào)不制冷了怎么回事?空調(diào)不冷是什么原因?2023-04-23
- “濂溪講堂”郴州開(kāi)講 同步啟動(dòng)“書香郴州·閱讀之城”全民閱讀活動(dòng)2023-04-23
- 【穩(wěn)增長(zhǎng) 促發(fā)展 強(qiáng)信心】株洲3年內(nèi)打造200家智能制造企業(yè) 數(shù)字經(jīng)濟(jì)對(duì)全市制造業(yè)發(fā)展貢獻(xiàn)率已超30% 全球獨(dú)家2023-04-23
- 天天要聞:2023“湖南人游常德”活動(dòng)在長(zhǎng)沙啟幕,發(fā)布七大獎(jiǎng)項(xiàng)獎(jiǎng)勵(lì)旅行商2023-04-23
- 信息:奔跑在畫里——2023酒鬼酒·吉首矮寨大橋馬拉松賽舉行2023-04-23
- 確保糧食播種面積584.95萬(wàn)畝2023-04-23
- “泡書屋”成新時(shí)尚 當(dāng)前資訊2023-04-23
- 給何寶珍奶奶的一封信2023-04-23
- 癸卯年黃帝故里 拜祖大典在鄭州舉行2023-04-23
- 哪些二線城市還有投資價(jià)值-天天熱資訊2023-04-23
- 昌江“三月三”系列活動(dòng)精彩紛呈:抓鴨子、聽(tīng)黎歌、逛集市 熱門看點(diǎn)2023-04-23
- 龍華區(qū)公租房:現(xiàn)役軍人等特殊群體選房名單及選房簽約等事項(xiàng)通告-全球觀天下2023-04-23
- 謝逸楓:一季度全國(guó)賣地收入同比下降27%2023-04-23
- 天天通訊!以黨建為引領(lǐng) 結(jié)對(duì)共建促發(fā)展 讓包頭名特優(yōu)新農(nóng)產(chǎn)品聲名遠(yuǎn)播2023-04-23
- 鹿城文旅大講堂第三期開(kāi)講 世界通訊2023-04-23
- 全球快資訊:全民閱讀 共享書香2023-04-23
- 【獨(dú)家】“包頭人的讀書熱情,常常讓我感動(dòng)”2023-04-23
- 天天微速訊:防災(zāi)減災(zāi)進(jìn)校園 護(hù)航師生保安全2023-04-23
- 空調(diào)睡眠模式運(yùn)行原理是什么?使用空調(diào)的注意事項(xiàng)有哪些?2023-04-23
- 嫩姜的腌制方法及保存(嫩姜的腌制方法)2023-04-23
- 當(dāng)前速遞!車輛保險(xiǎn)費(fèi)計(jì)入什么科目費(fèi)用(車輛保險(xiǎn)費(fèi)入什么科目)2023-04-23
- word表格填充序號(hào)怎么設(shè)置(word表格快速填充序號(hào))2023-04-23
- 火車買臥鋪能選上下鋪嗎(買火車臥鋪可以選上下鋪嗎)2023-04-23