簡介: 開篇:在Spring生態中玩轉RocketMQjava
Apache RocketMQ 做爲阿里開源的業務消息的首選,經過雙11業務打磨,在消息和流處理領域被普遍應用。而微服務生態Spring框架也是業務開發中最受開發者歡迎的框架之一,二者的完美契合使得RocketMQ成爲Spring Messaing實現中最受歡迎的消息實現。spring
在Spring生態中使用RocketMQ到底有多少種方式?他們各自適用於什麼場景?各自有什麼優劣勢?編程
如何開始實戰?本書將一一解答。架構
咱們先會帶領各位開發者:app
- 回顧羅美琪(RocketMQ)和春波特(SpringBoot)故事開始的時候,rocketmq-spring通過6個多月的孵化,做爲Apache RocketMQ的子項目正式畢業。
- 回顧rocketmq-spring畢業後的兩年,是如何成爲Spring 生態中最受歡迎的 messaging 實現的?
最後將經過圖文和實操地方式帶來給位開發者玩轉在Spring生態中使用RocketMQ的三種主流方式。框架
全部動手實操的部分你們能夠登陸start.aliyun.com知行動手實驗室免費體驗。less
開卷有益,但願各位開發者經過閱讀本書、動手實操有所收穫。異步
RocketMQ與Spring的碰撞
在介紹RocketMQ與Spring故事以前,不得不提到Spring中的兩個關於消息的框架,Spring Messaging和Spring Cloud Stream。它們都可以與Spring Boot整合並提供了一些參考的實現。和全部的實現框架同樣,消息框架的目的是實現輕量級的消息驅動的微服務,能夠有效地簡化開發人員對消息中間件的使用複雜度,讓系統開發人員能夠有更多的精力關注於核心業務邏輯的處理。分佈式
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的自動化選項和一些定製化的屬性。
在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)故事的佳話[1],著名Spring佈道師Josh Long向國外同窗介紹如何使用RocketMQ-Spring收發消息[2]。RocketMQ-Spring也在短短兩年時間超越Spring-Kafka和Spring-AMQP(注:二者均由Spring社區維護),成爲Spring Messaging生態中最活躍的消息項目。
Spring Cloud Stream
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[3],其主要實現原理是把發送消息最終代理給了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的官網[4],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。它們之間的關係能夠以下圖表示。
如何在實際業務開發中選擇相應項目進行使用?下表列出了每一個項目的特色和使用場景。
項目 |
特色 |
使用場景 |
RocketMQ-Spring |
1.做爲起步依賴,簡單引入一個包就能在Spring生態用到RocketMQ客戶端的全部功能。
2.利用了大量自動配置和註解簡化了編程模型,而且支持Spring Messaging API
3.與RocketMQ 原生Java SDK的功能徹底對齊 |
適合在Spring Boot中使用RocketMQ的用戶,但願能用到RocketMQ原生java客戶端的全部功能,並經過Spring註解和自動配置簡化編程模型。 |
Spring Cloud Stream RocketMQ Binder |
1.屏蔽底層 MQ 實現細節,上層 Spring Cloud Stream 的 API 是統一的。若是想從 Kafka 切到 RocketMQ,直接改個配置便可。
2.與 Spring Cloud 生態整合更加方便。好比 Spring Cloud Data Flow,這上面的流計算都是基於 Spring Cloud Stream;Spring Cloud Bus 消息總線內部也是用的 Spring Cloud Stream。
3.Spring Cloud Stream 提供的註解,編程體驗都是很是棒。 |
在代碼層面能徹底屏蔽底層消息中間件的用戶,而且但願能項目能更好的接入Spring Cloud 生態(Spring Cloud Data Flow、Spring Cloud Funtcion等)。 |
Spring Cloud Bus RocketMQ |
將RocketMQ 做爲事件的「傳輸器」,經過發送事件(消息)到消息隊列上,從而廣播到訂閱該事件(消息)的全部節點上。完成事件的分發和通知。 |
在Spring生態中但願用RocketMQ作消息總線的用戶,能夠用在應用間事件的通訊,配置中心客戶端刷新等場景 |
Spring Cloud Data Flow |
以 Source/Processor/Sink 組件進行流式任務處理。RocketMQ 做爲流處理過程當中的中間存儲組件 |
流處理,大數據處理場景 |
Spring Cloud Function |
消息的消費/生產/處理都是一次函數調用,融合 Java 生態的 Function 模型 |
Serverless 場景 |
RocketMQ做爲業務消息的首選,在消息和流處理領域被普遍應用。而微服務生態Spring框架也是業務開發中最被,二者的完美契合使得RocketMQ成爲Spring Messaing實現中最受歡迎的消息實現。書的後半部分講給各位開發者詳細講述在Spring生態中使用RocketMQ的三種主流的方式。
本文爲阿里雲原創內容,未經容許不得轉載。