?我的博客:程序員笑笑生,歡迎瀏覽博客!
?關注公眾號:"程序員笑笑生", 回復 "Spring Cloud"、"Spring Boot" 獲取 全套 視頻教程!時間有限!可掃描文章下方二維碼!
?上一章 SpringCloud 進階:-消息驅動Spring Cloud Stream當中,我們初始的了解Spring Cloud Stream和如何簡單的構建消息驅動的服務的。本章我們將了解一下Spring Cloud Stream的組件。
前言
?上文我們通過一個簡單的實例,利用Spring Cloud Stream實現(xiàn)了一個發(fā)布-訂閱的模型。從中我們很容易理解,Spring Cloud Stream有三個角色,分別是,消息發(fā)布者,消費者和消息通訊系統(tǒng)。
主要是以消息通訊系統(tǒng)為中心,如下圖:
一 、 Spring Cloud Stream核心組件
1、1 Binder
? Binder 是Spring Cloud Steram的一個重要的抽象,目前Spring Cloud Stream實現(xiàn)了面向Kafka和RabbitMQ的Binder。有了Binder有很方便的連接中間件了。Binder提供了消費者分組和消息分區(qū)的特性。
1、2 Channel
?即通道,是隊列Queue的一種抽象,在具體的消息通訊系統(tǒng)中,隊列作用就是實現(xiàn)存儲和轉發(fā)的媒介,我們通過Channel對隊列進行配置。
1、3 Source和Sink
?我們不是第一次看到Source和Sink了,簡單的可理解為輸入和輸出。注意:這里的參照對象是Spring Cloud Stream自身,從Stream發(fā)布消息就是輸出,接受消息就是輸入。
?在Spring Cloud Stream中,Source組件是使用一個POJO對象發(fā)布消息的,該對象需要序列化然后發(fā)布到Channel中,Sink反序列化POJO對象。在底層的處理機制上,需要借助Spring Integration這個企業(yè)服務總線的組件。
二 Spring Integration簡介
?Spring Integration的定位是一種企業(yè)服務總線 ESB(Enterprise Service Bus),在Spring Integration中,通道被抽象成兩種表現(xiàn)形式:PollableChannel和SubscribableChannel,都是繼承了MessageChannel:
MessageChannel
package org.springframework.messaging;
public interface MessageChannel {
long INDEFINITE_TIMEOUT = -1;
default boolean send(Message<?> message) {
return send(message, INDEFINITE_TIMEOUT);
}
boolean send(Message<?> message, long timeout);
}
PollableChannel:通過輪詢操作主動獲取消息,receive方法
public interface PollableChannel extends MessageChannel {
Message<?> receive();
Message<?> receive(long timeout);
}
SubscribableChannel 發(fā)布/訂閱模式 ,通過回調函數(shù)MessageHandler實現(xiàn)事件響應:
public interface SubscribableChannel extends MessageChannel {
boolean subscribe(MessageHandler handler);
boolean unsubscribe(MessageHandler handler);
}
三 、Spring Cloud Stream和Spring Integration
?結合了Integration,我們就更容易理解Source和Sink了,Source和Sink都是接口,Source定義如下,通過MessageChannel發(fā)送消息,@Output定義了一個輸出通道,消息通過該通道離開應用:
public interface Source {
String OUTPUT = "output";
@Output(Source.OUTPUT)
MessageChannel output();
}
?同樣Sink接口,通過SubscribableChannel實現(xiàn)消息的接受,@Input注解定義了一個輸入通道,接受來自外部的消息:
public interface Sink {
String INPUT = "input";
@Input(Sink.INPUT)
SubscribableChannel input();
}
@Input和@Output可以使用通道名稱作為參數(shù),沒有名稱,默認是方法名稱,也就是"input"、"output",一個SpringCloudStream應用程序,可以存在任意數(shù)量的Input和Output通道。
總結
?本章著重的介紹了Spring Cloud Stream的核心組件,以及Spring Integration的簡介,這樣有利于更好的理解Spring Cloud Stream。
以就是本期的分享,你還可以關注公眾號: 程序員笑笑生,關注更多精彩內容!
SpringCloud基礎教程(一)-微服務與SpringCloud
SpringCloud基礎教程(二)-服務發(fā)現(xiàn) Eureka
SpringCloud基礎教程(五)-配置中心熱生效和高可用
SpringCloud 基礎教程(六)-負載均衡Ribbon
SpringCloud 基礎教程(七)-Feign聲明式服務調用
SpringCloud 基礎教程(八)-Hystrix熔斷器(上)
SpringCloud 基礎教程(九)-Hystrix服務監(jiān)控(下)
SpringCloud 基礎教程(十)-Zull服務網(wǎng)關
SpringCloud 基礎教程(十一)- Sleuth 調用鏈追蹤簡介
SpringCloud 基礎教程(十二)-Zipkin 分布式鏈路追蹤系統(tǒng)搭建
SpringCloud 進階: 消息驅動(入門) Spring Cloud Stream【Greenwich.SR3】
更多精彩內容,請期待...
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布!