javascript
厉害了,Spring Cloud Alibaba 发布 GA 版本!
?小馬哥 & 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、 ZuulBlockFallbackProvider 對 BlockException 的處理邏輯這些 "配套" 的方式來讓我們更加方便地使用 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 項目架構師。目前主要負責阿里巴巴中間件開源項目、微服務技術實施、架構衍進和基礎設施構建等工作。
總結
以上是生活随笔為你收集整理的厉害了,Spring Cloud Alibaba 发布 GA 版本!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 9个用于构建容错系统的开源工具
- 下一篇: 图解分布式架构的演进过程