基于消息的事件驅(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è)消息總線(xiàn),它可以在微服務(wù)之間傳遞消息,可以將所有微服務(wù)視為一個(gè)整體,向所有微服務(wù)廣播消息或向指定的微服務(wù)發(fā)送消息。Spring Cloud Stream 是一個(gè)消息驅(qū)動(dòng)的微服務(wù)框架,它可以輕松地將消息通道與微服務(wù)進(jìn)行集成。
(資料圖)
首先,我們需要在 pom.xml 文件中添加以下依賴(lài):
org.springframework.cloud spring-cloud-starter-bus-amqp org.springframework.cloud spring-cloud-stream-binder-rabbit
這些依賴(lài)將會(huì)引入 Spring Cloud Bus 和 Spring Cloud Stream 的相關(guān)庫(kù),并且使用 RabbitMQ 作為消息代理。如果你想使用其他消息代理,可以根據(jù)實(shí)際需求進(jìn)行修改。
在這個(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 的輸出消息通道。
在這個(gè)例子中,我們將創(chuàng)建一個(gè)名為 MyController 的控制器類(lèi),該類(lèi)將發(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è)控制器類(lèi)注入了名為 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)器類(lèi),該類(lèi)將監(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)器類(lèi)使用 @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 類(lèi)型,并將其傳遞給 handleMessage 方法進(jìn)行處理。在這個(gè)例子中,我們只是簡(jiǎn)單地將消息打印到控制臺(tái)上,你可以根據(jù)實(shí)際需求進(jìn)行修改。
現(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 端口上?,F(xiàn)在,我們可以啟動(dòng)應(yīng)用程序并訪(fǎng)問(wèn) http://localhost:8080/send發(fā)送消息了。在控制臺(tái)中,你應(yīng)該可以看到類(lèi)似下面的輸出:
Received message: MyMessage{id=1, content="Hello, world!"}
這表明消息已經(jīng)成功傳遞到了 myInput 消息通道,并被 MyListener 監(jiān)聽(tīng)到并處理了。
關(guān)鍵詞:
免責(zé)聲明:本網(wǎng)站所有信息,并不代表本站贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé),投資者據(jù)此操作,風(fēng)險(xiǎn)請(qǐng)自擔(dān)。
基于消息的事件驅(qū)動(dòng)是一種常見(jiàn)的微服務(wù)架構(gòu)設(shè)計(jì)模式,它將不同的微服務(wù)之間通過(guò)消息進(jìn)行通信,實(shí)現(xiàn)松耦合、高可伸縮性和高可靠性。在這...
地板有哪幾種材質(zhì)?1、實(shí)木地板:它的木材特點(diǎn)是當(dāng)氣候干燥時(shí),木材里面水分釋出,而氣候潮濕,木材又會(huì)吸附空氣里的水分。木地板經(jīng)過(guò)吸收及
【滬電股份今日漲停二機(jī)構(gòu)凈買(mǎi)入1 77億元】滬電股份今日漲停,成交額35 40億元,換手率7 34%,盤(pán)后龍虎榜數(shù)據(jù)顯示,深股通專(zhuān)用席位買(mǎi)入2 15億
遼寧證券業(yè)協(xié)會(huì)、轄區(qū)證券期貨經(jīng)營(yíng)機(jī)構(gòu)、投資咨詢(xún)公司、基金機(jī)構(gòu)負(fù)責(zé)人等200余人線(xiàn)上線(xiàn)下參會(huì)
電動(dòng)門(mén)有哪些類(lèi)型1、按啟閉形式分電動(dòng)門(mén)有不少啟動(dòng)方式,有推拉、平開(kāi)、重疊、折疊、弧形、旋轉(zhuǎn)等等方式,電動(dòng)推拉門(mén)又可細(xì)分為單開(kāi)門(mén)、雙
【中國(guó)結(jié)算公司:統(tǒng)一賬戶(hù)平臺(tái)、身份信息核查系統(tǒng)于4月22日全天暫停對(duì)外服務(wù)】據(jù)中國(guó)證券登記結(jié)算有限責(zé)任公司官網(wǎng)公告,“因技術(shù)系統(tǒng)測(cè)...
強(qiáng)冷空氣影響中國(guó)大部北方部分地區(qū)降溫超20℃,主流媒體,山西門(mén)戶(hù)。山西新聞網(wǎng)是經(jīng)國(guó)務(wù)院新聞辦審核批準(zhǔn),由山西日?qǐng)?bào)報(bào)業(yè)集團(tuán)主管、主辦的山西
【藍(lán)色光標(biāo)今日20cm漲停二機(jī)構(gòu)凈買(mǎi)入2 97億元】藍(lán)色光標(biāo)今日20cm漲停,成交額61 14億元,換手率26 39%,盤(pán)后龍虎榜數(shù)據(jù)顯示,深股通專(zhuān)用席位買(mǎi)
國(guó)家消防救援局:堅(jiān)決防范遏制重特大火災(zāi)事故,主流媒體,山西門(mén)戶(hù)。山西新聞網(wǎng)是經(jīng)國(guó)務(wù)院新聞辦審核批準(zhǔn),由山西日?qǐng)?bào)報(bào)業(yè)集團(tuán)主管、主辦...
凡人微光|當(dāng)傳統(tǒng)文化遇上“后浪”,主流媒體,山西門(mén)戶(hù)。山西新聞網(wǎng)是經(jīng)國(guó)務(wù)院新聞辦審核批準(zhǔn),由山西日?qǐng)?bào)報(bào)業(yè)集團(tuán)主管、主辦的山西省重...
行情回顧:今日黑色系大幅回落。熱卷跌51元收3973,螺紋鋼跌26元收3914,焦炭跌82 5元收2312,鐵礦石跌20 5元收761 5?,F(xiàn)貨市場(chǎng):今日4 75m
新華全媒+|一季度經(jīng)濟(jì)形勢(shì)怎么看?如何擴(kuò)內(nèi)需、強(qiáng)信心?——國(guó)家發(fā)展改革委新聞發(fā)布會(huì)回應(yīng)當(dāng)前經(jīng)濟(jì)熱點(diǎn),主流媒體,山西門(mén)戶(hù)。山西新聞網(wǎng)...
全國(guó)已春播糧食面積超1 6億畝進(jìn)度近兩成,主流媒體,山西門(mén)戶(hù)。山西新聞網(wǎng)是經(jīng)國(guó)務(wù)院新聞辦審核批準(zhǔn),由山西日?qǐng)?bào)報(bào)業(yè)集團(tuán)主管、主辦的山...
電動(dòng)門(mén)遙控器配對(duì)教程是怎樣的?1、清碼:同時(shí)按住鎖定鍵和向下鍵,可以看到指示燈在不停跳動(dòng)。只需按住遙控器上的按鈕,您可以看到指示燈亮
記者從福建省交通運(yùn)輸廳獲悉,一季度,福建省公路水路交通投資累計(jì)完成289億元,超序時(shí)進(jìn)度3 9個(gè)百分點(diǎn),累計(jì)開(kāi)工21個(gè)重大交通項(xiàng)目。
建筑模板有什么優(yōu)勢(shì)1、因?yàn)檫@種建筑模板的質(zhì)量比較輕,可以隨意鉆或者打釘、鋸,能夠組成不同的造型,適用于建筑支模需求。2、另外它的表面
建筑模板的尺寸規(guī)格有哪些?1、建筑模板的尺寸規(guī)格還是比較多的,而在生活中它的使用范圍非常廣泛。規(guī)格有兩種,一種就是1 83×0 92米
鋼絲網(wǎng)片有什么用途1、鋼絲網(wǎng)片可以用做地暖的加熱網(wǎng)片,鋪設(shè)在地面上,能夠達(dá)到地暖很好的保暖效果。在使用鋼絲網(wǎng)片時(shí),一般都會(huì)采用整體
鋼絲網(wǎng)片的規(guī)格型號(hào)有哪些?孔徑為2厘米,5厘米,10厘米和15厘米等,外觀尺寸為1 2x3厘米,1x3厘米。鋼絲網(wǎng)片是由優(yōu)質(zhì)的低碳鋼絲按照十字形
家用電器短路起火用什么滅火器?可以用干粉滅火器。遭遇到電器短路引發(fā)的火災(zāi)時(shí),不可以帶電滅火,也不能使用水基滅火跟泡沫滅火器進(jìn)行滅火
地板有哪幾種材質(zhì)?1、實(shí)木地板:它的木材特點(diǎn)是當(dāng)氣候干燥時(shí),木材里面水分釋出,而氣候潮濕,木材又會(huì)吸附...
電動(dòng)門(mén)有哪些類(lèi)型1、按啟閉形式分電動(dòng)門(mén)有不少啟動(dòng)方式,有推拉、平開(kāi)、重疊、折疊、弧形、旋轉(zhuǎn)等等方式,電...
使用砂漿噴涂機(jī)要注意什么?1、在操作砂漿噴涂機(jī)的時(shí)候,需要盡可能的減少?gòu)澒艿拇嬖冢悦庥绊懙缴皾{的正常...