您好,登錄后才能下訂單哦!
這篇文章主要講解了“什么是消息驅動微服務框架”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“什么是消息驅動微服務框架”吧!
Spring Cloud Stream 簡介
官方定義Spring Cloud Stream 是一個用來為微服務應用構建消息驅動能力的框架。它為一些供應商的消息中間件產品提供了個性化的自動化配置實現,并且引入了發布-訂閱、消費組以及分區這三個核心概念。
Spirng Cloud Stream 本質上就是整合了 Spring Boot 和 Spring Integration,實現一套輕量級的消息驅動的微服務框架。
通過使用 Spring Cloud Stream 可以有效簡化開發人員對消息中間件的使用復雜度,讓系統開發人員可以有更多的精力關注于核心業務邏輯的處理。
Spring Cloud Stream 基于 Spring Boot 實現,所以它秉承了 Spring Boot 的優點,自動化配置功能可以幫助我們快速上手使用。
不過 Spring Cloud Stream 目前只支持 RabbitMQ 和 Kafka 這兩個消息中間件的自動化配置。
相關知識點解讀
「1. 什么是事件驅動架構?」
如上圖所示,有時候系統中的某個服務會因為用戶操作或內部行為發布一個事件,該服務知道這個事件在將來的某一個時間點會被其他服務所消費,但是并不知道這個服務具體是誰、也不關心什么時候被消費。同樣,消費該事件的服務也不一定需要知道該事件是由哪個服務所發布。
事件生產者和消費者之間的虛線代表的是一種相互松散、沒有直接調用的關聯關系。滿足以上特性的系統代表著一種松耦合的架構,通常被稱為事件驅動架構,而這里的事件也可以被理解是服務與服務之間發送的一種消息。事件驅動架構本質上是一種架構設計風格,實現方法和工具有很多。在 Spring Cloud 家族中這個工具就是 Spring Cloud Stream。
其實,Spring Cloud Stream 是基于 Spring Integration 實現了消息發布和消費機制并提供了一層封裝,很多關于消息發布和消費的概念和實現方法本質上都是依賴于 Spring Integration。而在 Spring Integration 的背后,則依賴于 Spring Messaging 組件來實現消息處理機制的基礎設施。
「2. 什么是 Spring Messaging?」
Spring Messaging 是 Spring Framework 中的一個模塊,其作用就是統一消息的編程模型。
每一個消息 Messaging 對應的模型就包括一個消息體 Payload 和消息頭 Header。
package org.springframework.messaging; public interface Message { T getPayload(); MessageHeaders getHeaders(); }
消息通道 MessageChannel 用于接收消息,調用 send 方法可以將消息發送至該消息通道中。
@FunctionalInterface public interface MessageChannel { long INDEFINITE_TIMEOUT = -1; default boolean send(Message<?> message) { return send(message, INDEFINITE_TIMEOUT); } boolean send(Message<?> message, long timeout); }
「消息通道里的消息如何被消費呢?」
由消息通道的子接口可訂閱的消息通道 SubscribableChannel 實現,被 MessageHandler 消息處理器所訂閱:
public interface SubscribableChannel extends MessageChannel { boolean subscribe(MessageHandler handler); boolean unsubscribe(MessageHandler handler); }
由MessageHandler 真正地消費/處理消息:
@FunctionalInterface public interface MessageHandler { void handleMessage(Message<?> message) throws MessagingException; }
Spring Messaging 內部在消息模型的基礎上衍生出了其它的一些功能,如:
消息接收參數及返回值處理:消息接收參數處理器 HandlerMethodArgumentResolver 配合 @Header, @Payload 等注解使用;消息接收后的返回值處理器 HandlerMethodReturnValueHandler 配合 @SendTo 注解使用;
消息體內容轉換器 MessageConverter;
統一抽象的消息發送模板 AbstractMessageSendingTemplate;
消息通道攔截器 ChannelInterceptor;
「3.什么是Spring Integration?」
spring cloud stream是一個構建與Spring Boot和Spring Integration之上的框架,方便開發人員快速構建基于Message-Driven的系統。
Spring Integration & Enterprise Integration Patterns簡介
Enterprise Integration Patterns 是由Gregor Hohpe和Bobby Woolf在 Enterprise Integration Patterns 一書中總結的企業應用開發實踐中使用到的各系統間數據交換的方式。
Spring Integration是Spring框架對Enterprise Integration Patterns的實現和適配。
Spring Integration在基于Spring的應用程序中實現輕量級消息傳遞,并支持通過聲明適配器與外部系統集成。與Spring對遠程處理,消息傳遞和調度的支持相比,這些適配器提供了更高級別的抽象。
Spring Integration的主要目標是提供一個簡單的模型來構建企業集成解決方案,同時保持關注點的分離,這對于生成可維護的可測試代碼至關重要。
常見的企業集成數據傳遞模式有以下幾種:
文件傳輸:系統A采用FTP輪詢等方式獲取系統B生成的文件等。
共享數據庫:系統A和系統B共用一個數據庫表,共用實體類。
RPC調用:系統A和B暴露互相之間能調用的服務,例如SOAP、REST。
消息傳遞:系統A和系統B通過消息中間價交換數據。
Spring Cloud Stream 作用
無感知的使用消息中間件
Spring Cloud Stream解決了開發人員無感知的使用消息中間件的問題,因為Spring Cloud Stream對消息中間件的進一步封裝,可以做到代碼層面對中間件的無感知。
中間件和服務的高度解耦
Spring Cloud Stream進行了配置隔離,只需要調整配置,開發中可以動態的切換中間件(如rabbitmq切換為kafka),使得微服務開發的高度解耦,服務可以關注更多自己的業務流程。
Spring Cloud Stream 核心概念和應用模型
「主要概念」
Spring Cloud Stream 為各大消息中間件產品提供了個性化的自動化配置實現,引用了發布-訂閱、消費組、分區的三個核心概念。
Spring Cloud Stream提供了很多抽象和基礎組件來簡化消息驅動型微服務應用。包含以下內容:
Spring Cloud Stream的應用模型
綁定抽象
持久化發布/訂閱支持
消費者組支持
分片支持(Partitioning Support)
可插拔API
「應用模型」
Spring Cloud Stream由一個中立的中間件內核組成。
Spring Cloud Stream會注入輸入和輸出的channels,應用程序通過這些channels與外界通信,而channels則是通過一個明確的中間件Binder與外部brokers連接。
「Channel」
Channel描述的是消息從應用程序和Binder之間的流通的通道,也就是Application Model中的input和output。
「Binder」
Binder是Spring Cloud Stream中一個非常重要的概念,它是應用程序和消息中間件的中間層,完美屏蔽了不同消息中間件的實現差異,可以簡單的類比為Adapter。
Spring Cloud Stream官方提供了spring-cloud-stream-binder-kafka和spring-cloud-stream-binder-rabbit兩款主流消息中間件的Binder實現。并且還提供了專門用于測試的TestSupportBinder,開發者可以直接使用它來對通道的接收內容進行斷言測試。
當然,Spring Cloud Stream也允許開發者通過它的SPI來實現其他MQ的Binder。目前已有多款MQ產品提供了第三方Binder實現,參考官方文檔Binder Implementions。如要實現自己的Binder可以參考官方文檔Binder SPI。
「Bindings」
Binding是用于描述MQ中間件到應用程序的橋梁模型,即是對于Binder加上inputs和outputs各個channel的綁定關系的描述
「各大消息中間件的綁定抽象」
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)
分區在有狀態處理中是一個很重要的概念,其重要性體現在性能和一致性上,要確保所有相關數據被一并處理,例如,在時間窗平均計算的例子中,給定傳感器測量結果應該都由同一應用實例進行計算。
感謝各位的閱讀,以上就是“什么是消息驅動微服務框架”的內容了,經過本文的學習后,相信大家對什么是消息驅動微服務框架這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。