開篇:在Spring生態中玩轉RocketMQ

<meta name="source" content="lake">

Apache RocketMQ 作爲阿里開源的業務消息的首選,通過雙11業務打磨,在消息和流處理領域被廣泛應用。而微服務生態Spring框架也是業務開發中最受開發者歡迎的框架之一,兩者的完美契合使得RocketMQ成爲Spring Messaing實現中最受歡迎的消息實現。

在Spring生態中使用RocketMQ到底有多少種方式?他們各自適用於什麼場景?各自有什麼優劣勢?

如何開始實戰?本書將一一解答。

我們先會帶領各位開發者:

  • 回顧羅美琪(RocketMQ)和春波特(SpringBoot)故事開始的時候,rocketmq-spring經過6個多月的孵化,作爲Apache RocketMQ的子項目正式畢業。
  • 回顧rocketmq-spring畢業後的兩年,是如何成爲Spring 生態中最受歡迎的 messaging 實現的?

最後將通過圖文實操地方式帶來給位開發者玩轉在Spring生態中使用RocketMQ的三種主流

所有動手實操的部分大家可以登錄start.aliyun.com知行動手實驗室免費體驗。

開卷有益,希望各位開發者通過閱讀本書、動手實操有所收穫。

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。它們之間的關係可以如下圖表示。

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

<colgroup><col width="151" span="1"><col width="329" span="1"><col width="288" span="1"></colgroup>
|

項目

|

特點

|

使用場景

|
|

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的三種主流的方式。

原文鏈接

本文爲阿里雲原創內容,未經允許不得轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章