Spring Cloud 2020.0.0 正式發佈,對開發者來講意味着什麼?

頭圖.png

做者 |  YourBatman  在線教育領域資深架構師,Spring Framework 開源貢獻者 冷冷  雲集架構師、開源項目 pig 負責人、Spring Cloud Alibaba Committer 來源|阿里巴巴雲原生公衆號html

北京時間 2020 年 12 月 22 日深夜,Spring Cloud 2020.0.0 版本正式發佈。2020.0.0 是第一個使用新版本命名方案的發命名的 Spring Cloud 發行版本。除了肉眼可見的更開發者友好的命名方式,此次發佈全面拋棄了 Netflix 技術棧,而且是一個長期維護的主要版本。這對開發者來講意味着什麼呢?今天咱們邀請到開源社區活躍做者 YourBatman 和 Spring Cloud Alibaba committer 冷冷來和你們解讀下此次發版的重要變化,更重要的是和你們聊聊咱們做爲開發者後續應該如何應對react

Spring Cloud 版本管理

在 Spring Cloud 2020.0.0 正式發佈以前,Spring Cloud 的 Release Train 名稱採用的是倫敦地鐵站名稱來命名的,並以字母表順序排列,如:Hoxton、Greenwich、Ilford 等,這種命名方式存在兩個致命問題:git

  • 對非英語母語國家,好比中國就很是不友好,沒法快速理清版本號關係github

  • 英文字母就 26 個,假若版本號到了 Z 之後呢?如何繼續發展?web

1.png

Spring Cloud 遵循 Pivotal OSS support policy 協議對主要版本提供三年的支持。此外,在 Spring Cloud 的主要或次要版本發佈後,若存在嚴重的 bug 和安全問題,就會再維護一段時間(6-12 個月不等)。參考如下表格:spring

2.jpg

3.jpg

核心變化解讀

Spring Cloud 2020.0.0 做爲一個主要版本,帶來了衆多顯著的變化,其中進行了一些阻斷式更新(不向下兼容)是本文最大看點,來吧上菜。編程

核心變化一:再見了,Netflix

早在 2018 年,Spring Cloud 在其 Roadmap 裏就宣佈將要終結的一些庫/版本,其中最重要的就是指 Spring Cloud Netflix 項目進入維護模式,而後計劃在 2020 年徹底移除。bootstrap

Spring Cloud 作出這樣的決定其實也是不見得是主動的。咱們知道 Spring Cloud 一直以來把 Netflix OSS 套件做爲其官方默認的一站式解決方案,那時的 Netflix OSS 套件巴不得能夠跟 Spring Cloud 劃等號。而 Netflix 公司在 2018 年先後宣佈其核心組件 Hystrix、Ribbon、Zuul、Archaius 等均進入維護狀態安全

時至今日,Spring Cloud 2020.0 正式發佈,在這個主要版本里,按既定計劃終於對 spring-cloud-netflix 動刀了。我幫你畫了幅 spring-cloud-netflix-dependencies 的 xml 文件先後版本主要差別的對比圖,一目瞭然:架構

4.jpg

  • 舊版本的 spring-cloud-netflix-dependencies 管理着 Netflix 全部組件,包括 Hystrix、Ribbon、Zuul、Eureka 等。而自 2020.0 版本起它有且只管理 Eureka(包括 Server 和 Client)。

核心變化二:繼續業界標準制定,完善抽象定義

可能對於大部分 Spring Cloud 應用開發者, 對於 spring-cloud-commons 模塊大概很陌生。此模塊做爲 Spring Cloud 技術棧的核心,提供了整套解決方案最重要的服務註冊與發現、負載均衡、上下文管理等的統一抽象。spring cloud alibaba 等全家桶實現都是 spring-cloud-commons 的具體實現。此版本對上文下啓動器的默認啓動行文、負載均衡器的核心代碼進行相關的跳轉。

spring-cloud-commons
  ├── actuator
  ├── circuitbreaker
  ├── discovery
  ├── hypermedia
  ├── loadbalancer
  └── serviceregistry

核心變化三:強推 reactive 異步體系

reactor 是 reactive(反應式編程)的實現框架,也是 Pivotal 團隊的做品。

不管是 Spring Cloud Gateway 仍是 Spring Cloud Loadbalancer 這些都是構建在 reactor 編程之上。

5.png

另外 Spring 官方佈道師 Josh Long 最近出版一本 《Reactive Spring》,若是想深刻了解 reactor ,不妨深刻閱讀。

核心變化四:更好的擁抱雲原生能力

Spring Cloud 2020 構建在 Spring Boot 2.4 之上,擁有更強的配置文件處理機制能夠很是好的適配雲原生 (例如能夠直接應用 kubernetes 的 configMap )配置;內置 Docker 鏡像構建和分層分析優化能力。

若是團隊正在使用 kubernetes,那麼 spring-cloud-kubernetes 也將是 Netflix 的不錯替代方案。

6.jpg

組件替代方案

Spring Cloud 既然把 Netflix 套件大刀闊斧的砍掉了,那總歸得有替代方案吧。那是必然的,Spring Cloud 團隊給咱們推薦了用於替代的組件:

7.jpg

Spring Cloud LoadBalancer

以上替代品中,你可能最陌生、最好奇的是 Spring Cloud Loadbalancer,它一度只是 Spring Cloud 孵化器裏的一個小項目,而且一度擱淺。後再通過重啓,發展,現行使其偉大使命,正式用於徹底替換 Ribbon,成爲 Spring Cloud 負載均衡器惟一實現

8.png

如圖,負載均衡抽象 LoadBalancerClient 接口有兩個實現,而到了 Spring Cloud 2020.0 版本後,BlockingLoadBalancerClient 就是惟一實現了。

Spring Cloud LoadBalancer 目前僅支持輪詢負載均衡策略,相對於 Ribbon 多種高可用策略仍是過於簡單。

Spring Cloud Circuit Breaker

Circuit Breaker 提供兼容多個斷路器組件實現的抽象,容許開發人員選擇最熟悉的斷路器組件進行業務開發。

9.png

這裏主要介紹一下 Sentinel、Resilience4j ,  Sentinel  做爲 Spring Cloud Alibaba 重要組件,經過引入 spring-cloud-starter-alibaba-sentinel  便可擁有熔斷降級、流控等能力,提供圖形化控制檯,做爲同類組件 Resilience4j 是基於函數式設計的輕量級容錯庫,提供熔斷、限流、隔離等能力,不過官方提供的 spring-cloud-starter-circuitbreaker-resilience4j 插件能力有限且不能直接使用控制檯管理(若需監控須要額外的 Micrometer 服務)。

Spring Cloud Alibaba 適配

  • 因爲對 Ribbon 組件的依賴,目前最新的 Spring Cloud Alibaba 2.2.3 並不能徹底兼容 Spring Cloud 2020,僅須要微調便可。
// 排除 Ribbon (固然也能夠排查 maven 依賴)
@EnableAutoConfiguration(excludeName = 
"org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration")
  • 增長 spring cloud loadbalancer 依賴。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
  • 涉及加載配置中心的服務須要 啓動 bootstrap (2020 默認關閉)。
<!--增長此依賴便可完成啓動-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

開發者如何面對和擁抱變化

正如上文所述 Spring Cloud 提供了強大的封裝和抽象能力,例如 spring-cloud-circuit-breaker 提供了對常見容錯組件的封裝,在使用過程當中也不須要考慮 @hystrixcommand``@SentinelResource 組件原生註解。

public static class DemoControllerService {
    private RestTemplate rest;
    private CircuitBreakerFactory cbFactory;
    public String slow() {
        return cbFactory.create("slow").run(() -> rest.getForObject("/slow", String.class), throwable -> "fallback");
    }
}
  • 經過此類抽象底層實現組件的變化 ,對於上層使用 Spring Cloud 全家桶的用戶其實影響不大(例如《Spring Cloud Alibaba 遷移指南:零代碼從 Eureka 遷移到 Nacos》)。

  • 關於學習 spring-cloud-commns 筆者不建議直接閱讀源碼(部分 reactor 代碼容易勸退),建議 DEBUG 具體實現的形式進行調試(例如 NacosDiscoveryClient),最核心的代碼不過百行。

10.png

  • 因此對於開發者來講不管是以前 Netflix 仍是選擇 Alibaba 技術棧,最核心的仍是把握 spring-cloud-commons 抽象,掌握 Spring Cloud 標準尤其重要。

總結

Spring Cloud 2020.0.0 是 Spring Cloud 的主要版本,是很是重要的存在,升級、改變也是巨大的。特別體如今 Netflix 模塊的所有移除、Spring Cloud 啓動方式變了等等。伴隨着 Spring Boot 2.4.x 以及 Spring Cloud 2020.0 的發佈,而且棄用 Netflix OSS 套件後,必將走入一個新的深度編程體驗,滿懷驚喜,非常期待。

固然咱們仍是很是推薦你們使用 Spring Cloud Alibaba 全家桶的,目前 Spring Cloud Alibaba 開源兩年時間,已經從官方畢業,不只在關注度、活躍上表現搶眼,更經過發佈知行動手實驗室 start.aliyun.com 提供沙箱和 Java 工程腳手架Arthas 代碼診斷工具等成爲工具鏈最完善的 Spring Cloud 實現。

11.png

數據來源:http://www.gharchive.org/ 近2年GitHub開發者行爲數據 活躍度計算公式:https://github.com/X-lab2017/github-analysis-report-2019/blob/master/REPORT.md

推薦閱讀

活動推薦

12.png

2021 年的首場 Spring Cloud Alibaba Meetup 城市站,咱們邀請到了阿里中間件分佈式事務團隊負責人季敏、《深刻理解 Spring Cloud 與實戰》做者方劍、Apache Dubbo PMC 方銀城、Nepxion 開源社區創始人任浩軍、知名互聯網公司中間件架構師童子龍 、七牛雲技術經理姜智,一塊兒暢聊 Go 語言、Spring 生態發展趨勢,深度分享知名互聯網教育公司微服務實戰!點擊此處便可報名參與~

相關文章
相關標籤/搜索