SpringCloud Stream消息驅動概述

SpringCloud Stream官網鏈接~

什麼是SpringCloud Stream:

官方定義Spring Cloud Stream是一個構建消息驅動微服務的框架。
應用程序通過inputs或者outputs來與Spring Cloud Stream中binder對象交互。通過我們配置來binding(綁定),而Spring Cloud Stream的binder對象負責與消息中間件交互。所以,我們只需要搞清楚如何與Spring Cloud Stream交互就可以方便使用消息驅動的方式。通過使用Spring Integration來連接消息代理中間件以實現消息事件驅動。
Spring Cloud Stream爲一些供應商的消息中間件產品提供了個性化的自動化配置實現,引用了發佈-訂閱、消費組、分區的三個核心概念。目前僅支持RabbitMQ、Kafka.

Spring Cloud Stream是用於構建與共享消息傳遞系統連接的高度可伸縮的事件驅動微服務框架,該框架提供了一個靈活的編程模型,它建立在已經建立和熟悉的Spring熟語和最佳實踐上,包括支持持久化的發佈/訂閱、消費組以及消息分區這三個核心概念。

總之一句話就是:屏蔽底層消息中間件的差異,降低切換成本,統一消息的編程模型

爲什麼使用SpringCloud Stream:

目前市面上流行的中間件MQ有:ActiveMQ、RabbitMQ、RocketMQ、Kafka這四種,這些MQ使用也會存在一定的差異,有時候項目中會使用到兩種等多種組合。這些中間件的差異性導致我們實際項目開發給我們造成了一定的困擾, 我們如果用了兩個消息隊列的其中一種,後面的業務需求,我想往另外一種消息隊列進行遷移,這時候無疑就是一個災難性的, 一大堆東西都要重新推倒重新做,因爲它跟我們的系統耦合了,這時候springcloud Stream給我們提供了一種解耦合的方式。讓我們不再關注具體MQ的細節,我們只需要用一種適配綁定的方式,自動的給我們在各種MQ內切換。

設計思想:

在沒引入Spring Cloud Stream之前,標準的MQ是這樣的:

  • 生產者/消費者之間靠消息媒介傳遞信息內容 :  Message
  • 消息必須走特定的通道:  消息通道MessageChannel
  • 消息通道里的消息如何被消費呢,誰負責收發處理: 消息通道MessageChannel的子接口SubscribableChannel,由MessageHandler消息處理器訂閱

在沒有綁定器這個概念的情況下,我們的SpringBoot應用要直接與消息中間件進行信息交互的時候,由於各消息中間件構建的初衷不同,它們的實現細節上會有較大的差異性,通過定義綁定器作爲中間層,完美地實現了應用程序與消息中間件細節之間的隔離
通過嚮應用程序暴露統一的Channel通道, 使得應用程序不需要再考慮各種不同的消息中間件實現。

Stream對消息中間件的進一步封裝可以做到代碼層面對中間件的無感知,甚至於動態的切換中間件(rabbitmq切換爲kafka),使得微服務開發的高度解耦,服務可以關注更多自己的業務流程

通過定義綁定器Binder作爲中間層,實現了應用程序與消息中間件細節之間的隔離。

Binder:

  • INPUT對應於消費者
  • OUTPUT對應於生產者

 

Stream中的消息通信方式遵循了發佈-訂閱模式:

  • Topic主題進行廣播
    • 在RabbitMQ就是Exchange交換機
    •  在kafka中就是Topic主題

 

Spring Cloud Stream 的標準流程套路:

  • Binder
    •  很方便的連接中間件,屏蔽差異
  • Channel
    • 通道,是隊列Queue的一種抽象,在消息通訊系統中就是實現存儲和轉發的媒介,通過對Channel對隊列進行配置
  • Source和Sink
    •     簡單的可理解爲參照對象是Spring Cloud Stream自身,從Stream發佈消息就是輸出,接受消息就是輸入

針對於上圖下面列出以下編碼API和常用註解

組成 說明
Middleware 中間件,目前只支持RabbitMQ和Kafka
Binder Binder是應用與消息中間件之間的封裝,目前實行了Kafka和RabbitMQ的Binder,通過Binder可以很方便的連接中間件,可以動態的改變消息類型(對應於Kafka的topic,RabbitMQ的exchange),這些都可以通過配置文件來實現
@Input 註解標識輸入通道,通過該輸入通道接收到的消息進入應用程序
@Output 註解標識輸出通道,發佈的消息將通過該通道離開應用程序
@StreamListener 監聽隊列, 用於消費者的隊列的消息接收
@EnableBinding 指信道channel和exchange綁定在一起

 

Spring Cloud Stream 消息驅動 介紹到此就結束了,後面會有一個案例進行環境搭建演示,案例包含:RabbitMQ、steam8801消息提供者、stream8802消息消費者、stream8803消息消費者,還會演示 消息重複消費,分組消費和消息持久化的情況~

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章