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