最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年06月02日 09:54:17   作者:Freshchen''s Blog  
這篇文章主要介紹了Spring Cloud Stream微服務(wù)消息框架原理及實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

隨著近些年微服務(wù)在國(guó)內(nèi)的盛行,消息驅(qū)動(dòng)被提到的越來(lái)越多。主要原因是系統(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)勢(shì),有的對(duì) AMQP(應(yīng)用層標(biāo)準(zhǔn)高級(jí)消息隊(duì)列協(xié)議)支持完善,有的提供了更高的可靠性,有的對(duì)大數(shù)據(jù)支持良好,同時(shí)各種消息中間件概念不統(tǒng)一,使得選擇和使用一款合適的消息中間件成為難題。Spring跳出來(lái)給出了解決方案:Spring Cloud Stream,使用它可以很方便高效的操作消息中間件,程序員只要關(guān)心業(yè)務(wù)代碼即可,目前官方支持 RabbitMQ,Kafka兩大主流MQ,RocketMQ 則自己提供了相應(yīng)支持。

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

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

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

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

簡(jiǎn)單案例

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

項(xiàng)目地址

springcloud-stream

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

項(xiàng)目依賴(lài)

<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>

表單

@Data
public class OrderForm {
  private String productName;
}

消息管道注冊(cè)

@Configuration
@Slf4j
public 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
@RestController
public 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的類(lèi)型是RabbitMQ的Binder配置,bindings下面 inventory-in-0 是通道名,接受inventory主題(對(duì)應(yīng)RabbitMQ的ExChange)的消息,然后處理完通過(guò) inventory-out-0 通道發(fā)送消息到 report 主題, report-in-0通道負(fù)責(zé)接受report主題的消息。

注:通道名=注冊(cè)的 function 方法名 + in或者out + 參數(shù)位置(詳見(jiàn)注釋?zhuān)?/p>

spring:
 cloud:
  stream:
#   配置消息中間件信息
   binders:
    myLocalRabbit:
     type: rabbit
     environment:
      spring:
       rabbitmq:
        host: localhost
        port: 31003
        username: guest
        password: guest
        virtual-host: /
#   重點(diǎn),如何綁定通道,這里有個(gè)約定,開(kāi)頭是函數(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
#   注冊(cè)聲明的三個(gè)函數(shù)
   function:
    definition: inventory;report

測(cè)試

POST http://localhost:8080/order
Content-Type: application/json

{
 "productName": "999"
}

結(jié)果

POST http://localhost:8080/order

HTTP/1.1 200 
Content-Type: text/plain;charset=UTF-8
Content-Length: 7
Date: Sat, 30 May 2020 15:27:56 GMT
Keep-Alive: timeout=60
Connection: keep-alive

success

Response code: 200; Time: 56ms; Content length: 7 bytes

后臺(tái)日志

可以看到消息成功發(fā)送到了庫(kù)存和報(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)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring?Boot條件注解之@ConditionalOnProperty完全解析

    Spring?Boot條件注解之@ConditionalOnProperty完全解析

    這篇文章主要介紹了SpringBoot中的@ConditionalOnProperty注解,通過(guò)配置文件屬性值控制Bean或配置類(lèi)的加載,實(shí)現(xiàn)功能開(kāi)關(guān)和環(huán)境配置,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • 淺析我對(duì) String、StringBuilder、StringBuffer 的理解

    淺析我對(duì) String、StringBuilder、StringBuffer 的理解

    StringBuilder、StringBuffer 和 String 一樣,都是用于存儲(chǔ)字符串的。這篇文章談?wù)勑【帉?duì)String、StringBuilder、StringBuffer 的理解,感興趣的朋友跟隨小編一起看看吧
    2020-05-05
  • Java中判斷集合是否相等的幾種方法詳解

    Java中判斷集合是否相等的幾種方法詳解

    這篇文章主要介紹了Java中判斷集合是否相等的幾種方法詳解,在平時(shí)的開(kāi)發(fā)中,可能會(huì)遇到需要判斷兩個(gè)集合是否相等的需求,那么本文就來(lái)詳細(xì)講解一下幾種實(shí)現(xiàn)方法,需要的朋友可以參考下
    2023-08-08
  • java如何實(shí)現(xiàn)自動(dòng)生成數(shù)據(jù)庫(kù)設(shè)計(jì)文檔

    java如何實(shí)現(xiàn)自動(dòng)生成數(shù)據(jù)庫(kù)設(shè)計(jì)文檔

    以前我們還需要手寫(xiě)數(shù)據(jù)庫(kù)設(shè)計(jì)文檔、現(xiàn)在可以通過(guò)引入screw核心包來(lái)實(shí)現(xiàn)Java?數(shù)據(jù)庫(kù)文檔一鍵生成。本文將具體介紹一下如何通過(guò)java自動(dòng)生成數(shù)據(jù)庫(kù)設(shè)計(jì)文檔,需要的朋友可以參考下
    2021-11-11
  • Java內(nèi)存各部分OOM出現(xiàn)原因及解決方法(必看)

    Java內(nèi)存各部分OOM出現(xiàn)原因及解決方法(必看)

    下面小編就為大家?guī)?lái)一篇Java內(nèi)存各部分OOM出現(xiàn)原因及解決方法(必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Spring MVC中基于自定義Editor的表單數(shù)據(jù)處理技巧分享

    Spring MVC中基于自定義Editor的表單數(shù)據(jù)處理技巧分享

    Spring MVC中基于自定義Editor的表單數(shù)據(jù)處理技巧。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-12-12
  • Java 在PPT中添加混合圖表過(guò)程詳解

    Java 在PPT中添加混合圖表過(guò)程詳解

    這篇文章主要介紹了Java 在PPT中添加混合圖表過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • hashMap擴(kuò)容時(shí)應(yīng)該注意這些死循環(huán)問(wèn)題

    hashMap擴(kuò)容時(shí)應(yīng)該注意這些死循環(huán)問(wèn)題

    今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著hashMap擴(kuò)容時(shí)的死循環(huán)問(wèn)題展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • java設(shè)計(jì)模式之委派模式原理分析

    java設(shè)計(jì)模式之委派模式原理分析

    這篇文章主要介紹了java設(shè)計(jì)模式之委派模式原理分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • WebFlux 服務(wù)編排使用優(yōu)勢(shì)詳解

    WebFlux 服務(wù)編排使用優(yōu)勢(shì)詳解

    這篇文章主要為大家介紹了WebFlux 服務(wù)編排使用優(yōu)勢(shì)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05

最新評(píng)論

通许县| 江都市| 宁强县| 普洱| 云和县| 恭城| 宣武区| 泰顺县| 盐山县| 临西县| 松潘县| 江川县| 永吉县| 洪江市| 南木林县| 威远县| 留坝县| 宣化县| 沂源县| 治多县| 商水县| 蓬溪县| 石渠县| 肥东县| 湟源县| 香港| 临漳县| 金平| 云南省| 乌鲁木齐市| 麻阳| 黄山市| 东乌珠穆沁旗| 九台市| 甘孜县| 房产| 西华县| 贵阳市| 香港 | 东乌珠穆沁旗| 容城县|