本篇文章給大家分享的是有關(guān)如何在Spring生態(tài)中玩轉(zhuǎn)RocketMQ,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、做網(wǎng)站服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)荔城免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了成百上千企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
RocketMQ 作為業(yè)務(wù)消息的首選,在消息和流處理領(lǐng)域被廣泛應(yīng)用。而微服務(wù)生態(tài) Spring 框架也是業(yè)務(wù)開發(fā)中最受歡迎的框架,兩者的完美契合使得 RocketMQ 成為 Spring Messaging 實現(xiàn)中最受歡迎的消息實現(xiàn)。下面展示了 5 種在 Spring 生態(tài)中文玩轉(zhuǎn) RocketMQ 的方式,并描述了每個項目的特點和使用場景。文末可以直達(dá)在線體驗。
上世紀(jì) 90 年代末,隨著 Java EE(Enterprise Edition) 的出現(xiàn),特別是 Enterprise Java Beans 的使用需要復(fù)雜的描述符配置和死板復(fù)雜的代碼實現(xiàn),增加了廣大開發(fā)者的學(xué)習(xí)曲線和開發(fā)成本,由此基于簡單的 XML 配置和普通 Java 對象 (Plain Old Java Objects) 的 Spring 技術(shù)應(yīng)運而生,依賴注入 (Dependency Injection),控制反轉(zhuǎn) (Inversion of Control) 和面向切面編程 (AOP) 的技術(shù)更加敏捷地解決了傳統(tǒng) Java 企業(yè)及版本的不足。隨著 Spring 的持續(xù)演進(jìn),基于注解 (Annotation) 的配置逐漸取代了 XML 文件配置。除了依賴注入、控制翻轉(zhuǎn)、AOP 這些技術(shù),Spring 后續(xù)衍生出 AMQP、Transactional、Security、Batch、Data Access 等模塊,涉及開發(fā)的各個領(lǐng)域。
2014 年 4 月 1 日,Spring Boot 1.0.0 正式發(fā)布。它基于“約定大于配置”(Convention over configuration)這一理念來快速地開發(fā),測試,運行和部署 Spring 應(yīng)用,并能通過簡單地與各種啟動器(如 spring-boot-web-starter)結(jié)合,讓應(yīng)用直接以命令行的方式運行,不需再部署到獨立容器中。Spring Boot 的出現(xiàn)可以說是 Spring 框架的第二春,它不但簡化了開發(fā)的流程,目前更是事實標(biāo)準(zhǔn)。下面這幅圖可以看出相同功能的 Spring 和 Spring Boot 的代碼實現(xiàn)對比。
Apache RocketMQ 是一款是業(yè)界知名的分布式消息和流處理中間件,它主要功能是消息分發(fā)、異步解耦、削峰填谷等。RocketMQ 是一款金融級消息及流數(shù)據(jù)平臺,RocketMQ 在交易、支付鏈路上用的很多,主要是對消息鏈路質(zhì)量要求非常高的場景,能夠支持萬億級消息洪峰。RocketMQ 在業(yè)務(wù)消息中被廣泛應(yīng)用,并衍生出順序消息、事務(wù)消息、延遲消息等匹配各類業(yè)務(wù)場景的特殊消息。
本文的主角就是 Spring 和 RocketMQ,那幾乎每個 Java 程序員都會使用 Spring 框架與支持豐富業(yè)務(wù)場景的 RocketMQ 會碰撞出怎么樣的火花?
在介紹 RocketMQ 與 Spring 故事之前,不得不提到 Spring 中的兩個關(guān)于消息的框架,Spring Messaging 和 Spring Cloud Stream。它們都能夠與 Spring Boot 整合并提供了一些參考的實現(xiàn)。和所有的實現(xiàn)框架一樣,消息框架的目的是實現(xiàn)輕量級的消息驅(qū)動的微服務(wù),可以有效地簡化開發(fā)人員對消息中間件的使用復(fù)雜度,讓系統(tǒng)開發(fā)人員可以有更多的精力關(guān)注于核心業(yè)務(wù)邏輯的處理。
Spring Messaging 是 Spring Framework 4 中添加的模塊,是 Spring 與消息系統(tǒng)集成的一個擴展性的支持。它實現(xiàn)了從基于 JmsTemplate 的簡單的使用 JMS 接口到異步接收消息的一整套完整的基礎(chǔ)架構(gòu),Spring AMQP 提供了該協(xié)議所要求的類似的功能集。在與 Spring Boot 的集成后,它擁有了自動配置能力,能夠在測試和運行時與相應(yīng)的消息傳遞系統(tǒng)進(jìn)行集成。
單純對于客戶端而言,Spring Messaging 提供了一套抽象的 API 或者說是約定的標(biāo)準(zhǔn),對消息發(fā)送端和消息接收端的模式進(jìn)行規(guī)定,比如消息 Messaging 對應(yīng)的模型就包括一個消息體 Payload 和消息頭 Header。不同的消息中間件提供商可以在這個模式下提供自己的 Spring 實現(xiàn):在消息發(fā)送端需要實現(xiàn)的是一個 XXXTemplate 形式的 Java Bean,結(jié)合 Spring Boot 的自動化配置選項提供多個不同的發(fā)送消息方法;在消息的消費端是一個 XXXMessageListener 接口(實現(xiàn)方式通常會使用一個注解來聲明一個消息驅(qū)動的 POJO),提供回調(diào)方法來監(jiān)聽和消費消息,這個接口同樣可以使用 Spring Boot 的自動化選項和一些定制化的屬性。
在 Apache RocketMQ 生態(tài)中,RocketMQ-Spring-Boot-Starter(下文簡稱 RocketMQ-Spring)就是一個支持 Spring Messaging API 標(biāo)準(zhǔn)的項目。該項目把 RocketMQ 的客戶端使用 Spring Boot 的方式進(jìn)行了封裝,可以讓用戶通過簡單的 annotation 和標(biāo)準(zhǔn)的 Spring Messaging API 編寫代碼來進(jìn)行消息的發(fā)送和消費,也支持?jǐn)U展出 RocketMQ 原生 API 來支持更加豐富的消息類型。在 RocketMQ-Spring 畢業(yè)初期,RocketMQ 社區(qū)同學(xué)請 Spring 社區(qū)的同學(xué)對 RocketMQ-Spring 代碼進(jìn)行 review,引出一段羅美琪(RocketMQ)和春波特(Spring Boot)故事的佳話,著名 Spring 布道師 Josh Long 向國外同學(xué)介紹如何使用 RocketMQ-Spring 收發(fā)消息。RocketMQ-Spring 也在短短兩年時間超越 Spring-Kafka 和 Spring-AMQP(注:兩者均由 Spring 社區(qū)維護(hù)),成為 Spring Messaging 生態(tài)中最活躍的消息項目。
Spring Cloud Stream 結(jié)合了 Spring Integration 的注解和功能,它的應(yīng)用模型如下:
Spring Cloud Stream 框架中提供一個獨立的應(yīng)用內(nèi)核,它通過輸入 (@Input) 和輸出 (@Output) 通道與外部世界進(jìn)行通信,消息源端 (Source) 通過輸入通道發(fā)送消息,消費目標(biāo)端 (Sink) 通過監(jiān)聽輸出通道來獲取消費的消息。這些通道通過專用的 Binder 實現(xiàn)與外部代理連接。開發(fā)人員的代碼只需要針對應(yīng)用內(nèi)核提供的固定的接口和注解方式進(jìn)行編程,而不需要關(guān)心運行時具體的 Binder 綁定的消息中間件。
在運行時,Spring Cloud Stream 能夠自動探測并使用在 classpath 下找到的 Binder。這樣開發(fā)人員可以輕松地在相同的代碼中使用不同類型的中間件:僅僅需要在構(gòu)建時包含進(jìn)不同的 Binder。在更加復(fù)雜的使用場景中,也可以在應(yīng)用中打包多個 Binder 并讓它自己選擇 Binder,甚至在運行時為不同的通道使用不同的 Binder。
Binder 抽象使得 Spring Cloud Stream 應(yīng)用可以靈活的連接到中間件,加之 Spring Cloud Stream 使用利用了 Spring Boot 的靈活配置配置能力,這樣的配置可以通過外部配置的屬性和 Spring Boot 支持的任何形式來提供(包括應(yīng)用啟動參數(shù)、環(huán)境變量和 application.yml 或者 application.properties 文件),部署人員可以在運行時動態(tài)選擇通道連接 destination(例如,RocketMQ 的 topic 或者 RabbitMQ 的 exchange)。
Spring Cloud Stream 屏蔽了底層消息中間件的實現(xiàn)細(xì)節(jié),希望以統(tǒng)一的一套 API 來進(jìn)行消息的發(fā)送/消費,底層消息中間件的實現(xiàn)細(xì)節(jié)由各消息中間件的 Binder 完成。Spring 官方實現(xiàn)了 Rabbit binder 和 Kafka Binder。Spring Cloud Alibaba 實現(xiàn)了 RocketMQ Binder,其主要實現(xiàn)原理是把發(fā)送消息最終代理給了 RocketMQ-Spring 的 RocketMQTemplate,在消費端則內(nèi)部會啟動 RocketMQ-Spring Consumer Container 來接收消息。以此為基礎(chǔ),Spring Cloud Alibaba 還實現(xiàn)了 Spring Cloud Bus RocketMQ, 用戶可以使用 RocketMQ 作為 Spring Cloud 體系內(nèi)的消息總線,來連接分布式系統(tǒng)的所有節(jié)點。通過 Spring Cloud Stream RocketMQ Binder,RocketMQ 可以與 Spring Cloud 生態(tài)更好的結(jié)合。比如與 Spring Cloud Data Flow、Spring Cloud Funtion 結(jié)合,讓 RocketMQ 可以在 Spring 流計算生態(tài)、Serverless(FaaS) 項目中被使用。
如今 Spring Cloud Stream RocketMQ Binder 和 Spring Cloud Bus RocketMQ 作為 Spring Cloud Alibaba 的實現(xiàn)已登陸 Spring 的官網(wǎng),Spring Cloud Alibaba 也成為 Spring Cloud 最活躍的實現(xiàn)。
通過介紹 Spring 中的消息框架,介紹了以 RocketMQ 為基礎(chǔ)與 Spring 消息框架結(jié)合的幾個項目,主要是 RocketMQ-Spring、Spring Cloud Stream RocketMQ Binder、Spring Cloud Bus RocketMQ、Spring Data Flow 和 Spring Cloud Function。它們之間的關(guān)系可以如下圖表示。
如何在實際業(yè)務(wù)開發(fā)中選擇相應(yīng)項目進(jìn)行使用?下面分別列出每個項目的特點和使用場景。
特點:
作為起步依賴,簡單引入一個包就能在 Spring 生態(tài)用到 RocketMQ 客戶端的所有功能。
利用了大量自動配置和注解簡化了編程模型,并且支持 Spring Messaging API。
與 RocketMQ 原生 Java SDK 的功能完全對齊。
使用場景:
適合在 Spring Boot 中使用 RocketMQ 的用戶,希望能用到 RocketMQ 原生 java 客戶端的所有功能,并通過 Spring 注解和自動配置簡化編程模型。
特點:
屏蔽底層 MQ 實現(xiàn)細(xì)節(jié),上層 Spring Cloud Stream 的 API 是統(tǒng)一的。如果想從 Kafka 切到 RocketMQ,直接改個配置即可。
與 Spring Cloud 生態(tài)整合更加方便。比如 Spring Cloud Data Flow,這上面的流計算都是基于 Spring Cloud Stream;Spring Cloud Bus 消息總線內(nèi)部也是用的 Spring Cloud Stream。
Spring Cloud Stream 提供的注解,編程體驗都是非常棒。
使用場景:
在代碼層面能完全屏蔽底層消息中間件的用戶,并且希望能項目能更好的接入 Spring Cloud 生態(tài)(Spring Cloud Data Flow、Spring Cloud Funtcion等)。
特點:
將 RocketMQ 作為事件的“傳輸器”,通過發(fā)送事件(消息)到消息隊列上,從而廣播到訂閱該事件(消息)的所有節(jié)點上,完成事件的分發(fā)和通知。
使用場景:
在 Spring 生態(tài)中希望用 RocketMQ 做消息總線的用戶,可以用在應(yīng)用間事件的通信,配置中心客戶端刷新等場景。
特點:
以 Source/Processor/Sink 組件進(jìn)行流式任務(wù)處理。RocketMQ 作為流處理過程中的中間存儲組件。
使用場景:
流處理,大數(shù)據(jù)處理場景。
特點:
消息的消費/生產(chǎn)/處理都是一次函數(shù)調(diào)用,融合 Java 生態(tài)的 Function 模型。
使用場景:
Serverless 場景。
以上就是如何在Spring生態(tài)中玩轉(zhuǎn)RocketMQ,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。