本文作者:饒子昊 - Spring Cloud Alibaba Committer,阿里雲智慧開發工程師。
01 Spring 生態介紹
根據 JVM EcoSystem Report 2021 最新資料顯示,Spring 框架的使用者佔比超過統計人數的80%,Spring MVC 達1/3。該資料也說明了 Spring 生態的相關元件在 Java 生態中仍然佔據著絕對領先的地位。
國內使用最廣泛的 Spring 生態主要有 Spring Framework、Spring Boot 和 Spring Cloud 。
Framework 起源於 2002 年,憑藉著提供的依賴注入、面向切面程式設計等能力,顛覆了傳統厚重的EJB企業級應用框架,並逐漸成為當今 Java 企業級應用開發的主流框架。雖然 Spring Framework 為 Java 開發帶來了很多優勢,但在使用的過程中,人們也逐漸意識到了它設定繁瑣等缺陷。
2014 年 Spring Boot 被 Spring 社群開源,通過一系列約定俗成的預設設定極大簡化了 Spring Framework 在使用中常被詬病的設定繁瑣等問題,讓 Spring Framework 繼續煥發生機。
2015 年 6 月,針對分散式微服務應用開發中的常見問題,Spring 社群推出了包括分散式設定註冊中心、分散式訊息、限流降級等能力在內的 Spring Cloud 解決方案,對企業從單體應用向微服務轉型起到了重大的推動作用。
除了上圖元件,如今的 Spring 是由 Web 應用、微服務、響應式程式設計、雲端計算、函數計算、事件驅動和批次處理任務七大核心領域 22 個核心專案組成的龐大生態。
02 Spring Cloud Alibaba
目前在 Spring 生態中使用開源 RocketMQ 主要有兩種方式:第一種是使用就是 RocketMQ Spring 提供的依賴和註解實現;另一種是基於 Spring Cloud Alibaba 提供的 Spring Cloud Stream 方式。
得益於過往十年處理淘系電商高並行、大流量業務積累的技術經驗,阿里巴巴內部沉澱了一套包括限流降級、分散式註冊設定中心、分散式訊息、分散式事務等在內的完整的微服務解決方案。
2015 年 6 月,Spring Cloud 的第一個正式版本釋出後,迅速成為了微服務技術圈的熱點。隨後一兩年的發展證明,以 Spring Cloud Netflix 為代表的基於 Spring Cloud 規範的一整套微服務解決方案,對中小企業技術發展產生了巨大影響,加速了大量中小企業從單體應用向微服務的轉型節奏。
當受 Spring Cloud Netflix 專案的啟發,考慮到雖然 Spring Cloud 生態的設計理念非常好,但相關的微服務解決方案並不是十分成熟,還存在一些能力缺失,而正好阿里內部早已經有一套完整的解決方案。因此最早參與 Spring Cloud Alibaba 的幾個同事就一拍即合,在 2018 年 7 月將阿里內部經過十多年技術打磨的一整套微服務解決方案通過 Spring Cloud Alibaba 的方式貢獻給 Spring Cloud 生態。
如上圖所示,通過 Spring Cloud Alibaba 配套一些阿里對外提供的差異化儲存、監控等能力,很多外部使用者可以非常方便、低成本地構建微服務應用。
03 Spring Cloud Alibaba與Spring Cloud生態關係
上圖圓圈內部顏色較深的橙色部分表示 Spring Cloud ,它是在 SpringBoot 的基礎上提供的一套完整的微服務解決方案標準,由一系列相關子專案組成,包括 OpenFeign 和 RestTemplate 定義的分散式 RPC 呼叫能力、Spring Cloud Comments 和 Spring Cloud Config 子專案抽象的統一註冊設定中心能力、Spring Cloud Stream 子專案定義的分散式訊息整合標準和 Spring Cloud CircuitBreak 子專案定義的統一限流降級能力等。
基於微服務中的標準,Spring Cloud Alibaba 為來自阿里巴巴內部的微服務解決方案提供了具體實現,不僅給 Spring Cloud 生態帶來 Nacos、RocketMQ、Sentinel 等微服務解決方案的實現,還整合了一些阿里雲平臺服務,比如簡訊服務、SMS、分散式任務排程、Schedulex 等。
Spring Cloud Netflex 和 Spring Cloud Alibaba 與 Spring Cloud 的關係一樣,都是基於 Spring Cloud 這一整套微服務所定義標準的具體實現。
目前 Spring Cloud 生態已經非常龐大繁榮,除了 Spring Cloud Alibaba 、Spring Cloud Netflix 以外,ZooKeeper 和 Consul 都分別以 Spring Cloud ZooKeeper 和 Spring Cloud Consul 專案的形式貢獻給 Spring Cloud 社群作為其中註冊和設定中心解決方案的實現。
另外, Spring Cloud Kubernetes 也是雲原生時代非常有意思的子專案,它使 Spring Cloud 服務可以直接基於 Kubernetes 中的服務 service 概念去呼叫基於 Kubernetes 構建的微服務。
從上圖可知, Spring Cloud Alibaba 和 Spring Cloud Netflix 互為補充,在 Spring Cloud 生態完整度方面起到重要作用。
另外,此方案的元件在國內使用者中的受歡迎程度已經超過 Spring Cloud 官方預設提供的一些元件,比如 Nacos 和 RocketMQ 已經逐漸成為國內分散式註冊設定中心和分散式訊息的事實標準,廣泛應用於大量中小企業的生產環境中。
除了 Spring Cloud Alibaba 像 Spring Cloudnetflex 還有。另外像Zookeeper 和 Consul 都分別以 Spring Cloud Zookeeper 和 Spring Cloud Consul 的專案形式貢獻給了 Spring Cloud 社群作為註冊和設定中心解決方案的實現。
04 基於Spring Cloud Alibaba在Spring生態玩轉RocketMQ
現在的 RocketMQ 是阿里巴巴中介軟體團隊於 2012 年研發並對外開源的第三代分散式訊息引擎,其高效能、低延遲、抗堆積特性穩定支撐了歷年阿里巴巴雙十一萬億級資料洪峰業務。2016 年,阿里巴巴向阿帕奇軟體基金會捐獻了 RocketMQ 專案。次年,RocketMQ 順利從阿帕奇軟體基金會畢業,成為阿帕奇軟體基金會中的一個頂級專案。
如上圖所示,一個生產環境中的 RocketMQ 系統由 Name Server 叢集、 Broker 叢集、生產者叢集和消費者叢集四個部分組成。其中 Broker 叢集用於儲存訊息, Name Server 叢集提供命名服務,幫助訊息生產者將訊息傳送到特定 Broker 叢集以及從特定 Broker 叢集中訂閱訊息。
RocketMQ 作為支撐淘系電商大促的核心中介軟體之一,不僅在可靠性和吞吐量方面經過實戰考驗,優勢顯著,它還提供了兩種訂閱模式,分別是廣播訂閱和叢集訂閱,以及多種訊息傳送方式和多種訊息型別,包括普通訊息、順序訊息、定時訊息、延遲訊息和事務訊息等,這些訊息型別能夠幫助業務開發人員輕鬆解決特定的業務訴求。
Spring Cloud Stream 作為 Spring Cloud 定義的分散式訊息解決方案,主要由 Message、Binder 和 Bindings 三部分組成。Message 定義了統一的訊息結構,能夠將業務系統中的訊息資料通過統一的訊息結構傳遞給特定訊息中介軟體中的 Message 訊息結構。Binder 是 Spring Cloud Stream 中的核心,負責與外部訊息整合,比如與 RocketMQ 整合需要有 RocketMQ Binder ,與 Kafka 整合需要有 Kafka Binder 。Middleware 表示具體的訊息中介軟體,可以是 RocketMQ 也可以是 Kafka 等。
上圖中,上半部分是使用 Spring Cloud Stream 連線訊息中介軟體的應用程式,中間的 Binder 類似於聯結器,連線應用程式與具體的訊息中間,從而實現應用與外部訊息中介軟體解耦。
Bindings 由 Binder 建立,主要負責業務系統與訊息中介軟體通訊,完成訊息的傳送和接收。
Demo 演示兩種方式使用 RocketMQ 的區別
上圖為 RocketMQ Spring 專案提供的用於訊息傳送的API,由 RocketMQ SpringBoot 模組提供。通過 Spring 相關依賴在業務系統使用 RocketMQ ,除了要引入 RocketMQ Spring 相關依賴做一些設定以外,還要通過 RocketMQ Spring 專案提供的 API 進行訊息的傳送。接收模組的邏輯類似,但不是通過 API ,而是通過RocketMQ Spring 提供註解。
Spring Cloud Alibaba 操作 RocketMQ 是基於 Spring Cloud 生態中的 Spring Cloud Stream 分散式訊息的標準來實現了 RocketMQ 的一些核心元件,如果 Spring 應用需要通過 Spring Cloud Alibaba 使用 RocketMQ ,只需引入 SpringCloud Alibaba 的模組依賴,再引入 Spring Cloud Stream 的模組即可。
上圖為廣播訊息的生產者持續傳送 100 條訊息的程式碼,是通過 Spring Cloud Stream 提供的 StreamBridge API 進行訊息的傳送。Message 相關 API 也不依賴於與具體的訊息中介軟體進行耦合,而是基於 Spring 相關的 Message 物件進行訊息的構造。
傳送訊息的時候還需要做一些設定,主要是基於 Cloud 提供的內容去解析設定。
上圖為訊息的傳送者相關程式碼。沒有 RocketMQ 相關的 API ,只需 consumer 方法即可從 RocketMQ 中訂閱訊息,再通過 log.info 列印結果。與具體訊息繫結在一起是通過組態檔,不在業務程式碼中,沒有相關 API 與具體的訊息中介軟體的緊耦合。
接下來傳送訊息,檢視消費者能否收到訊息。通過 RocketMQ 相關模組啟動 NameServer 和 Broker,啟動訊息的生產者。
上圖顯示 consumer1 和 consumer2 都已經收到訊息,檢視紀錄檔,顯示訊息內容為Hello RocketMQ 0 到 Hello RocketMQ 99 共 100 條訊息。
綜上,Spring Cloud Alibaba 方式的特點為與具體的訊息中間沒有繫結關係。業務程式碼的實現全部基於 Spring Cloud Stream 提供的公共 API 進行訊息的傳送和接收。其優點在於,程式碼裡面沒有使用與 RocketMQ 相關的類進行訊息的接收和傳送,能夠很方便地在不同中介軟體之間進行切換。比如從 RocketMQ 切換至 Kafka,只需要把應用中的 RocketMQ 相關的依賴替換成 Kafka 的,再修改一些設定即可,無需修改業務程式碼。
相比於 RocketMQ Spring , Spring Cloud Stream 能讓業務系統和具體的訊息中間解耦,讓系統具有較好的可延伸性和可維護性,能夠擁有較長遠的生命週期。
05 Spring Cloud Alibaba展望
經過三年多的發展發展,Spring Cloud 一共釋出了 27 個版本, star 數目達 22.5k ,fork 數目和使用者數目分別達到 7k 和 23.7k ,領先於國內外甚至 Spring Cloud 官方的子專案相關資料。
未來, Spring Cloud Alibaba 社群會從以下兩個方面進一步豐富專案能力,促進社群發展。
第一,社群活動方面
① 舉辦定期社群雙週會,討論 github 上過往兩週的 issue 和 PR 情況。另外,週會中也會組織相關主題內容的分享,週會資訊將在 Spring Cloud Alibaba 交流群中進行同步。
② 聯合中科院和阿里巴巴開源辦公室舉辦「開源之夏」和「程式設計之夏」等活動。活動主要針對在校生,通過暑期時間,在社群導師一對一的帶領下完成某些 feature 並貢獻給社群,為廣大在校生接觸開源社群提供渠道和更多機會。
③ 線下或線上舉辦 Meetup,為社群內外的同學提供更多交流機會。
第二,發展規劃
Spring Cloud Alibaba 過去第一階段的工作是豐富 Spring Cloud 生態,讓廣大外部使用者能夠輕鬆地擁抱微服務未來。第二階段,Spring Cloud Alibaba將繼續努力,讓外部使用者用好微服務,構建微服務治理和業務高可用相關的能力,滿足使用者在微服務使用過程中的高層次訴求,包括以下三個方面:
① 全面支援 RocketMQ 5.0 和 Sentinel 2.0 等中介軟體,為使用者帶來更豐富的中介軟體使用體驗。
② 構建 Spring Cloud 生態的微服務治理能力、微服務高可用等能力。
③ 構建 Spring Cloud 分散式任務排程等方面的能力。
最後,非常歡迎對 Spring Cloud Alibaba 專案感興趣的同學加入社群,一起參與 Spring Cloud Alibaba 未來的建設。