Spring Cloud 2020.0.0 正式發布,對開發者來說意味着什么?


頭圖.png

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

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

Spring Cloud 版本管理

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

  • 對非英語母語國家,比如中國就非常不友好,無法快速理清版本號關系

  • 英文字母就 26 個,倘若版本號到了 Z 以后呢?如何繼續發展?

1.png

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

2.jpg

3.jpg

核心變化解讀

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

核心變化一:再見了,Netflix

早在 2018 年,Spring Cloud 在其 Roadmap 里就宣布將要終結的一些庫/版本,其中最重要的就是指 Spring Cloud Netflix 項目進入維護模式,然后計划在 2020 年完全移除。

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

推薦閱讀


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM