Spring Cloud Alibaba 发布 GA 版本,新增 4 个模块
4 月 19日, Spring Cloud Alibaba 發(fā)布了首個(gè)GA版本,此次開(kāi)發(fā)歷時(shí)267天,匯集26位 contributor 的努力,覆蓋 Spring Cloud Edgware、Spring Cloud Finchley 和 Spring Cloud Greenwich 3 個(gè)版本。Spring Cloud 聯(lián)合創(chuàng)始人 Spencer Gibb 在 Spring 官網(wǎng)的博客頁(yè)面宣布該發(fā)板消息。隨后,Spring Cloud 官方 Twitter 也發(fā)布了此消息。
版本概要
概要:
-
增加了 4 個(gè)新的模塊: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 對(duì)應(yīng)的組件客戶端進(jìn)行了升級(jí),新增了一些 feature,并且優(yōu)化了一些功能。
-
spring-cloud-stream-binder-rocketmq 進(jìn)行了比較大的重構(gòu),并且集成了 RocketMQ Spring 項(xiàng)目。同時(shí) spring-cloud-starter-bus-rocketmq 也進(jìn)行了一些優(yōu)化。
-
修復(fù)了之前版本的一些 bug。
新版本的版本號(hào)對(duì)應(yīng)關(guān)系如下表:
由于 Spring Cloud Alibaba 還在 Spring Cloud 孵化器內(nèi),所以版本號(hào)不能高于 1。
發(fā)布三個(gè)版本意味著維護(hù)三個(gè)分支,這個(gè)過(guò)程需要付出很多精力來(lái)做修改,遇到的難點(diǎn)有以下這些:
-
F 和 G 版對(duì)應(yīng)的 JDK 版本是 Java 8 及以上,而 E 版還是 Java 7,這意味著 lambda 表達(dá)式或其它 Java 8 包含的類(lèi)或方法等這些 Java8 才有的特性,在 Java 7 的分支下需要重新寫(xiě)一遍。
-
Spring Cloud 官方提供的組件在不同版本的處理邏輯并不一致,需要逐一進(jìn)行適配。比如 Sentinel 整合 Feign 的時(shí)候,F(xiàn)eign 中的
RequestTemplate#url方法在 G 版進(jìn)行了修改。 -
不同版本的 Spring Cloud 規(guī)范并不一樣,實(shí)現(xiàn)方式也變了。比如 Spring Cloud Strean Binder 在 G 版本的接口聲明跟 E 、F 版本不一致。
-
SpringBoot 的兼容性問(wèn)題,比如 Endpoint 的 id 策略,Actuator 的自動(dòng)化配置生效寫(xiě)法,SpringApplicationEvent 事件在不同版本的執(zhí)行順序、策略變化等等。
-
測(cè)試、回歸流程變長(zhǎng)等等。
模塊詳情
1. Spring Cloud Alibaba Seata (原 Fescar)
另外一個(gè)新增的組件是 Seata (原 Fescar,即分布式事務(wù)解決方案)。
Seata 是阿里巴巴開(kāi)源的分布式事務(wù)中間件,以高效并且對(duì)業(yè)務(wù) 0 侵入的方式,解決微服務(wù)場(chǎng)景下面臨的分布式事務(wù)問(wèn)題。
隨著業(yè)務(wù)需求和架構(gòu)的變化,單體應(yīng)用被拆分為微服務(wù),原有的單庫(kù)數(shù)據(jù)源已經(jīng)改成了分別使用獨(dú)立的數(shù)據(jù)源。業(yè)務(wù)過(guò)程將由多個(gè)個(gè)服務(wù)的調(diào)用來(lái)完成。此時(shí),每一個(gè)服務(wù)內(nèi)部的數(shù)據(jù)一致性仍可以通過(guò)本地事務(wù)來(lái)保證,但整個(gè)業(yè)務(wù)層面的全局?jǐn)?shù)據(jù)一致性的保障改如何保障呢?這就是 Seata 所解決的微服務(wù)架構(gòu)下典型的分布式事務(wù)需求。
Seata 提供了 AT(Automatic Transaction)和 TCC (Try-Confirm-Cancel) 兩種工作模式。AT 模式是對(duì)業(yè)務(wù)完全無(wú)侵入,支持目前絕大多數(shù)支持 ACID 事務(wù)的關(guān)系型數(shù)據(jù)庫(kù)。
當(dāng)事務(wù)的參與者只有支持 ACID 事務(wù)的關(guān)系型數(shù)據(jù)庫(kù)時(shí),Seata 可以在完全不侵入業(yè)務(wù)的情況下完成分布式事務(wù)方案。
當(dāng)事務(wù)的參與者中包含其他場(chǎng)景時(shí),Seata 提供了與 AT 相應(yīng)的另外一種工作模式稱(chēng)為 TCC 模式 ,來(lái)解決這些場(chǎng)景下的分布式事務(wù)問(wèn)題。TCC 模式下,分支事務(wù)需要應(yīng)用自己來(lái)定義業(yè)務(wù)本身及提交和回滾的邏輯。
Seata 事務(wù)的傳播是依賴于在微服務(wù)調(diào)用鏈中傳遞 Seata 事務(wù)上下文來(lái)完成的。如何在 Spring Cloud 框架中傳播 Seata 事務(wù)上下文,并使得 Spring Cloud 用戶更方便使用 Seata,就是 Spring Cloud Alibaba Seata 解決的問(wèn)題。
在 Spring Cloud 這一層面,我們通過(guò)在微服務(wù)中傳遞事務(wù)上下文的方式完成了 Seata 在 Spring Cloud 層面的接入:
-
Spring MVC 環(huán)境下支持自動(dòng)還原 Seata 事務(wù)上下文;
-
支持服務(wù)調(diào)用者通過(guò) RestTemplate 或 FeignClient 調(diào)用時(shí),自動(dòng)傳遞 Seata 事務(wù)上下文;
-
支持 FeignClient 和 Hystrix、Sentinel 同時(shí)使用的場(chǎng)景;
2. Spring Cloud Stream RocketMQ Binder
在之前的 RocketMQ Binder 實(shí)現(xiàn)中,Binder 內(nèi)部使用原生的 RocketMQ Producer 和 Consumer 進(jìn)行消息的處理。
新版本對(duì) RocketMQ Binder 進(jìn)行了重構(gòu),集成了 RocketMQ Spring,其中 RocketMQ Spring 提供了這些功能:
-
統(tǒng)一使用
RocketMQTemplate用于消息的發(fā)送。 -
提供
@RocketMQListener注解用于消息的消費(fèi)。 -
提供@RocketMQLocalTransactionListener接口配合@RocketMQTransactionListener注解進(jìn)行事務(wù)消息的處理。
-
提供
RocketMQProperties外部化配置配合RocketMQAutoConfiguration自動(dòng)化配置類(lèi)完成一些實(shí)例的自動(dòng)化注冊(cè)。 -
提供
RocketMQListenerContainer容器規(guī)范了消息監(jiān)聽(tīng)器對(duì)消息的處理。
RocketMQ Binder 集成 RocketMQ Spring 之后,會(huì)將 RocketMQ Binder 內(nèi)部原先使用原生的 RocketMQ Producer 和 Consumer 替換成 RocketMQ Spring 內(nèi)部提供的類(lèi)或接口。
同時(shí)項(xiàng)目引入了 Binder 也可以使用 RocketMQ Spring 的特性:
-
消息發(fā)送方面,可以使用 Binder 自身提供的
MessageChannel發(fā)送,也可以使用 RocketMQ Spring 提供了RocketMQTemplate進(jìn)行發(fā)送。 -
消息消費(fèi)方面,可以使用 Binder 自身提供的
@StreamListener或@ServiceActivator進(jìn)行消費(fèi),也可以使用@RocketMQListener進(jìn)行消費(fèi)。
3. Spring Cloud Bus RocketMQ
Spring Cloud 體系消息總線的新選擇 - 基于 RocketMQ 的消息總線組件,可以用于構(gòu)建自身的微服務(wù)消息體系,底座基于 Spring Cloud Stream RocketMQ Binder 實(shí)現(xiàn)。
新版本中所有的消費(fèi)者默認(rèn)會(huì)使用廣播和rocketmq-bus-group消費(fèi)組進(jìn)行消息的訂閱。
4. Spring Cloud Alibaba Nacos
Nacos Client 依賴使用了最新的 1.0.0 版本。Nacos 1.0.0 GA 版本,可大規(guī)模投入到生產(chǎn)環(huán)境,我們建議升級(jí)到 1.0.0 版本。
Spring Cloud Alibaba Nacos Config
在配置這一塊,上一個(gè)版本發(fā)布以后已經(jīng)覆蓋了絕大多數(shù)的場(chǎng)景,如果涉及到?jīng)]有覆蓋的場(chǎng)景,歡迎大家來(lái)創(chuàng)建 Issue 進(jìn)行討論或直接創(chuàng)建 Pull Request 來(lái)完善。
我們?cè)僦販匾幌履壳?Nacos Config 提供的功能:
-
支持 Spring Cloud 官方的配置加載機(jī)制,通過(guò)內(nèi)部相關(guān)規(guī)則(應(yīng)用名、應(yīng)用名 + Profile)自動(dòng)生成相關(guān)的 Data Id 配置。目前支持 properties 和 yaml (yml) 格式的數(shù)據(jù)。
-
支持從多個(gè) dataid 和 groupid 中獲取和監(jiān)聽(tīng)配置,并支持優(yōu)先級(jí)指定。
-
支持多個(gè)應(yīng)用之間的共享配置。
Spring Cloud Alibaba Nacos Discovery
在注冊(cè)這一塊,我們支持了HeartbeatEvent事件,該事件會(huì)在 Spring Cloud 體系中的網(wǎng)關(guān)所使用。支持了HeartbeatEvent事件也就意味著 Nacos Discovery 目前也兼容了 Zuul 和 Spring Cloud Gateway。
同時(shí)還有一些其它額外的改進(jìn):
-
可以選擇使用
@DiscoveryClient注解,引入 starter 之后不使用該注解也會(huì)自動(dòng)進(jìn)行服務(wù)的注冊(cè)。 -
支持 namespace 隔離注冊(cè)數(shù)據(jù)(Nacos Client 0.8.0 或以上版本即可支持)。
5. Spring Cloud Alibaba Sentinel
組件集成
上個(gè)版本發(fā)布之后,Sentinel 組件就已經(jīng)對(duì) Spring 體系中的客戶端組件提供了比較好的支持了。
-
RestTemplate:構(gòu)造的時(shí)候加上
@SentinelRestTemplate會(huì)額外獲取 Sentinel 的保護(hù)。 -
Feign:引入 openfeign 依賴后,打開(kāi)
feign.sentinel.enabled=true開(kāi)關(guān)再配合 Sentinel 的資源即可使用。
新版本 Sentinel 組件對(duì) Zuul 1.x 網(wǎng)關(guān)進(jìn)行了集成,使用方式也非常地簡(jiǎn)單,只需要針對(duì) url 進(jìn)行資源的設(shè)置即可:比如使用 Zuul 后訪問(wèn)/provider1/hello服務(wù),那么對(duì)應(yīng)的資源名是/provider1/hello。同時(shí)也提供RequestOriginParser進(jìn)行 origin 的設(shè)置,UrlCleaner進(jìn)行資源的 clean、ZuulBlockFallbackProvider對(duì)BlockException的處理邏輯這些 "配套" 的方式來(lái)讓我們更加方便地使用 Sentinel 對(duì) Zuul 進(jìn)行限流降級(jí)處理。
關(guān)于 Spring Cloud Gateway 網(wǎng)關(guān)的支持,會(huì)在 Sentinel 1.6 版本支持。
功能優(yōu)化
-
優(yōu)化了 RestTemplate 的降級(jí)處理,這是因?yàn)槠鋬?nèi)部提供了
ResponseErrorHandler用于解析 Response 信息,并判斷是否是一個(gè)錯(cuò)誤請(qǐng)求。Sentinel 對(duì) RestTemplate 的降級(jí)處理跟該策略進(jìn)行了融合。 -
SentinelEndpoint內(nèi)部展示的信息更加完善,包括了應(yīng)用名,日志所在目錄,日志名策略,dashboard 地址,metrics 文件大小,客戶端 ip,數(shù)據(jù)源客戶端心跳時(shí)間等等信息。 -
外部化配置更加完善,詳情可以參考 Wiki(地址:https://github.com/spring-cloud-incubator/spring-cloud-alibaba/wiki/Sentinel#more)。
Bug 解決
-
@SentinelRestTemplate在某些場(chǎng)景下不生效。 -
支持 Spring Cloud 官方提供的
@EnableCircuitBreaker注解。 -
解決動(dòng)態(tài)數(shù)據(jù)源在首次加載情況下規(guī)則數(shù)據(jù)不存在的話推送失敗的問(wèn)題(數(shù)據(jù)源外部化配置添加了
rule-type字段)。
6. SpringCloud Alibaba Dubbo
Dubbo 作為成熟的 RPC 框架,其易用性、擴(kuò)展性和健壯性已得到業(yè)界的認(rèn)可。Dubbo 與 Spring Cloud 并非競(jìng)爭(zhēng)關(guān)系,Dubbo Spring Cloud 的出現(xiàn)使得 Dubbo 生態(tài)體系發(fā)生了巨大變化,它作為 Spring Cloud Alibaba 的最核心組件,完全地?fù)肀?Spring Cloud 技術(shù)棧,不僅保持 Spring Cloud 原生特性,而且提供更為完善的 Dubbo 服務(wù)治理能力。簡(jiǎn)言之,Dubbo Spring Cloud 對(duì) Spring Cloud 技術(shù)棧所帶來(lái)的革命性變化。
通過(guò)以下表格,簡(jiǎn)要地對(duì)比 Spring Cloud 與 Dubbo Spring Cloud 的功能特性:
更多的特性細(xì)節(jié),請(qǐng)參考下文的“功能特性” 部分。
版本支持
由于 Spring 官方宣布 Spring Cloud Edgware (下文簡(jiǎn)稱(chēng)為 “E” 版) 將在 2019 年 8 月 1 號(hào)后停止維護(hù),因此,目前 Dubbo Spring Cloud 發(fā)布版本并未對(duì) “E” 版提供支持,僅為 Finchley 與 Greenwich (下文分別簡(jiǎn)稱(chēng)為 “F” 版和 “G” 版) 開(kāi)發(fā),同時(shí)也建議和鼓勵(lì) Spring Cloud 用戶更新至 “F” 版或 “G” 版。
同時(shí),Dubbo Spring Cloud 基于 Apache Dubbo Spring Boot 2.7.1 開(kāi)發(fā)(最低 Java 版本為 1.8),提供完整的 Dubbo 注解驅(qū)動(dòng)、外部化配置以及 Production-Ready 的特性。(詳情請(qǐng)參考:https://github.com/apache/incubator-dubbo-spring-boot-project)
以下表格將說(shuō)明 Dubbo Spring Cloud 版本關(guān)系映射關(guān)系:
功能特性
-
Dubbo 使用 Spring Cloud 服務(wù)注冊(cè)與發(fā)現(xiàn)
Dubbo Spring Cloud 基于 Spring Cloud Commons 抽象實(shí)現(xiàn) Dubbo 服務(wù)注冊(cè)與發(fā)現(xiàn),應(yīng)用只需增添外部化配置屬性 “dubbo.registry.address = spring-cloud://localhost”,就能輕松地橋接到所有原生 Spring Cloud 注冊(cè)中心,包括:
-
Nacos
-
Eureka
-
Zookeeper
-
Consul
Dubbo Spring Cloud 將在下個(gè)版本支持 Spring Cloud 注冊(cè)中心與 Dubbo 注冊(cè)中心并存,提供雙注冊(cè)機(jī)制,實(shí)現(xiàn)無(wú)縫遷移。
-
Dubbo 作為 Spring Cloud 服務(wù)調(diào)用
默認(rèn)情況,Spring Cloud Open Feign 以及@LoadBalancedRestTemplate作為 Spring Cloud 的兩種服務(wù)調(diào)用方式。Dubbo Spring Cloud 為其提供了第三種選擇,即 Dubbo 服務(wù)將作為 Spring Cloud 服務(wù)調(diào)用的同等公民出現(xiàn),應(yīng)用可通過(guò) Apache Dubbo 注解@Service和@Reference暴露和引用 Dubbo 服務(wù),實(shí)現(xiàn)服務(wù)間多種協(xié)議的通訊。同時(shí),也可以利用 Dubbo 泛化接口輕松實(shí)現(xiàn)服務(wù)網(wǎng)關(guān)。
-
Dubbo 服務(wù)自省
Dubbo Spring Cloud 引入了全新的服務(wù)治理特性 - 服務(wù)自省(Service Introspection),其設(shè)計(jì)目的在于最大化減輕注冊(cè)中心負(fù)載,去 Dubbo 注冊(cè)元信息中心化。假設(shè)一個(gè) Spring Cloud 應(yīng)用引入 Dubbo Spring Boot Starter,并暴露 N 個(gè) Dubbo 服務(wù),以 Dubbo Nacos 注冊(cè)中心為例,當(dāng)前應(yīng)用將注冊(cè) N+1 個(gè) Nacos 應(yīng)用,除 Spring Cloud 應(yīng)用本身之前,其余 N 個(gè)應(yīng)用均來(lái)自于 Dubbo 服務(wù),當(dāng) N 越大時(shí),注冊(cè)中心負(fù)載越重。因此,Dubbo Spring Cloud 應(yīng)用對(duì)注冊(cè)中心的負(fù)載相當(dāng)于傳統(tǒng) Dubbo 的 N 分之一,在不增加基礎(chǔ)設(shè)施投入的前提下,理論上,使其集群規(guī)模擴(kuò)大 N 倍。當(dāng)然,未來(lái)的 Dubbo 也將提供服務(wù)自省的能力。
-
Dubbo 遷移 Spring Cloud 服務(wù)調(diào)用
盡管 Dubbo Spring Cloud 完全地保留了原生 Spring Cloud 服務(wù)調(diào)用特性,不過(guò) Dubbo 服務(wù)治理的能力是 Spring Cloud Open Feign 所不及的,如高性能、高可用以及負(fù)載均衡穩(wěn)定性等方面。因此,建議開(kāi)發(fā)人員將 Spring Cloud Open Feign 或者@LoadBalancedRestTemplate遷移為 Dubbo 服務(wù)。考慮到遷移過(guò)程并非一蹴而就,因此,Dubbo Spring Cloud 提供了方案,即@DubboTransported注解。該注解能夠幫助服務(wù)消費(fèi)端的 Spring Cloud Open Feign 接口以及@LoadBalancedRestTemplateBean 底層走 Dubbo 調(diào)用(可切換 Dubbo 支持的協(xié)議),而服務(wù)提供方則只需在原有@RestController類(lèi)上追加 Dubbo@Servce注解(需要抽取接口)即可,換言之,在不調(diào)整 Feign 接口以及RestTemplateURL 的前提下,實(shí)現(xiàn)無(wú)縫遷移。如果遷移時(shí)間充分的話,建議使用 Dubbo 服務(wù)重構(gòu)系統(tǒng)中的原生 Spring Cloud 服務(wù)的定義。
進(jìn)階閱讀
了解更多 Dubbo Spring Cloud 的特性以及設(shè)計(jì)細(xì)節(jié),可訪問(wèn):
Spring Cloud Alibaba wiki:
https://github.com/spring-cloud-incubator/spring-cloud-alibaba/wiki
Dubbo 的博客:
http://dubbo.apache.org/zh-cn/blog/index.html
完整示例
如果您需要進(jìn)一步了解 Dubbo Spring Cloud 使用細(xì)節(jié),可參考:
官方 Samples:
https://github.com/spring-cloud-incubator/spring-cloud-alibaba/tree/master/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples
其子模塊說(shuō)明如下:
-
spring-cloud-dubbo-sample-api:API 模塊,存放 Dubbo 服務(wù)接口和模型定義
-
spring-cloud-dubbo-provider-web-sample:Dubbo Spring Cloud 服務(wù)提供方示例(Web 應(yīng)用)
-
spring-cloud-dubbo-provider-sample:Dubbo Spring Cloud 服務(wù)提供方示例(非 Web 應(yīng)用)
-
spring-cloud-dubbo-consumer-sample:Dubbo Spring Cloud 服務(wù)消費(fèi)方示例
-
spring-cloud-dubbo-servlet-gateway-sample:Dubbo Spring Cloud Servlet 網(wǎng)關(guān)簡(jiǎn)易實(shí)現(xiàn)示例
問(wèn)題反饋
如果您在使用的過(guò)程中遇到任何問(wèn)題,請(qǐng)內(nèi)容反饋至
https://github.com/spring-cloud-incubator/spring-cloud-alibaba/issues
7. Spring Cloud Alibaba Cloud SMS
短信服務(wù)(Short Message Service)是阿里云為用戶提供的一種通信服務(wù)的能力。
我們規(guī)范了短信服務(wù)對(duì)應(yīng)的一些方法在ISmsService接口中,提供了鑒權(quán)、短信單次/批量發(fā)送、查詢、短信上行/下行監(jiān)聽(tīng)器注冊(cè)等功能。
可以在配置文件中配置對(duì)應(yīng)的 ak、sk、上行,下行隊(duì)列名。程序?qū)?yīng)的類(lèi)中就可以注入ISmsService,然后即可進(jìn)行短信的相關(guān)操作。
What's Next
Sentinel 目前已經(jīng)支持 reactive,并且會(huì)在 Sentinel 發(fā)布 1.6 版本支持 Spring Cloud Gateway 之后,進(jìn)行 WebFlux 和 Spring Cloud Gateway 的適配。同時(shí) RocketMQ Binder 將會(huì)適配 MessageSource 進(jìn)行消息的拉取。
致謝
Spring Cloud Alibaba 從開(kāi)源到發(fā)布第一個(gè)正式版本,受到了很多社區(qū)同學(xué)的關(guān)注。社區(qū)的每一個(gè) Issue ,每一個(gè) PR,都是對(duì)整個(gè)項(xiàng)目的幫助,都在為建設(shè)更好用的 Spring Cloud 添磚加瓦。我們希望有更多社區(qū)的同學(xué)加入進(jìn)來(lái),一起把項(xiàng)目做好。
我們真心地感謝為這個(gè)項(xiàng)目提出過(guò) Issue 和 PR 的同學(xué),以及這些 contributor:
@HaojunRen,@xiejiashuai,@mengxiangrui007,@yunzheng1228,@tigerMoon,@slievrly,@mostcool,@pig4cloud,@carlWangTao,@yanglbme,@codewaltz1994,@caojiele,@JakeConnors376W,@Harris2012,@justlive1,@毛建偉(wb-maojianwei),@bluesword12350
最后還要特別感謝 Spring Cloud Alibaba 生態(tài)中的其他開(kāi)源項(xiàng)目:
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
相關(guān)鏈接
- Spring Cloud Alibaba 的詳細(xì)介紹:點(diǎn)擊查看
- Spring Cloud Alibaba 的下載地址:點(diǎn)擊下載
總結(jié)
以上是生活随笔為你收集整理的Spring Cloud Alibaba 发布 GA 版本,新增 4 个模块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 生命在地球形成之前可能就已经“来到了”太
- 下一篇: 亚马逊的AI监工说,你不是世界首富贝佐斯