歡迎光臨
每天分享高質量文章

Spring Cloud Alibaba 發佈 GA 版本,Spring 再發賀電

來自:阿裡巴巴中間件(微信號:Aliware_2018)

 

? 小馬哥 & Josh Long ?

喜歡寫一首詩一般的代碼,更喜歡和你共同 code review,英雄的相惜,猶如時間沉澱下來的對話,歷久方彌新。

相見如故,@杭州。

4 月 18 日,Josh Long 來到了阿裡巴巴西溪園區,我們向其演示了 Spring Cloud Alibaba 各個組件的功能和實現方式,Josh Long 看完意猶未盡,表示會在新的 Spring Tips 視頻再次介紹 Spring Cloud Alibaba 中的其他組件。(點擊文末閱讀原文,訪問上一期spring-tips-bootiful-alibaba)

畫外音:首次遇見,@北京:我和 Josh Long 的一天

一天后, Spring Cloud Alibaba 發佈了首個 GA 版本,此次開發歷時 267 天,彙集 26 位 contributor 的努力,改寫 Spring Cloud Edgware、Spring Cloud Finchley 和 Spring Cloud Greenwich 3 個版本。Spring Cloud 聯合創始人 Spencer Gibb 在 Spring 官網的博客頁面宣佈該發板訊息。隨後,Spring Cloud 官方 Twitter 也發佈了此訊息

Spring 賀電史:

Spring Cloud Alibaba發佈第二個版本,Spring 發來賀電

阿裡巴巴開源 Spring Cloud Alibaba,加碼微服務生態建設

 

版本概要


概要:

  • 增加了 4 個新的模塊:spring-cloud-alibaba-dubbo、spring-cloud-alibaba-seata、spring-cloud-alibaba-sentinel-zuul 以及 spring-cloud-alicloud-sms。

  • spring-cloud-alibaba-nacos 和 spring-cloud-alibaba-sentinel 對應的組件客戶端進行了升級,新增了一些 feature,並且優化了一些功能。

  • spring-cloud-stream-binder-rocketmq 進行了比較大的重構,並且集成了 RocketMQ Spring 專案。同時 spring-cloud-starter-bus-rocketmq 也進行了一些優化。

  • 修複了之前版本的一些 bug。

 

新版本的版本號對應關係如下表:

由於 Spring Cloud Alibaba 還在 Spring Cloud 孵化器內,所以版本號不能高於 1。

發佈三個版本意味著維護三個分支,這個過程需要付出很多精力來做修改,遇到的難點有以下這些:

  • F 和 G 版對應的 JDK 版本是 Java 8 及以上,而 E 版還是 Java 7,這意味著 lambda 運算式或其它 Java 8 包含的類或方法等這些 Java8 才有的特性,在 Java 7 的分支下需要重新寫一遍。

  • Spring Cloud 官方提供的組件在不同版本的處理邏輯並不一致,需要逐一進行適配。比如 Sentinel 整合 Feign 的時候,Feign 中的 RequestTemplate#url 方法在 G 版進行了修改。

  • 不同版本的 Spring Cloud 規範並不一樣,實現方式也變了。比如 Spring Cloud Strean Binder 在 G 版本的接口宣告跟 E 、F 版本不一致。

  • SpringBoot 的兼容性問題,比如 Endpoint 的 id 策略,Actuator 的自動化配置生效寫法,SpringApplicationEvent 事件在不同版本的執行順序、策略變化等等。

  • 測試、回歸流程變長等等。

模塊詳情


1. Spring Cloud Alibaba Seata(原 Fescar)

另外一個新增的組件是 Seata (原 Fescar,即分佈式事務解決方案)。

Seata 是 阿裡巴巴 開源的分佈式事務中間件,以高效並且對業務 0 侵入的方式,解決微服務場景下麵臨的分佈式事務問題。

隨著業務需求和架構的變化,單體應用被拆分為微服務,原有的單庫資料源已經改成了分別使用獨立的資料源。業務過程將由多個個服務的呼叫來完成。此時,每一個服務內部的資料一致性仍可以通過本地事務來保證,但整個業務層面的全域性資料一致性的保障改如何保障呢?這就是 Seata 所解決的微服務架構下典型的分佈式事務需求。

Seata 提供了 AT(Automatic Transaction)和 TCC (Try-Confirm-Cancel) 兩種工作樣式。AT 樣式是對業務完全無侵入,支持目前絕大多數 支持 ACID 事務的 關係型資料庫。

當事務的參與者只有 支持 ACID 事務的關係型資料庫時,Seata 可以在完全不侵入 業務的情況下完成分佈式事務方案。

當事務的參與者中包含其他場景時,Seata 提供了與 AT 相應的另外一種工作樣式稱為 TCC 樣式 ,來解決這些場景下的分佈式事務問題。TCC 樣式下,分支事務需要應用自己來定義業務本身及提交和回滾的邏輯。

Seata 事務的傳播是依賴於在微服務呼叫鏈中傳遞 Seata 事務 背景關係來完成的。如何在 Spring Cloud 框架中傳播 Seata 事務背景關係,並使得 Spring Cloud 用戶更方便使用 Seata,就是 Spring Cloud Alibaba Seata 解決的問題。

在 Spring Cloud 這一層面,我們通過在微服務中傳遞事務背景關係的方式完成了 Seata 在 Spring Cloud 層面的接入:

  • Spring MVC 環境下支持自動還原 Seata 事務背景關係;

  • 支持服務呼叫者通過 RestTemplate 或 FeignClient 呼叫時,自動傳遞 Seata 事務背景關係;

  • 支持 FeignClient 和 Hystrix、Sentinel 同時使用的場景;

2. Spring Cloud Stream RocketMQ Binder

在之前的 RocketMQ Binder 實現中,Binder 內部使用原生的 RocketMQ Producer 和 Consumer 進行訊息的處理。

新版本對 RocketMQ Binder 進行了重構,集成了 RocketMQ Spring,其中 RocketMQ Spring 提供了這些功能:

  • 統一使用 RocketMQTemplate 用於訊息的發送。

  • 提供 @RocketMQListener 註解用於訊息的消費。

  • 提供 @RocketMQLocalTransactionListener 接口配合 @RocketMQTransactionListener 註解進行事務訊息的處理。
  • 提供 RocketMQProperties 外部化配置配合 RocketMQAutoConfiguration 自動化配置類完成一些實體的自動化註冊。

  • 提供 RocketMQListenerContainer 容器規範了訊息監聽器對訊息的處理。

RocketMQ Binder 集成 RocketMQ Spring 之後,會將 RocketMQ Binder 內部原先使用原生的 RocketMQ Producer 和 Consumer 替換成 RocketMQ Spring 內部提供的類或接口。

同時專案引入了 Binder 也可以使用 RocketMQ Spring 的特性:

  • 訊息發送方面,可以使用 Binder 自身提供的 MessageChannel 發送,也可以使用 RocketMQ Spring 提供了 RocketMQTemplate 進行發送。

  • 訊息消費方面,可以使用 Binder 自身提供的 @StreamListener 或 @ServiceActivator 進行消費,也可以使用 @RocketMQListener 進行消費。

3. Spring Cloud Bus RocketMQ

Spring Cloud 體系訊息總線的新選擇 – 基於 RocketMQ 的訊息總線組件,可以用於構建自身的微服務訊息體系,底座基於 Spring Cloud Stream RocketMQ Binder 實現。

新版本中所有的消費者預設會使用 廣播rocketmq-bus-group 消費組進行訊息的訂閱。

4. Spring Cloud Alibaba Nacos

Nacos Client 依賴使用了最新的 1.0.0 版本。Nacos 1.0.0 GA 版本,可大規模投入到生產環境,我們建議升級到 1.0.0 版本。

Spring Cloud Alibaba Nacos Config

在配置這一塊,上一個版本發佈以後已經改寫了絕大多數的場景,如果涉及到沒有改寫的場景,歡迎大家來創建 Issue 進行討論或直接創建 Pull Request 來完善。

我們再重溫一下目前 Nacos Config 提供的功能:

  • 支持 Spring Cloud 官方的配置加載機制,通過內部相關規則(應用名、應用名 + Profile)自動生成相關的 Data Id 配置。目前支持 properties 和 yaml(yml) 格式的資料。

  • 支持從多個 dataid 和 groupid 中獲取和監聽配置,並支持優先級指定。

  • 支持多個應用之間的共享配置。

Spring Cloud Alibaba Nacos Discovery

在註冊這一塊,我們支持了 HeartbeatEvent 事件,該事件會在 Spring Cloud 體系中的網關所使用。支持了 HeartbeatEvent 事件也就意味著 Nacos Discovery 目前也兼容了 Zuul 和 Spring Cloud Gateway。

同時還有一些其它額外的改進:

  • 可以選擇使用 @DiscoveryClient 註解,引入 starter 之後不使用該註解也會自動進行服務的註冊。

  • 支持 namespace 隔離註冊資料(Nacos Client 0.8.0 或以上版本即可支持)。

5. Spring Cloud Alibaba Sentinel

組件集成

上個版本發佈之後,Sentinel 組件就已經對 Spring 體系中的客戶端組件提供了比較好的支持了。

  • RestTemplate:構造的時候加上 @SentinelRestTemplate 會額外獲取 Sentinel 的保護。

  • Feign:引入 openfeign 依賴後,打開 feign.sentinel.enabled=true 開關再配合 Sentinel 的資源即可使用。

新版本 Sentinel 組件對 Zuul 1.x 網關進行了集成,使用方式也非常地簡單,只需要針對 url 進行資源的設置即可:比如使用 Zuul 後訪問 /provider1/hello 服務,那麼對應的資源名是 /provider1/hello。同時也提供 RequestOriginParser 進行 origin 的設置, UrlCleaner 進行資源的 clean、 ZuulBlockFallbackProviderBlockException 的處理邏輯這些 “配套” 的方式來讓我們更加方便地使用 Sentinel 對 Zuul 進行限流降級處理。

關於 Spring Cloud Gateway 網關的支持,會在 Sentinel 1.6 版本支持。

功能優化

  • 優化了 RestTemplate 的降級處理,這是因為其內部提供了 ResponseErrorHandler用於解析 Response 信息,並判斷是否是一個錯誤請求。Sentinel 對 RestTemplate 的降級處理跟該策略進行了融合。

  • SentinelEndpoint 內部展示的信息更加完善,包括了應用名,日誌所在目錄,日誌名策略,dashboard地址,metrics 檔案大小,客戶端ip,資料源客戶端心跳時間等等信息。

  • 外部化配置更加完善,詳情可以參考 Wiki (地址:https://github.com/spring-cloud-incubator/spring-cloud-alibaba/wiki/Sentinel#more)

Bug 解決

  • @SentinelRestTemplate 在某些場景下不生效。

  • 支持 Spring Cloud 官方提供的 @EnableCircuitBreaker 註解。

  • 解決動態資料源在首次加載情況下規則資料不存在的話推送失敗的問題(資料源外部化配置添加了 rule-type 欄位)。

6.Spring Cloud Alibaba Dubbo

Dubbo 作為成熟的 RPC 框架,其易用性、擴展性和健壯性已得到業界的認可。Dubbo 與 Spring Cloud 並非競爭關係,Dubbo Spring Cloud 的出現使得 Dubbo 生態體系發生了巨大變化,它作為 Spring Cloud Alibaba 的最核心組件,完全地擁抱 Spring Cloud 技術棧,不僅保持 Spring Cloud 原生特性,而且提供更為完善的 Dubbo 服務治理能力。簡言之,Dubbo Spring Cloud 對 Spring Cloud 技術棧所帶來的革命性變化。

 

通過以下表格,簡要地對比 Spring Cloud 與 Dubbo Spring Cloud 的功能特性:

更多的特性細節,請參考下文的“功能特性” 部分。

 

版本支持

 

由於 Spring 官方宣佈 Spring Cloud Edgware(下文簡稱為 “E” 版) 將在 2019 年 8 月 1 號後停止維護,因此,目前 Dubbo Spring Cloud 發佈版本並未對 “E” 版提供支持,僅為 Finchley 與 Greenwich (下文分別簡稱為 “F” 版 和 “G” 版) 開發,同時也建議和鼓勵 Spring Cloud 用戶更新至 “F” 版 或 “G” 版。

 

同時,Dubbo Spring Cloud 基於 Apache Dubbo Spring Boot 2.7.1 開發(最低 Java 版本為 1.8),提供完整的 Dubbo 註解驅動、外部化配置以及 Production-Ready 的特性。(詳情請參考:https://github.com/apache/incubator-dubbo-spring-boot-project)

 

以下表格將說明 Dubbo Spring Cloud 版本關係映射關係:

 

功能特性

 

  • Dubbo 使用 Spring Cloud 服務註冊與發現

Dubbo Spring Cloud 基於 Spring Cloud Commons 抽象實現 Dubbo 服務註冊與發現,應用只需增添外部化配置屬性 “dubbo.registry.address = spring-cloud://localhost”,就能輕鬆地橋接到所有原生 Spring Cloud 註冊中心,包括:

  • Nacos

  • Eureka

  • Zookeeper

  • Consul

Dubbo Spring Cloud 將在下個版本支持 Spring Cloud 註冊中心與 Dubbo 註冊中心並存,提供雙註冊機制,實現無縫遷移。

  • Dubbo 作為 Spring Cloud 服務呼叫

預設情況,Spring Cloud Open Feign 以及 @LoadBalanced RestTemplate 作為 Spring Cloud 的兩種服務呼叫方式。Dubbo Spring Cloud 為其提供了第三種選擇,即 Dubbo 服務將作為 Spring Cloud 服務呼叫的同等公民出現,應用可通過 Apache Dubbo 註解 @Service和 @Reference 暴露和取用 Dubbo 服務,實現服務間多種協議的通訊。同時,也可以利用 Dubbo 泛化接口輕鬆實現服務網關。

 

  • Dubbo 服務自省

Dubbo Spring Cloud 引入了全新的服務治理特性 – 服務自省(Service Introspection),其設計目的在於最大化減輕註冊中心負載,去 Dubbo 註冊元信息中心化。假設一個 Spring Cloud 應用引入 Dubbo Spring Boot Starter,並暴露 N 個 Dubbo 服務,以 Dubbo Nacos 註冊中心為例,當前應用將註冊 N+1 個 Nacos 應用,除 Spring Cloud 應用本身之前,其餘 N 個應用均來自於 Dubbo 服務,當 N 越大時,註冊中心負載越重。因此,Dubbo Spring Cloud 應用對註冊中心的負載相當於傳統 Dubbo 的 N 分之一,在不增加基礎設施投入的前提下,理論上,使其集群規模擴大 N 倍。當然,未來的 Dubbo 也將提供服務自省的能力。

  • Dubbo 遷移 Spring Cloud 服務呼叫

儘管 Dubbo Spring Cloud 完全地保留了原生 Spring Cloud 服務呼叫特性,不過 Dubbo 服務治理的能力是 Spring Cloud Open Feign 所不及的,如高性能、高可用以及負載均衡穩定性等方面。因此,建議開發人員將 Spring Cloud Open Feign 或者 @LoadBalanced RestTemplate 遷移為 Dubbo 服務。考慮到遷移過程並非一蹴而就,因此,Dubbo Spring Cloud 提供了方案,即 @DubboTransported 註解。該註解能夠幫助服務消費端的 Spring Cloud Open Feign 接口以及 @LoadBalanced RestTemplate Bean 底層走 Dubbo 呼叫(可切換 Dubbo 支持的協議),而服務提供方則只需在原有 @RestController 類上追加 Dubbo @Servce 註解(需要抽取接口)即可,換言之,在不調整 Feign 接口以及 RestTemplate URL 的前提下,實現無縫遷移。如果遷移時間充分的話,建議使用 Dubbo 服務重構系統中的原生 Spring Cloud 服務的定義。

 

進階閱讀

瞭解更多 Dubbo Spring Cloud 的特性以及設計細節,可訪問:

Spring Cloud Alibaba wiki:
https://github.com/spring-cloud-incubator/spring-cloud-alibaba/wiki

Dubbo 的博客:

http://dubbo.apache.org/zh-cn/blog/index.html

 

完整示例

如果您需要進一步瞭解 Dubbo Spring Cloud 使用細節,可參考:

 

官方 Samples:

https://github.com/spring-cloud-incubator/spring-cloud-alibaba/tree/master/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples

其子模塊說明如下:

  • spring-cloud-dubbo-sample-api:API 模塊,存放 Dubbo 服務接口和模型定義

  • spring-cloud-dubbo-provider-web-sample:Dubbo Spring Cloud 服務提供方示例(Web 應用)

  • spring-cloud-dubbo-provider-sample:Dubbo Spring Cloud 服務提供方示例(非 Web 應用)

  • spring-cloud-dubbo-consumer-sample:Dubbo Spring Cloud 服務消費方示例

  • spring-cloud-dubbo-servlet-gateway-sample:Dubbo Spring Cloud Servlet 網關簡易實現示例

問題反饋

如果您在使用的過程中遇到任何問題,請內容反饋至 

https://github.com/spring-cloud-incubator/spring-cloud-alibaba/issues

 

7. Spring Cloud Alibaba Cloud SMS

短信服務(Short Message Service)是阿裡雲為用戶提供的一種通信服務的能力。

我們規範了短信服務對應的一些方法在 ISmsService 接口中,提供了鑒權、短信單次/批量發送、查詢、短信上行/下行監聽器註冊等功能。

可以在配置檔案中配置對應的 ak、sk、上行,下行佇列名。程式對應的類中就可以註入 ISmsService,然後即可進行短信的相關操作。

 

What’s Next


Sentinel 目前已經支持 reactive,並且會在 Sentinel 發佈 1.6 版本支持 Spring Cloud Gateway 之後,進行 WebFlux 和 Spring Cloud Gateway 的適配。同時 RocketMQ Binder 將會適配 MessageSource 進行訊息的拉取。

 

致謝


Spring Cloud Alibaba 從開源到發佈第一個正式版本,受到了很多社區同學的關註。社區的每一個 Issue ,每一個 PR,都是對整個專案的幫助,都在為建設更好用的 Spring Cloud 添磚加瓦。我們希望有更多社區的同學加入進來,一起把專案做好。

我們真心地感謝為這個專案提出過 Issue 和 PR 的同學,以及這些 contributor:

@HaojunRen@xiejiashuai@mengxiangrui007@yunzheng1228@tigerMoon@slievrly@mostcool@pig4cloud@carlWangTao@yanglbme@codewaltz1994@caojiele@JakeConnors376W@Harris2012@justlive1@毛建偉(wb-maojianwei) @bluesword12350

最後還要特別感謝 Spring Cloud Alibaba 生態中的其他開源專案:

Dubbo

https://github.com/apache/incubator-dubbo

Seata

https://github.com/seata/seata

Sentinel

https://github.com/alibaba/sentinel

Nacos

https://github.com/alibaba/nacos

RocketMQ

https://github.com/apache/rocketmq

 

本文作者:

方劍(花名:洛夜)

GitHub ID @fangjian0423,開源愛好者,阿裡巴巴高級開發工程師,阿裡雲產品 EDAS 開發,Spring Cloud Alibaba 開源專案負責人之一。

小馬哥(mercyblitz

GitHub ID @mercyblitz,Java 勸退師,Apache Dubbo PMC,  Spring Cloud Alibaba 專案架構師。目前主要負責阿裡巴巴中間件開源專案、微服務技術實施、架構衍進和基礎設施構建等工作。

已同步到看一看
赞(0)

分享創造快樂