SpringCloud Stream 訊息驅動

2022-03-11 13:36:20 字數 2550 閱讀 6539

spring cloud stream 是乙個構建訊息微服務驅動的框架。可以遮蔽底層訊息中介軟體的差異,降低版本切換成本,統一訊息的程式設計模型,目前僅支援 rabbitmq 和 kafka。

生產者 / 消費者之間靠訊息媒介傳遞資訊內容,message

訊息必須走特定的通道,messagechannel

訊息通道裡的訊息如何被消費呢,誰負責收發處理?訊息通道messagechannel的子介面subscribablechannel,由訊息處理器messagehandler所訂閱

如果我們的專案中用到了 rabbitmq 和 kafka 兩種訊息中介軟體,由於它們的架構不同,對實際開發造成了一定困擾;或者用到了一種訊息中介軟體,隨著後面的業務需求需要向另一種訊息佇列遷移,這無疑是災難性的,會造成一大堆的改動,因為它們與系統耦合了,這時候 spring cloud stream 就可以為我們提供一種解耦的方式。

spring cloud stream 提供的解決方案是:通過定義繫結器 binder 作為中間層,實現了應用程式與訊息中介軟體細節之間的隔離。向應用程式暴露統一的 channel 通道,使得應用程式不需要再考慮各種訊息中介軟體的實現。

inputs 對應消費者,outputs 對應生產者

stream中的訊息通訊方式遵循了發布-訂閱模式,用 topic 主題進行廣播(在rabbitmq就是exchange,在kafka中就是topic)

binder:繫結器,很方便的連線中介軟體,遮蔽差異

channel:通道,是佇列 queue 的一種抽象,在訊息通訊系統中就是實現儲存與**的媒介,通過 channel 對佇列進行配置

source 和 sink:簡單理解就是參照物是 spring cloud stream 本身,從 stream 發布訊息就是輸出,接收訊息就是輸入

配置:

spring:

name: cloud-stream-provider

cloud:

stream:

binders: # 配置繫結的rabbitmq的服務資訊

defaultrabbit: # 表示定義的名稱,用於與binding整合

type: rabbit # 訊息元件的型別

environment:

spring:

rabbitmq:

host: localhost

port: 5672

username: guest

password: guest

bindings: # 服務的整合處理

output: # 這個名字是乙個通道的名字

destination: studyexchange # 表示要使用的exchange名稱定義

binder: defaultrabbit # 設定要繫結的訊息服務的具體設定

傳送訊息:

@enablebinding(source.class)

@slf4j

public class messageproviderimpl implements imessageprovider

}

配置與生產者一致,只需要把 output 改為 input

接收訊息:

@controller

@enablebinding(sink.class)

@slf4j

public class messagereceivecontroller ")

private string serverport;

@streamlistener(sink.input)

public void receivemessage(messagemessage)

}

舉個栗子,我們對訂單系統做了集群部署,消費者從 rabbitmq 中獲取訂單資訊,如果同乙個訂單被不同的服務都獲取到了,就會造成資料錯誤,為了避免這種情況,我們可以使用 stream 中的訊息分組來解決。

在 stream 中,處於同乙個組的多個消費者是競爭關係,就可以保證訊息只被乙個服務消費一次,而不同組是可以重複消費的。現在預設分組就是不同的,組流水號不一樣。

將不想產生重複消費的服務分為同乙個組即可

spring:

cloud:

stream:

bindings:

input:

group: groupa

如果我們的消費者因為種種原因宕機了,生產者此時傳送了訊息,沒有配置 group 屬性的消費者重新上線後無法接收到之前的訊息,而配置了 group 的消費者仍會接收到訊息,這就是持久化的效果

SpringCloud Stream訊息驅動概述

簡介 如果系統裡同時存在多種mq,可以使用使用cloud stream,只需要和stream互動就可以進行管理。一句話,遮蔽底層訊息中介軟體的差異,降低切換成本,統一訊息的程式設計模型 官網 中文手冊 官方定義springcloud stream是乙個構建訊息驅動微服務的框架 應用程式通過input...

SpringCloud Stream訊息驅動

遮蔽底層訊息中介軟體的差異,降低切換成本,統一訊息的程式設計模型。在沒有binder這個概念的情況下,springboot應用要直接與訊息中介軟體進行資訊互動的時候,由於各訊息中介軟體構建的初衷不同,他們的實現細節上有較大差異,通過定義binder作為中間層,完美實現了應用程式與訊息中介軟體細節之間...

springcloud stream訊息驅動

什麼是spring cloud stream?官方定義 spring cloud stream 是乙個構建 訊息驅動 微服務的框架。應用程式通過inputs或者outputs來與 spring cloud stream 中binder互動,通過我們配置來 binding 而 spring cloud...