日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Spring Cloud Stream微服務(wù)消息框架原理及實(shí)例解析

瀏覽:17日期:2023-09-03 18:45:34

隨著近些年微服務(wù)在國內(nèi)的盛行,消息驅(qū)動(dòng)被提到的越來越多。主要原因是系統(tǒng)被拆分成多個(gè)模塊后,一個(gè)業(yè)務(wù)往往需要在多個(gè)服務(wù)間相互調(diào)用,不管是采用HTTP還是RPC都是同步的,不可避免快等慢的情況發(fā)生,系統(tǒng)性能上很容易遇到瓶頸。在這樣的背景下,將業(yè)務(wù)中實(shí)時(shí)性要求不是特別高且非主干的部分放到消息隊(duì)列中是很好的選擇,達(dá)到了異步解耦的效果。

目前消息隊(duì)列有很多優(yōu)秀的中間件,目前使用較多的主要有 RabbitMQ,Kafka,RocketMQ 等,這些中間件各有優(yōu)勢,有的對(duì) AMQP(應(yīng)用層標(biāo)準(zhǔn)高級(jí)消息隊(duì)列協(xié)議)支持完善,有的提供了更高的可靠性,有的對(duì)大數(shù)據(jù)支持良好,同時(shí)各種消息中間件概念不統(tǒng)一,使得選擇和使用一款合適的消息中間件成為難題。Spring跳出來給出了解決方案:Spring Cloud Stream,使用它可以很方便高效的操作消息中間件,程序員只要關(guān)心業(yè)務(wù)代碼即可,目前官方支持 RabbitMQ,Kafka兩大主流MQ,RocketMQ 則自己提供了相應(yīng)支持。

首先看一下Spring Cloud Stream做了什么,如下圖所示,框架目前官方把消息中間件抽象成了 Binder,業(yè)務(wù)代碼通過進(jìn)出管道連接 Binder,各消息中間件的差異性統(tǒng)一交給了框架處理,程序員只需要了解框架的抽象出來的一些統(tǒng)一概念即可

Binder(綁定器):RabbitMQ,Kafka等中間件服務(wù)的封裝 Channel(管道):也就是圖中的 inputs 和 outputs 所指區(qū)域,是應(yīng)用程序和 Binder 的橋梁 Gourp(消費(fèi)組):由于微服務(wù)會(huì)部署多實(shí)例,為了保證只被服務(wù)的一個(gè)實(shí)例消費(fèi),可以通過配置,把實(shí)例都綁到同一個(gè)消費(fèi)組 Partitioning (消息分區(qū)):如果某一類消息只想指定給服務(wù)的固定實(shí)例消費(fèi),可以使用分區(qū)實(shí)現(xiàn)

Spring Cloud Stream微服務(wù)消息框架原理及實(shí)例解析

Spring Cloud Stream將業(yè)務(wù)代碼和消息中間件解耦,帶來的好處可以從下圖很直觀的感受到,很簡潔的代碼,我們便能從RabbitMQ中接受消息然后經(jīng)過業(yè)務(wù)處理再向Kafka發(fā)送一條消息,只需要更改相關(guān)配置就能快速改變系統(tǒng)行為。

Spring Cloud Stream微服務(wù)消息框架原理及實(shí)例解析

細(xì)心的讀者可能會(huì)好奇,上圖的代碼只是注入了一個(gè)簡單的 Function 而已,實(shí)際上,Spring Cloud Stream3.0后集成了Spring Cloud Function框架 ,提倡函數(shù)式的風(fēng)格,棄用先前版本基于注解的開發(fā)方式。Spring Cloud Function是 Serverless 和 Faas 的產(chǎn)物,強(qiáng)調(diào)面向函數(shù)編程,一份代碼各云平臺(tái)運(yùn)行,和Spring Cloud Stream一樣也是解決了基礎(chǔ)設(shè)施的差異性問題,通過強(qiáng)大的自動(dòng)裝配機(jī)制,可以根據(jù)配置自動(dòng)暴露 HTTP 服務(wù)或者消息服務(wù),并且同時(shí)支持命令式和響應(yīng)式編程模式,可以說是很強(qiáng)大了。下面通過一個(gè)簡單的例子來理解下上圖的代碼和框架的使用把。

簡單案例

模擬一個(gè)簡單的下單,收到訂單之后處理完,返回成功,然后發(fā)送消息給庫存模塊,庫存模塊再發(fā)送消息給報(bào)表模塊

項(xiàng)目地址

springcloud-stream

項(xiàng)目結(jié)構(gòu)

Spring Cloud Stream微服務(wù)消息框架原理及實(shí)例解析

項(xiàng)目依賴

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId></dependency>

表單

@Datapublic class OrderForm { private String productName;}

消息管道注冊

@Configuration@Slf4jpublic class MessageQueueConfig { @Bean public Function<OrderForm, OrderForm> inventory() { return orderForm -> { log.info('Inventory Received Message: ' + orderForm); return orderForm; }; } @Bean public Consumer<OrderForm> report() { return orderForm -> { log.info('Report Received Message: ' + orderForm); }; }}

Controller

@Slf4j@RestControllerpublic class OrderController { @Autowired private BeanFactoryChannelResolver resolver; @PostMapping('order') public String order(@RequestBody OrderForm orderForm) { log.info('Received Request ' + orderForm); resolver.resolveDestination('inventory-in-0').send(new GenericMessage<>(orderForm)); return 'success'; }}

配置

框架會(huì)按照中間件默認(rèn)端口去連接,這里自定義了一個(gè)名為myLocalRabbit的類型是RabbitMQ的Binder配置,bindings下面 inventory-in-0 是通道名,接受inventory主題(對(duì)應(yīng)RabbitMQ的ExChange)的消息,然后處理完通過 inventory-out-0 通道發(fā)送消息到 report 主題, report-in-0通道負(fù)責(zé)接受report主題的消息。

注:通道名=注冊的 function 方法名 + in或者out + 參數(shù)位置(詳見注釋)

spring: cloud: stream:# 配置消息中間件信息 binders: myLocalRabbit: type: rabbit environment: spring: rabbitmq:host: localhostport: 31003username: guestpassword: guestvirtual-host: /# 重點(diǎn),如何綁定通道,這里有個(gè)約定,開頭是函數(shù)名,in表示消費(fèi)消息,out表示生產(chǎn)消息,最后的數(shù)字是函數(shù)接受的參數(shù)的位置,destination后面為訂閱的主題# 比如Function<Tuple2<Flux<String>, Flux<Integer>>, Flux<String>> gather()# gather函數(shù)接受的第一個(gè)String參數(shù)對(duì)應(yīng) gather-in-0,第二個(gè)Integer參數(shù)對(duì)應(yīng) gather-in-1,輸出對(duì)應(yīng) gather-out-0 bindings: inventory-in-0: destination: inventory inventory-out-0: destination: report report-in-0: destination: report# 注冊聲明的三個(gè)函數(shù) function: definition: inventory;report

測試

POST http://localhost:8080/orderContent-Type: application/json{ 'productName': '999'}

結(jié)果

POST http://localhost:8080/orderHTTP/1.1 200 Content-Type: text/plain;charset=UTF-8Content-Length: 7Date: Sat, 30 May 2020 15:27:56 GMTKeep-Alive: timeout=60Connection: keep-alivesuccessResponse code: 200; Time: 56ms; Content length: 7 bytes

后臺(tái)日志

可以看到消息成功發(fā)送到了庫存和報(bào)表服務(wù)

2020-05-30 23:27:56.956 INFO 8760 --- [nio-8080-exec-1] c.e.springcloudstream.OrderController : Received Request OrderForm(productName=999)2020-05-30 23:27:56.956 INFO 8760 --- [nio-8080-exec-1] o.s.i.h.s.MessagingMethodInvokerHelper : Overriding default instance of MessageHandlerMethodFactory with provided one.2020-05-30 23:27:56.957 INFO 8760 --- [nio-8080-exec-1] c.e.s.MessageQueueConfig : Inventory Received Message: OrderForm(productName=999)2020-05-30 23:27:56.958 INFO 8760 --- [nio-8080-exec-1] o.s.a.r.c.CachingConnectionFactory : Attempting to connect to: [localhost:31003]2020-05-30 23:27:56.964 INFO 8760 --- [nio-8080-exec-1] o.s.a.r.c.CachingConnectionFactory : Created new connection: rabbitConnectionFactory.publisher#6131841e:0/SimpleConnection@192fe472 [delegate=amqp://guest@127.0.0.1:31003/, localPort= 2672]2020-05-30 23:27:56.965 INFO 8760 --- [nio-8080-exec-1] o.s.amqp.rabbit.core.RabbitAdmin : Auto-declaring a non-durable, auto-delete, or exclusive Queue (inventory.anonymous.wtaFwHlNRkql5IUh2JCNAA) durable:false, auto-delete:true, exclusive:true. It will be redeclared if the broker stops and is restarted while the connection factory is alive, but all messages will be lost.2020-05-30 23:27:56.965 INFO 8760 --- [nio-8080-exec-1] o.s.amqp.rabbit.core.RabbitAdmin : Auto-declaring a non-durable, auto-delete, or exclusive Queue (report.anonymous.SJgpJKiJQf2tudszgf623w) durable:false, auto-delete:true, exclusive:true. It will be redeclared if the broker stops and is restarted while the connection factory is alive, but all messages will be lost.2020-05-30 23:27:56.979 INFO 8760 --- [f2tudszgf623w-1] o.s.i.h.s.MessagingMethodInvokerHelper : Overriding default instance of MessageHandlerMethodFactory with provided one.2020-05-30 23:27:56.980 INFO 8760 --- [f2tudszgf623w-1] c.e.s.MessageQueueConfig : Report Received Message: OrderForm(productName=999)

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
视频一区中文字幕精品| 亚洲一区网站| 天堂av在线一区| 在线亚洲成人| 亚洲精品1区2区| 日韩在线一二三区| 亚洲另类黄色| 日韩中文字幕一区二区三区| 亚洲专区在线| 日本大胆欧美人术艺术动态| 视频一区视频二区中文| 视频一区欧美日韩| 天堂久久一区| 久久精品xxxxx| 国产欧美自拍| 精品一区视频| 成人va天堂| 不卡中文字幕| 国产精品老牛| 综合激情婷婷| 国产情侣久久| 国产精品毛片久久| 国产在线观看91一区二区三区| 日韩av在线中文字幕| 成人免费网站www网站高清| 99精品国产一区二区三区| 亚洲免费黄色| 欧美日韩视频免费看| 国产一区二区三区网| 欧美成人日韩| 亚洲精品九九| 麻豆一区二区在线| 日韩在线欧美| 只有精品亚洲| 久久精品免费看| 欧美日韩国产免费观看视频| 日精品一区二区三区| 国产精品欧美三级在线观看| 精品日本视频| aa国产精品| 欧美日韩一区二区三区四区在线观看 | 91成人精品视频| 亚洲天堂日韩在线| 久久不见久久见中文字幕免费| 日韩欧美精品综合| 视频一区二区不卡| 国产精品久久久一区二区| 天堂√8在线中文| 久久夜色精品| 麻豆免费精品视频| 亚洲一区二区三区高清| 欧美精品1区| 午夜视频精品| 国产精品欧美一区二区三区不卡| 中文一区一区三区高中清不卡免费| 蜜桃国内精品久久久久软件9| 日韩激情综合| 91精品国产调教在线观看| 欧美日韩国产一区二区在线观看| 日本精品不卡| 日韩激情中文字幕| 日韩精品看片| 国产剧情一区二区在线观看| 欧美日韩黑人| 国产一区二区三区四区五区| 视频一区二区不卡| 午夜av不卡| 欧美一区成人| 黄色亚洲大片免费在线观看| 久久永久免费| 日韩在线观看中文字幕| 蜜臀国产一区| 国产精品嫩草影院在线看| 在线国产一区二区| 精品三级久久久| 亚洲精品欧美| 欧美日韩在线网站| 精品一区二区三区的国产在线观看| 久久亚洲电影| 欧美亚洲激情| 久久精品一本| 91欧美极品| 天堂av在线一区| 欧美日韩精品免费观看视完整| 国产精品亚洲人成在99www| 鲁大师成人一区二区三区| 欧美羞羞视频| 久久影院资源站| 日本99精品| 红桃视频国产一区| 国产精品yjizz视频网| 久久精品99久久久| 亚洲精品大片| 午夜久久99| 久久蜜桃精品| 国产中文在线播放| 久久伊人亚洲| 国产欧美一区二区色老头| 在线观看一区| 亚洲在线电影| 欧美精品黄色| 九九在线精品| 久久精品中文| 亚洲精品在线影院| 超碰99在线| 精品三级在线观看视频| 欧美日韩一区二区三区在线电影| 亚洲深深色噜噜狠狠爱网站| 欧美在线亚洲综合一区| 久久九九99| 国产精品99一区二区三区| 国产极品模特精品一二| 国产精品网站在线看| 日本三级亚洲精品| 日韩精品一区二区三区中文在线| 美女精品在线| 在线国产日韩| 亚洲精品护士| 亚洲日产av中文字幕| 蜜臀av性久久久久蜜臀aⅴ流畅| 麻豆9191精品国产| 亚洲在线成人| 在线免费观看亚洲| 亚洲精品九九| 日韩va亚洲va欧美va久久| 亚洲aⅴ网站| 欧美一区网站| 国产日韩欧美高清免费| 国产精品自拍区| 国产欧美高清| 久久精品资源| 中文在线免费视频| 久久精品动漫| 精品91久久久久| 蜜桃久久久久久久| 日本欧美在线| 日本成人在线视频网站| 国产伦精品一区二区三区千人斩| 国产麻豆精品| 首页国产精品| 天堂中文在线播放| 婷婷亚洲五月| 综合激情五月婷婷| 国产伦一区二区三区| 国产 日韩 欧美 综合 一区| 丁香六月综合| 欧美成人日韩| 亚洲精品影视| 国产精品igao视频网网址不卡日韩| 开心激情综合| 亚洲v在线看| 国产精品7m凸凹视频分类| 蜜桃久久av一区| 久久黄色影视| 四虎成人av| 婷婷激情图片久久| 午夜亚洲福利| 久久亚洲黄色| 免费精品国产的网站免费观看| 中文字幕一区二区三区日韩精品 | 欧美日韩一视频区二区| 麻豆精品久久久| 亚洲小说欧美另类婷婷| 中文字幕日韩高清在线| 国产精品mv在线观看| 久久九九精品| 天海翼精品一区二区三区| 久久免费影院| 亚洲成人日韩| 国产亚洲一区二区三区啪| 日韩电影免费在线观看| 亚洲专区一区| 精品日韩一区| 亚洲男女自偷自拍| 日本综合精品一区| 国产高潮在线| 亚洲一区二区免费在线观看| 国产精品3区| 一区二区视频欧美| 国产精品chinese| 国内精品99| 久久av免费| 亚洲综合丁香| 国产在线不卡一区二区三区| 99riav1国产精品视频| 欧美黄页在线免费观看| 国产尤物精品| 国产一级成人av| 女同性一区二区三区人了人一 | 精品视频一区二区三区在线观看| 欧美日韩高清| 久久伊人久久| 亚洲一二av| 久久国产亚洲| 久久av资源| 亚洲精品国模| 99久久九九| 久久99影视| 蜜臀av国产精品久久久久 | 日韩不卡免费高清视频|