1. 程式人生 > 實用技巧 >Spring Cloud 2020.0.0 正式釋出,對開發者來說意味著什麼?

Spring Cloud 2020.0.0 正式釋出,對開發者來說意味著什麼?

作者 |
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 以後呢?如何繼續發展?

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

核心變化解讀

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 檔案前後版本主要差異的對比圖,一目瞭然:

  • 舊版本的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 程式設計之上。

另外 Spring 官方佈道師 Josh Long 最近出版一本 《Reactive Spring》,如果想深入瞭解 reactor ,不妨深入閱讀。

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

Spring Cloud 2020 構建在 Spring Boot 2.4 之上,擁有更強的配置檔案處理機制可以非常好的適配雲原生 (例如可以直接應用 kubernetes 的 configMap )配置;內建 Docker 映象構建和分層分析優化能力。

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

元件替代方案

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

Spring Cloud LoadBalancer

以上替代品中,你可能最陌生、最好奇的是Spring Cloud Loadbalancer,它一度只是 Spring Cloud 孵化器裡的一個小專案,並且一度擱淺。後再經過重啟,發展,現行使其偉大使命,正式用於完全替換 Ribbon,成為 Spring Cloud 負載均衡器唯一實現

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

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

Spring Cloud Circuit Breaker

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

這裡主要介紹一下 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),最核心的程式碼不過百行。

  • 所以對於開發者來說無論是之前 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 實現。

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

推薦閱讀