您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關如何在Spring生態中玩轉RocketMQ,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
RocketMQ 作為業務消息的首選,在消息和流處理領域被廣泛應用。而微服務生態 Spring 框架也是業務開發中最受歡迎的框架,兩者的完美契合使得 RocketMQ 成為 Spring Messaging 實現中最受歡迎的消息實現。下面展示了 5 種在 Spring 生態中文玩轉 RocketMQ 的方式,并描述了每個項目的特點和使用場景。文末可以直達在線體驗。
上世紀 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 等模塊,涉及開發的各個領域。
2014 年 4 月 1 日,Spring Boot 1.0.0 正式發布。它基于“約定大于配置”(Convention over configuration)這一理念來快速地開發,測試,運行和部署 Spring 應用,并能通過簡單地與各種啟動器(如 spring-boot-web-starter)結合,讓應用直接以命令行的方式運行,不需再部署到獨立容器中。Spring Boot 的出現可以說是 Spring 框架的第二春,它不但簡化了開發的流程,目前更是事實標準。下面這幅圖可以看出相同功能的 Spring 和 Spring Boot 的代碼實現對比。
Apache RocketMQ 是一款是業界知名的分布式消息和流處理中間件,它主要功能是消息分發、異步解耦、削峰填谷等。RocketMQ 是一款金融級消息及流數據平臺,RocketMQ 在交易、支付鏈路上用的很多,主要是對消息鏈路質量要求非常高的場景,能夠支持萬億級消息洪峰。RocketMQ 在業務消息中被廣泛應用,并衍生出順序消息、事務消息、延遲消息等匹配各類業務場景的特殊消息。
本文的主角就是 Spring 和 RocketMQ,那幾乎每個 Java 程序員都會使用 Spring 框架與支持豐富業務場景的 RocketMQ 會碰撞出怎么樣的火花?
在介紹 RocketMQ 與 Spring 故事之前,不得不提到 Spring 中的兩個關于消息的框架,Spring Messaging 和 Spring Cloud Stream。它們都能夠與 Spring Boot 整合并提供了一些參考的實現。和所有的實現框架一樣,消息框架的目的是實現輕量級的消息驅動的微服務,可以有效地簡化開發人員對消息中間件的使用復雜度,讓系統開發人員可以有更多的精力關注于核心業務邏輯的處理。
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 的自動化選項和一些定制化的屬性。
在 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 生態中最活躍的消息項目。
Spring Cloud Stream 結合了 Spring Integration 的注解和功能,它的應用模型如下:
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、Spring Cloud Stream RocketMQ Binder、Spring Cloud Bus RocketMQ、Spring Data Flow 和 Spring Cloud Function。它們之間的關系可以如下圖表示。
如何在實際業務開發中選擇相應項目進行使用?下面分別列出每個項目的特點和使用場景。
特點:
作為起步依賴,簡單引入一個包就能在 Spring 生態用到 RocketMQ 客戶端的所有功能。
利用了大量自動配置和注解簡化了編程模型,并且支持 Spring Messaging API。
與 RocketMQ 原生 Java SDK 的功能完全對齊。
使用場景:
適合在 Spring Boot 中使用 RocketMQ 的用戶,希望能用到 RocketMQ 原生 java 客戶端的所有功能,并通過 Spring 注解和自動配置簡化編程模型。
特點:
屏蔽底層 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等)。
特點:
將 RocketMQ 作為事件的“傳輸器”,通過發送事件(消息)到消息隊列上,從而廣播到訂閱該事件(消息)的所有節點上,完成事件的分發和通知。
使用場景:
在 Spring 生態中希望用 RocketMQ 做消息總線的用戶,可以用在應用間事件的通信,配置中心客戶端刷新等場景。
特點:
以 Source/Processor/Sink 組件進行流式任務處理。RocketMQ 作為流處理過程中的中間存儲組件。
使用場景:
流處理,大數據處理場景。
特點:
消息的消費/生產/處理都是一次函數調用,融合 Java 生態的 Function 模型。
使用場景:
Serverless 場景。
以上就是如何在Spring生態中玩轉RocketMQ,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。