如何在 Spring 生態中玩轉 RocketMQ?

頭圖.png

做者 | 通融、洛夜
來源 | 阿里巴巴雲原生公衆號java

RocketMQ 做爲業務消息的首選,在消息和流處理領域被普遍應用。而微服務生態 Spring 框架也是業務開發中最受歡迎的框架,二者的完美契合使得 RocketMQ 成爲 Spring Messaging 實現中最受歡迎的消息實現。本文展現了 5 種在 Spring 生態中文玩轉 RocketMQ 的方式,並描述了每一個項目的特色和使用場景。文末能夠直達在線體驗。git

前言

上世紀 90 年代末,隨着 Java EE(Enterprise Edition) 的出現,特別是 Enterprise Java Beans 的使用須要複雜的描述符配置和死板複雜的代碼實現,增長了廣大開發者的學習曲線和開發成本,由此基於簡單的 XML 配置和普通 Java 對象 (Plain Old Java Objects) 的 Spring 技術應運而生,依賴注入 (Dependency Injection),控制反轉 (Inversion of Control) 和麪向切面編程 (AOP) 的技術更加敏捷地解決了傳統 Java 企業及版本的不足。隨着 Spring 的持續演進,基於註解 (Annotation) 的配置逐漸取代了 XML 文件配置。除了依賴注入、控制翻轉、AOP 這些技術,Spring 後續衍生出 AMQP、Transactional、Security、Batch、Data Access 等模塊,涉及開發的各個領域。程序員

1.png

2014 年 4 月 1 日,Spring Boot 1.0.0 正式發佈。它基於「約定大於配置」(Convention over configuration)這一理念來快速地開發,測試,運行和部署 Spring 應用,並能經過簡單地與各類啓動器(如 spring-boot-web-starter)結合,讓應用直接以命令行的方式運行,不需再部署到獨立容器中。Spring Boot 的出現能夠說是 Spring 框架的第二春,它不但簡化了開發的流程,目前更是事實標準。下面這幅圖能夠看出相同功能的 Spring 和 Spring Boot 的代碼實現對比。github

2.png

Apache RocketMQ 是一款是業界知名的分佈式消息和流處理中間件,它主要功能是消息分發、異步解耦、削峯填谷等。RocketMQ 是一款金融級消息及流數據平臺,RocketMQ 在交易、支付鏈路上用的不少,主要是對消息鏈路質量要求很是高的場景,可以支持萬億級消息洪峯。RocketMQ 在業務消息中被普遍應用,並衍生出順序消息、事務消息、延遲消息等匹配各種業務場景的特殊消息。web

本文的主角就是 Spring 和 RocketMQ,那幾乎每一個 Java 程序員都會使用 Spring 框架與支持豐富業務場景的 RocketMQ 會碰撞出怎麼樣的火花?spring

RocketMQ 與 Spring 的碰撞

在介紹 RocketMQ 與 Spring 故事以前,不得不提到 Spring 中的兩個關於消息的框架,Spring Messaging 和 Spring Cloud Stream。它們都可以與 Spring Boot 整合並提供了一些參考的實現。和全部的實現框架同樣,消息框架的目的是實現輕量級的消息驅動的微服務,能夠有效地簡化開發人員對消息中間件的使用複雜度,讓系統開發人員能夠有更多的精力關注於核心業務邏輯的處理。apache

1. Spring Messaging

Spring Messaging 是 Spring Framework 4 中添加的模塊,是 Spring 與消息系統集成的一個擴展性的支持。它實現了從基於 JmsTemplate 的簡單的使用 JMS 接口到異步接收消息的一整套完整的基礎架構,Spring AMQP 提供了該協議所要求的相似的功能集。在與 Spring Boot 的集成後,它擁有了自動配置能力,可以在測試和運行時與相應的消息傳遞系統進行集成。編程

單純對於客戶端而言,Spring Messaging 提供了一套抽象的 API 或者說是約定的標準,對消息發送端和消息接收端的模式進行規定,好比消息 Messaging 對應的模型就包括一個消息體 Payload 和消息頭 Header。不一樣的消息中間件提供商能夠在這個模式下提供本身的 Spring 實現:在消息發送端須要實現的是一個 XXXTemplate 形式的 Java Bean,結合 Spring Boot 的自動化配置選項提供多個不一樣的發送消息方法;在消息的消費端是一個 XXXMessageListener 接口(實現方式一般會使用一個註解來聲明一個消息驅動的 POJO),提供回調方法來監聽和消費消息,這個接口一樣可使用 Spring Boot 的自動化選項和一些定製化的屬性。架構

3.png

在 Apache RocketMQ 生態中,RocketMQ-Spring-Boot-Starter(下文簡稱 RocketMQ-Spring)就是一個支持 Spring Messaging API 標準的項目。該項目把 RocketMQ 的客戶端使用 Spring Boot 的方式進行了封裝,可讓用戶經過簡單的 annotation 和標準的 Spring Messaging API 編寫代碼來進行消息的發送和消費,也支持擴展出 RocketMQ 原生 API 來支持更加豐富的消息類型。在 RocketMQ-Spring 畢業初期,RocketMQ 社區同窗請 Spring 社區的同窗對 RocketMQ-Spring 代碼進行 review,引出一段羅美琪(RocketMQ)和春波特(Spring Boot)故事的佳話,著名 Spring 佈道師 Josh Long 向國外同窗介紹如何使用 RocketMQ-Spring 收發消息。RocketMQ-Spring 也在短短兩年時間超越 Spring-Kafka 和 Spring-AMQP(注:二者均由 Spring 社區維護),成爲 Spring Messaging 生態中最活躍的消息項目。app

4.png

2. Spring Cloud Stream

Spring Cloud Stream 結合了 Spring Integration 的註解和功能,它的應用模型以下:

5.png

Spring Cloud Stream 框架中提供一個獨立的應用內核,它經過輸入 (@Input) 和輸出 (@Output) 通道與外部世界進行通訊,消息源端 (Source) 經過輸入通道發送消息,消費目標端 (Sink) 經過監聽輸出通道來獲取消費的消息。這些通道經過專用的 Binder 實現與外部代理鏈接。開發人員的代碼只須要針對應用內核提供的固定的接口和註解方式進行編程,而不須要關心運行時具體的 Binder 綁定的消息中間件。

在運行時,Spring Cloud Stream 可以自動探測並使用在 classpath 下找到的 Binder。這樣開發人員能夠輕鬆地在相同的代碼中使用不一樣類型的中間件:僅僅須要在構建時包含進不一樣的 Binder。在更加複雜的使用場景中,也能夠在應用中打包多個 Binder 並讓它本身選擇 Binder,甚至在運行時爲不一樣的通道使用不一樣的 Binder。 

Binder 抽象使得 Spring Cloud Stream 應用能夠靈活的鏈接到中間件,加之 Spring Cloud Stream 使用利用了 Spring Boot 的靈活配置配置能力,這樣的配置能夠經過外部配置的屬性和 Spring Boot 支持的任何形式來提供(包括應用啓動參數、環境變量和 application.yml 或者 application.properties 文件),部署人員能夠在運行時動態選擇通道鏈接 destination(例如,RocketMQ 的 topic 或者 RabbitMQ 的 exchange)。

Spring Cloud Stream 屏蔽了底層消息中間件的實現細節,但願以統一的一套 API 來進行消息的發送/消費,底層消息中間件的實現細節由各消息中間件的 Binder 完成。Spring 官方實現了 Rabbit binder 和 Kafka Binder。Spring Cloud Alibaba 實現了 RocketMQ Binder,其主要實現原理是把發送消息最終代理給了 RocketMQ-Spring 的 RocketMQTemplate,在消費端則內部會啓動 RocketMQ-Spring Consumer Container 來接收消息。以此爲基礎,Spring Cloud Alibaba 還實現了 Spring Cloud Bus RocketMQ, 用戶可使用 RocketMQ 做爲 Spring Cloud 體系內的消息總線,來鏈接分佈式系統的全部節點。經過 Spring Cloud Stream RocketMQ Binder,RocketMQ 能夠與 Spring Cloud 生態更好的結合。好比與 Spring Cloud Data Flow、Spring Cloud Funtion 結合,讓 RocketMQ 能夠在 Spring 流計算生態、Serverless(FaaS) 項目中被使用。

現在 Spring Cloud Stream RocketMQ Binder 和 Spring Cloud Bus RocketMQ 做爲 Spring Cloud Alibaba 的實現已登錄 Spring 的官網,Spring Cloud Alibaba 也成爲 Spring Cloud 最活躍的實現。

如何在 Spring 生態中選擇 RocketMQ 實現?

經過介紹 Spring 中的消息框架,介紹了以 RocketMQ 爲基礎與 Spring 消息框架結合的幾個項目,主要是 RocketMQ-Spring、Spring Cloud Stream RocketMQ Binder、Spring Cloud Bus RocketMQ、Spring Data Flow 和 Spring Cloud Function。它們之間的關係能夠以下圖表示。

6.png

如何在實際業務開發中選擇相應項目進行使用?下面分別列出每一個項目的特色和使用場景。

1. RocketMQ-Spring

特色:

  • 做爲起步依賴,簡單引入一個包就能在 Spring 生態用到 RocketMQ 客戶端的全部功能。

  • 利用了大量自動配置和註解簡化了編程模型,而且支持 Spring Messaging API。

  • 與 RocketMQ 原生 Java SDK 的功能徹底對齊。

使用場景:

  • 適合在 Spring Boot 中使用 RocketMQ 的用戶,但願能用到 RocketMQ 原生 java 客戶端的全部功能,並經過 Spring 註解和自動配置簡化編程模型。

2. Spring Cloud Stream RocketMQ Binder

特色:

  • 屏蔽底層 MQ 實現細節,上層 Spring Cloud Stream 的 API 是統一的。若是想從 Kafka 切到 RocketMQ,直接改個配置便可。

  • 與 Spring Cloud 生態整合更加方便。好比 Spring Cloud Data Flow,這上面的流計算都是基於 Spring Cloud Stream;Spring Cloud Bus 消息總線內部也是用的 Spring Cloud Stream。

  • Spring Cloud Stream 提供的註解,編程體驗都是很是棒。

使用場景:

  • 在代碼層面能徹底屏蔽底層消息中間件的用戶,而且但願能項目能更好的接入 Spring Cloud 生態(Spring Cloud Data Flow、Spring Cloud Funtcion等)。

3. Spring Cloud Bus RocketMQ

特色:

  • 將 RocketMQ 做爲事件的「傳輸器」,經過發送事件(消息)到消息隊列上,從而廣播到訂閱該事件(消息)的全部節點上,完成事件的分發和通知。

使用場景:

  • 在 Spring 生態中但願用 RocketMQ 作消息總線的用戶,能夠用在應用間事件的通訊,配置中心客戶端刷新等場景。

4. Spring Cloud Data Flow

特色:

  • 以 Source/Processor/Sink 組件進行流式任務處理。RocketMQ 做爲流處理過程當中的中間存儲組件。

使用場景:

  • 流處理,大數據處理場景。

5. Spring Cloud Function

特色:

  • 消息的消費/生產/處理都是一次函數調用,融合 Java 生態的 Function 模型。

使用場景:

  • Serverless 場景。

本文總體介紹了在 Spring 生態中接入 RockeMQ 的 5 種方法,讓各位開發者對幾種經典場景有宏觀的瞭解。後續會有專欄詳細介紹上述各個項目的具體使用方法和應用場景,真正地在 Spring 生態中玩轉 RocketMQ!

7.png

相關文章
相關標籤/搜索