SpringCloud進階:Spring Cloud Stream核心組件

?我的博客:程序員笑笑生,歡迎瀏覽博客!

?關注公眾號:"程序員笑笑生", 回復 "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)為中心,如下圖:

file

一 、 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。

以就是本期的分享,你還可以關注公眾號: 程序員笑笑生,關注更多精彩內容!

file

SpringCloud基礎教程(一)-微服務與SpringCloud

SpringCloud基礎教程(二)-服務發(fā)現(xiàn) Eureka

SpringCloud基礎教程(三)-Eureka進階

SpringCloud 基礎教程(四)-配置中心入門

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ā)布!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容