官方文檔中文版!Spring Cloud Stream 快速入門

本文內容翻譯自官方文檔,spring-cloud-stream docs,對 Spring Cloud Stream的應用入門介紹。spring

1、Spring Cloud Stream 簡介

官方定義 Spring Cloud Stream 是一個構建消息驅動微服務的框架。編程

Spring Cloud Stream構建在SpringBoot之上,提供了Kafka,RabbitMQ等消息中間件的個性化配置,引入了發佈訂閱、消費組和分區的語義概念,有效的簡化了上層研發人員對MQ使用的複雜度,讓開發人員更多的精力投入到核心業務的處理。架構

在實際開發過程當中,服務與服務之間通訊常常會使用到消息中間件,而以往使用了哪一個中間件好比RabbitMQ,那麼該中間件和系統的耦合性就會很是高,若是咱們要替換爲Kafka那麼變更會比較大,使用Spring Cloud Stream來整合咱們的消息中間件,能夠下降系統和中間件的耦合性。框架

2、Spring Cloud Stream 解決什麼問題

無感知的使用消息中間件

Stream解決了開發人員無感知的使用消息中間件的問題,由於Stream對消息中間件的進一步封裝,能夠作到代碼層面對中間件的無感知。微服務

中間件和服務的高度解耦

Spring Cloud Stream進行了配置隔離,只須要調整配置,開發中能夠動態的切換中間件(如rabbitmq切換爲kafka),使得微服務開發的高度解耦,服務能夠關注更多本身的業務流程。性能

關注公衆號:架構進化論,得到第一手的技術資訊和原創文章url

3、核心概念和應用模型

主要概念

Spring Cloud Stream 爲各大消息中間件產品提供了個性化的自動化配置實現,引用了發佈-訂閱、消費組、分區的三個核心概念。spa

Spring Cloud Stream提供了不少抽象和基礎組件來簡化消息驅動型微服務應用。包含如下內容:.net

  • Spring Cloud Stream的應用模型
  • 綁定抽象
  • 持久化發佈/訂閱支持
  • 消費者組支持
  • 分片支持(Partitioning Support)
  • 可插拔API

應用模型

Spring Cloud Stream由一箇中立的中間件內核組成。Spring Cloud Stream會注入輸入和輸出的channels,應用程序經過這些channels與外界通訊,而channels則是經過一個明確的中間件Binder與外部brokers鏈接。翻譯

各大消息中間件的綁定抽象

Spring Cloud Stream提供對Kafka,Rabbit MQ,Redis,和Gemfire的Binder實現。Spring Cloud Stream還包括了一個TestSupportBinder,TestSupportBinder預留一個未更改的channel以便於直接地、可靠地和channels通訊。

集成Kafka

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-stream-binder-kafka</artifactId>
    </dependency>

集成RabbitMQ

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>

分區支持

Spring Cloud Stream支持在一個應用程序的多個實例之間數據分區,在分區的狀況下,物理通訊介質(例如,topic代理)被視爲多分區結構。一個或多個生產者應用程序實例將數據發送給多個消費應用實例,並保證共同的特性的數據由相同的消費者實例處理。

Spring Cloud Stream提供了一個通用的抽象,用於統一方式進行分區處理,所以分區能夠用於自帶分區的代理(如kafka)或者不帶分區的代理(如rabbiemq)

分區在有狀態處理中是一個很重要的概念,其重要性體如今性能和一致性上,要確保全部相關數據被一併處理,例如,在時間窗平均計算的例子中,給定傳感器測量結果應該都由同一應用實例進行計算。

4、編程模型

Spring Cloud Stream提供了一些預約義的註解,用於綁定輸入和輸出channels,以及如何監聽channels。

經過@EnableBinding觸發綁定

將@EnableBinding註解添加到應用的配置類,就能夠把一個spring應用轉換成Spring Cloud Stream應用,@EnableBinding註解自己就包含@Configuration註解,會觸發Spring Cloud Stream 基本配置。

@Import(...)
@Configuration
@EnableIntegration
public @interface EnableBinding {
    ...
    Class<?>[] value() default {};
}

@Input 與 @Output

一個Spring Cloud Stream應用能夠有任意數目的input和output通道,後者經過@Input和@Output註解在接口中定義。

@StreamListener

定義在方法中,被修飾的方法註冊爲消息中間件上數據流的事件監聽器,註解中屬性值對應了監聽的消息通道名。

Source,Sink和Processor

Spring Cloud Stream提供了三個開箱即用的預約義接口。
Source用於有單個輸出(outbound)通道的應用。

public interface Source {

  String OUTPUT = "output";

  @Output(Source.OUTPUT)
  MessageChannel output();

}

Sink用於有單個輸入(inbound)通道的應用。

public interface Sink {

  String INPUT = "input";

  @Input(Sink.INPUT)
  SubscribableChannel input();

}

Processor用於單個應用同時包含輸入和輸出通道的狀況。

public interface Processor extends Source, Sink {
}

5、Stream極簡實例

下面是一個很是簡單的 SpringBootApplication應用,經過依賴Spring Cloud Stream,從Input通道監聽消息而後返回應答到Output通道,只要添加配置文件就能夠應用。

@SpringBootApplication
@EnableBinding(Processor.class)
public class MyLoggerServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyLoggerServiceApplication.class, args);
    }

    @StreamListener(Processor.INPUT)
    @SendTo(Processor.OUTPUT)
    public LogMessage enrichLogMessage(LogMessage log) {
        return new LogMessage(String.format("[1]: %s", log.getMessage()));
    }
}

下面解釋下這個示例中相關注解的應用:

@EnableBinding聲明瞭這個應用程序綁定了2個通道:INPUT和OUTPUT。這2個通道是在接口Processor中定義的(Spring Cloud Stream默認設置)。全部通道都是配置在一個具體的消息中間件或綁定器中。
@StreamListener(Processor.INPUT)代表這裏在input中提取消息,而且處理。
@SendTo(Processor.OUTPUT)代表在output中返回消息。

總結

這篇文章根據Spring Cloud Stream的官方文檔,對Stream作了一個總體的介紹,包括設計目標,應用場景,業務模型以及對外開放的註解,後面我會經過一個實例,演示 Spring Cloud Stream 的應用。

相關文章
相關標籤/搜索