溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

什么是消息驅(qū)動(dòng)微服務(wù)框架

發(fā)布時(shí)間:2021-10-20 16:16:01 來源:億速云 閱讀:282 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“什么是消息驅(qū)動(dòng)微服務(wù)框架”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“什么是消息驅(qū)動(dòng)微服務(wù)框架”吧!

Spring Cloud Stream 簡介

官方定義Spring Cloud Stream  是一個(gè)用來為微服務(wù)應(yīng)用構(gòu)建消息驅(qū)動(dòng)能力的框架。它為一些供應(yīng)商的消息中間件產(chǎn)品提供了個(gè)性化的自動(dòng)化配置實(shí)現(xiàn),并且引入了發(fā)布-訂閱、消費(fèi)組以及分區(qū)這三個(gè)核心概念。

Spirng Cloud Stream 本質(zhì)上就是整合了 Spring Boot 和 Spring  Integration,實(shí)現(xiàn)一套輕量級的消息驅(qū)動(dòng)的微服務(wù)框架。

通過使用 Spring Cloud Stream  可以有效簡化開發(fā)人員對消息中間件的使用復(fù)雜度,讓系統(tǒng)開發(fā)人員可以有更多的精力關(guān)注于核心業(yè)務(wù)邏輯的處理。

Spring Cloud Stream 基于 Spring Boot 實(shí)現(xiàn),所以它秉承了 Spring Boot  的優(yōu)點(diǎn),自動(dòng)化配置功能可以幫助我們快速上手使用。

不過 Spring Cloud Stream 目前只支持 RabbitMQ 和 Kafka 這兩個(gè)消息中間件的自動(dòng)化配置。

相關(guān)知識點(diǎn)解讀

「1. 什么是事件驅(qū)動(dòng)架構(gòu)?」

什么是消息驅(qū)動(dòng)微服務(wù)框架

如上圖所示,有時(shí)候系統(tǒng)中的某個(gè)服務(wù)會因?yàn)橛脩舨僮骰騼?nèi)部行為發(fā)布一個(gè)事件,該服務(wù)知道這個(gè)事件在將來的某一個(gè)時(shí)間點(diǎn)會被其他服務(wù)所消費(fèi),但是并不知道這個(gè)服務(wù)具體是誰、也不關(guān)心什么時(shí)候被消費(fèi)。同樣,消費(fèi)該事件的服務(wù)也不一定需要知道該事件是由哪個(gè)服務(wù)所發(fā)布。

事件生產(chǎn)者和消費(fèi)者之間的虛線代表的是一種相互松散、沒有直接調(diào)用的關(guān)聯(lián)關(guān)系。滿足以上特性的系統(tǒng)代表著一種松耦合的架構(gòu),通常被稱為事件驅(qū)動(dòng)架構(gòu),而這里的事件也可以被理解是服務(wù)與服務(wù)之間發(fā)送的一種消息。事件驅(qū)動(dòng)架構(gòu)本質(zhì)上是一種架構(gòu)設(shè)計(jì)風(fēng)格,實(shí)現(xiàn)方法和工具有很多。在  Spring Cloud 家族中這個(gè)工具就是 Spring Cloud Stream。

其實(shí),Spring Cloud Stream 是基于 Spring Integration  實(shí)現(xiàn)了消息發(fā)布和消費(fèi)機(jī)制并提供了一層封裝,很多關(guān)于消息發(fā)布和消費(fèi)的概念和實(shí)現(xiàn)方法本質(zhì)上都是依賴于 Spring Integration。而在 Spring  Integration 的背后,則依賴于 Spring Messaging 組件來實(shí)現(xiàn)消息處理機(jī)制的基礎(chǔ)設(shè)施。

「2. 什么是 Spring Messaging?」

Spring Messaging 是 Spring Framework 中的一個(gè)模塊,其作用就是統(tǒng)一消息的編程模型。

每一個(gè)消息 Messaging 對應(yīng)的模型就包括一個(gè)消息體 Payload 和消息頭 Header。

什么是消息驅(qū)動(dòng)微服務(wù)框架

package org.springframework.messaging; public interface Message { T getPayload(); MessageHeaders getHeaders();  }

消息通道 MessageChannel 用于接收消息,調(diào)用 send 方法可以將消息發(fā)送至該消息通道中。

什么是消息驅(qū)動(dòng)微服務(wù)框架

@FunctionalInterface  public interface MessageChannel {  long INDEFINITE_TIMEOUT = -1;  default boolean send(Message<?> message) {    return send(message, INDEFINITE_TIMEOUT);  }  boolean send(Message<?> message, long timeout);  }

「消息通道里的消息如何被消費(fèi)呢?」

由消息通道的子接口可訂閱的消息通道 SubscribableChannel 實(shí)現(xiàn),被 MessageHandler 消息處理器所訂閱:

public interface SubscribableChannel extends MessageChannel {  boolean subscribe(MessageHandler handler);  boolean unsubscribe(MessageHandler handler);  }

由MessageHandler 真正地消費(fèi)/處理消息:

@FunctionalInterface  public interface MessageHandler {  void handleMessage(Message<?> message) throws MessagingException;  }

Spring Messaging 內(nèi)部在消息模型的基礎(chǔ)上衍生出了其它的一些功能,如:

  • 消息接收參數(shù)及返回值處理:消息接收參數(shù)處理器 HandlerMethodArgumentResolver 配合 @Header, @Payload  等注解使用;消息接收后的返回值處理器 HandlerMethodReturnValueHandler 配合 @SendTo 注解使用;

  • 消息體內(nèi)容轉(zhuǎn)換器 MessageConverter;

  • 統(tǒng)一抽象的消息發(fā)送模板 AbstractMessageSendingTemplate;

  • 消息通道攔截器 ChannelInterceptor;

「3.什么是Spring Integration?」

spring cloud stream是一個(gè)構(gòu)建與Spring Boot和Spring  Integration之上的框架,方便開發(fā)人員快速構(gòu)建基于Message-Driven的系統(tǒng)。

Spring Integration & Enterprise Integration Patterns簡介

Enterprise Integration Patterns 是由Gregor Hohpe和Bobby Woolf在 Enterprise  Integration Patterns 一書中總結(jié)的企業(yè)應(yīng)用開發(fā)實(shí)踐中使用到的各系統(tǒng)間數(shù)據(jù)交換的方式。

Spring Integration是Spring框架對Enterprise Integration Patterns的實(shí)現(xiàn)和適配。

Spring  Integration在基于Spring的應(yīng)用程序中實(shí)現(xiàn)輕量級消息傳遞,并支持通過聲明適配器與外部系統(tǒng)集成。與Spring對遠(yuǎn)程處理,消息傳遞和調(diào)度的支持相比,這些適配器提供了更高級別的抽象。

Spring  Integration的主要目標(biāo)是提供一個(gè)簡單的模型來構(gòu)建企業(yè)集成解決方案,同時(shí)保持關(guān)注點(diǎn)的分離,這對于生成可維護(hù)的可測試代碼至關(guān)重要。

常見的企業(yè)集成數(shù)據(jù)傳遞模式有以下幾種:

文件傳輸:系統(tǒng)A采用FTP輪詢等方式獲取系統(tǒng)B生成的文件等。

共享數(shù)據(jù)庫:系統(tǒng)A和系統(tǒng)B共用一個(gè)數(shù)據(jù)庫表,共用實(shí)體類。

RPC調(diào)用:系統(tǒng)A和B暴露互相之間能調(diào)用的服務(wù),例如SOAP、REST。

消息傳遞:系統(tǒng)A和系統(tǒng)B通過消息中間價(jià)交換數(shù)據(jù)。

Spring Cloud Stream 作用

無感知的使用消息中間件

Spring Cloud Stream解決了開發(fā)人員無感知的使用消息中間件的問題,因?yàn)镾pring Cloud  Stream對消息中間件的進(jìn)一步封裝,可以做到代碼層面對中間件的無感知。

中間件和服務(wù)的高度解耦

Spring Cloud  Stream進(jìn)行了配置隔離,只需要調(diào)整配置,開發(fā)中可以動(dòng)態(tài)的切換中間件(如rabbitmq切換為kafka),使得微服務(wù)開發(fā)的高度解耦,服務(wù)可以關(guān)注更多自己的業(yè)務(wù)流程。

Spring Cloud Stream 核心概念和應(yīng)用模型

「主要概念」

Spring Cloud Stream 為各大消息中間件產(chǎn)品提供了個(gè)性化的自動(dòng)化配置實(shí)現(xiàn),引用了發(fā)布-訂閱、消費(fèi)組、分區(qū)的三個(gè)核心概念。

Spring Cloud Stream提供了很多抽象和基礎(chǔ)組件來簡化消息驅(qū)動(dòng)型微服務(wù)應(yīng)用。包含以下內(nèi)容:

  • Spring Cloud Stream的應(yīng)用模型

  • 綁定抽象

  • 持久化發(fā)布/訂閱支持

  • 消費(fèi)者組支持

  • 分片支持(Partitioning Support)

  • 可插拔API

「應(yīng)用模型」

什么是消息驅(qū)動(dòng)微服務(wù)框架

Spring Cloud Stream由一個(gè)中立的中間件內(nèi)核組成。

Spring Cloud  Stream會注入輸入和輸出的channels,應(yīng)用程序通過這些channels與外界通信,而channels則是通過一個(gè)明確的中間件Binder與外部brokers連接。

「Channel」

Channel描述的是消息從應(yīng)用程序和Binder之間的流通的通道,也就是Application Model中的input和output。

「Binder」

Binder是Spring Cloud  Stream中一個(gè)非常重要的概念,它是應(yīng)用程序和消息中間件的中間層,完美屏蔽了不同消息中間件的實(shí)現(xiàn)差異,可以簡單的類比為Adapter。

Spring Cloud  Stream官方提供了spring-cloud-stream-binder-kafka和spring-cloud-stream-binder-rabbit兩款主流消息中間件的Binder實(shí)現(xiàn)。并且還提供了專門用于測試的TestSupportBinder,開發(fā)者可以直接使用它來對通道的接收內(nèi)容進(jìn)行斷言測試。

當(dāng)然,Spring Cloud  Stream也允許開發(fā)者通過它的SPI來實(shí)現(xiàn)其他MQ的Binder。目前已有多款MQ產(chǎn)品提供了第三方Binder實(shí)現(xiàn),參考官方文檔Binder  Implementions。如要實(shí)現(xiàn)自己的Binder可以參考官方文檔Binder SPI。

「Bindings」

Binding是用于描述MQ中間件到應(yīng)用程序的橋梁模型,即是對于Binder加上inputs和outputs各個(gè)channel的綁定關(guān)系的描述

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

Spring Cloud Stream提供對Kafka,Rabbit MQ,Redis,和Gemfire的Binder實(shí)現(xiàn)。Spring Cloud  Stream還包括了一個(gè)TestSupportBinder,TestSupportBinder預(yù)留一個(gè)未更改的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>

「分區(qū)支持」

Spring Cloud  Stream支持在一個(gè)應(yīng)用程序的多個(gè)實(shí)例之間數(shù)據(jù)分區(qū),在分區(qū)的情況下,物理通信介質(zhì)(例如,topic代理)被視為多分區(qū)結(jié)構(gòu)。一個(gè)或多個(gè)生產(chǎn)者應(yīng)用程序?qū)嵗龑?shù)據(jù)發(fā)送給多個(gè)消費(fèi)應(yīng)用實(shí)例,并保證共同的特性的數(shù)據(jù)由相同的消費(fèi)者實(shí)例處理。

Spring Cloud  Stream提供了一個(gè)通用的抽象,用于統(tǒng)一方式進(jìn)行分區(qū)處理,因此分區(qū)可以用于自帶分區(qū)的代理(如kafka)或者不帶分區(qū)的代理(如rabbiemq)

分區(qū)在有狀態(tài)處理中是一個(gè)很重要的概念,其重要性體現(xiàn)在性能和一致性上,要確保所有相關(guān)數(shù)據(jù)被一并處理,例如,在時(shí)間窗平均計(jì)算的例子中,給定傳感器測量結(jié)果應(yīng)該都由同一應(yīng)用實(shí)例進(jìn)行計(jì)算。

感謝各位的閱讀,以上就是“什么是消息驅(qū)動(dòng)微服務(wù)框架”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對什么是消息驅(qū)動(dòng)微服務(wù)框架這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI