4 年 46 個版本,一文讀懂 Spring Cloud 發展歷史

4 年 46 個版本,一文讀懂 Spring Cloud 發展歷史

作者 | 方劍

頭圖 | CSDN 下載自東方 IC

出品 | CSDN(ID:CSDNnews)

Spring Cloud 自 2016 年 1 月發佈第一個 Angel.SR5 版本,到目前 2020 年 3 月發佈 Hoxton.SR3 版本,已經歷經了 4 年時間。這 4 年時間裡,Spring Cloud 一共發佈了 46 個版本,支持的組件數從 5 個增加到 21 個。Spring Cloud 在 2019 年 12 月對外宣佈後續 RoadMap:

  • 下一個版本 Ilford 版本是一個大版本。這個版本基於 Spring Framework 5.3 & Spring Boot 2.4,會在 2020 Q4 左右發佈;

  • Ilford 版本會刪除處於維護模式的項目。目前處於維護模式的 Netflix 大部分項目都會被刪除(spring-cloud-netflix Github 項目已經刪除了這些維護模式的項目);

  • 簡化 Spring Cloud 發佈列車。後續 IaasS 廠商對應的 Spring Cloud 項目會移出 Spring Cloud 組織,各自單獨維護(spring-cloud-azure 一直都是單獨維護,spring-cloud-alibaba 孵化在 Spring Cloud 組織,畢業後單獨維護);

  • API 重構,會帶來重大的改變(Spring Cloud Hoxton 版本新增了 Spring Cloud Circuit Breaker 用於統一熔斷操作的編程模型和 Spring Cloud LoadBalanacer 用於處理客戶端負載均衡並代替 Netflix Ribbon)。

這個 RoadMap 可以說是對 Spring Cloud 有著非常大的變化。

4 年 46 个版本,一文读懂 Spring Cloud 发展历史

什麼是 Spring Cloud?

首先先澄清「Spring Cloud = Spring Cloud Netflix」這個觀點是錯誤的。官方對 Spring Cloud 的定義是提供分佈式應用開發的一套共用模式,這個模式也可以理解成一套統一的抽象編程模型,底層的實現可以進行切換,比如可以從 Netflix 切換成 Alibaba,從 Zookeeper 切換成 Consul。

這套共用的模式有哪些呢?(可能比大家想象的要多。大家平時對常用的功能比較關心,實際上 Spring Cloud 整個體系內容非常還是多的。)

  • 服務註冊/發現:Service Registry/Discovery。spring-cloud-commons 模塊對服務註冊/發現模型進行統一;

  • 分佈式配置:Configuration Management。spring-core 模塊對配置有 Environment 和 PropertySource 抽象,各個配置中心可以添加各自實現的 PropertySource;

  • 服務熔斷:Circuit Breaker。spring-cloud-commons 模塊對熔斷器模式客戶端調用模型進行統一(早期有個單獨的項目 spring-cloud-circuit-breaker,後來合併到 spring-cloud-commons 模塊);

  • 消息總線:Message Bus。spring-cloud-bus 模塊定義遠程事件,用來連接分佈式系統上的各個節點,bus 強依賴 spring-cloud-stream 項目。

  • 分佈式消息:Distributed Messaging。spring-cloud-stream 項目對消息編程模型統一;

  • 客戶端負載均衡:Client Load Balancing。早期依賴 Netflix Ribbon 項目,目前可選擇 spring-cloud-loadbanacer 模塊(後續 Netflix Ribbon 不再維護);

  • 服務調用:Service-to-service calls。OpenFeign 提供聲明式接口的方式進行服務調用;RestTemplate 提供基於服務名方式的服務調用;

  • 網關:Gateway。早期使用 Netflix Zuul,現在推薦使用 Spring Cloud Gateway;網關總體來說並不算是一個共用的模式,只是一個實現功能的組件;

  • 鏈路追蹤:Tracing。Spring Cloud Sleuth 對 Spring Cloud 各個客戶端埋點進行鏈路追蹤,可以跟 Zipkin 整合;

  • 連接器:Spring Cloud Connectors。Connectors 表示跟 IaaS 廠商的連接器,如果本地開發使用本地 Eureka 和 MySQL,部署到雲上(Cloud Foundry)這些地址會被自動替換成雲上的地址(前期是購買這些服務)。這是 Cloud Foundry 的 Spring Cloud Connectors,當然還有其他 IaaS 廠商的實現比如 IBM、AWS;

  • FaaS:Spring Cloud Function。Spring Cloud 與 Serverless 集成關鍵的一個項目;

  • 任務調度:Spring Cloud Task 用於任務運行,可以在本地、雲端甚至 Kubernetes 上運行;

  • 數據流:Spring Cloud Data Flow 可以配合 Spring Cloud Stream 完成流處理,配合 Spring Cloud Task 完成批處理,使用 Spring Cloud Deployer 進行應用的部署。

當然還有其他沒有涉及到的模塊比如 Spring Cloud Contract、Spring Cloud Open Service Broker、Spring Cloud Skipper、Spring Cloud Security 大家可以自行翻看資料瞭解。

這些功能也是 Spring Cloud 這 4 年發展迭代起來的。最早期 Spring Cloud 在統一編程模型上只有服務註冊/發現以及配置管理。後續陸續添加了 Spring Cloud Circuit Breaker 統一熔斷器編程模型,Spring Cloud Stream/Bus 消息編程模型統一,Spring Cloud OpenFeign 以聲明式接口進行服務調用,Spring Cloud LoadBalancer 客戶端負載均衡。

4 年 46 个版本,一文读懂 Spring Cloud 发展历史

Spring Cloud 現狀

回顧 Spring Cloud 的發展歷史,Spring Cloud 一度泛指 Spring Cloud Netflix,無論是 Spring 的母公司 Pivotal(VMWare) 對應的商業化產品 Cloud Foundry 內部的 Spring Cloud Services(Spring Cloud 商業化服務) 支持 Netflix Eureka,Netflix Hystrix,還是 Pivotal 官網 blog 上與 Netflix 相互背書,或者是 Spring Cloud 服務註冊/發現模型借鑑 Netflix Eureka;可見兩者關係十分緊密。

隨著 Netflix 宣佈 Eureka 2.0 不再開發,Hystrix、Ribbon、Archaius 不再維護,Zuul 被 Spring Cloud Gateway 代替。Spring Cloud 也宣佈這些模塊對應的在 spring-cloud-netflix 項目裡的模塊也不再維護,並且在 RoadMap 中宣佈 Ilford 版本發佈的時候刪除這些維護模塊。Netflix 在 Spring Cloud 歷史中會逐漸消失。

4 年 46 个版本,一文读懂 Spring Cloud 发展历史

不過不用太擔心。這 4 年的發展讓 Spring Cloud 規範目前的實現者也不單單隻有 Netflix 這一套。目前有 Spring Cloud Alibaba、Spring Cloud Consul、Spring Cloud Zookeeper、Spring Cloud Kubernetes,甚至 Spring Cloud 官方也有對應的實現組件比如 Spring Cloud Config 集成了 Git、SVN 或 Database 提供配置服務、Spring Cloud Stream RabbitMQ/Kafka 提供消息抽象的實現者。

這是目前 Spring Cloud 各個實現的總覽:

4 年 46 个版本,一文读懂 Spring Cloud 发展历史

目前非常不建議大家繼續使用 Spring Cloud Netflix 這套實現。因為目前 spring-cloud-netflix 項目裡的維護項目已經在 Github 上已經被刪除。這意味著 Spring Cloud Netflix "刪庫" 動作已經開始執行了。

4 年 46 个版本,一文读懂 Spring Cloud 发展历史
4 年 46 个版本,一文读懂 Spring Cloud 发展历史

Spring Cloud Hoxton 版本介紹

Spring Cloud Hoxton 版本在 2019 年 11 月發佈,這是目前 Spring Cloud 最新的大版本。主要的特性包括:

  • 基於 Spring Boot 2.2.1.RELEASE(全局懶加載、性能、CP 構造器……);

  • 全新的熔斷編程模型:Spring Cloud Circuit Breaker;

  • 新客戶端負載均衡組件:Spring Cloud LoadBalancer;

  • 繼續對 Reactive 支持,服務發現支持 ReactiveDiscoveryClient,全新的熔斷編程模型支持 ReactiveCircuitBreaker,新客戶端負載均衡使用 ReactiveLoadBalancer。

Spring Cloud Circuit Breaker 統一了熔斷器編程模型,這是一段使用 Sentinel CircuitBreaker 進行保護的代碼:

<code>CircuitBreaker circuitBreaker = factory.create("sentinel");
return circuitBreaker.run( -> {
return restTemplate.getForObject("https://httpbin.org/status/500", String.class);
}, throwable -> {
if(throwable instanceof DegradeException) {
return "degrade by sentinel";
}
return "biz/system error: " + throwable.getMessage;
});/<code>

run 方法第一個參數是一個 Supplier,裡面可以執行業務邏輯;第二個參數是一個 Function,入參類型是 Throwable,出參類型跟 Supplier 裡的泛型一致,表示業務邏輯返回的結果:

<code>public interface CircuitBreaker {
default T run(Supplier toRun) {
return run(toRun, throwable -> {
throw new NoFallbackAvailableException("No fallback available.", throwable);
});
};

T run(Supplier toRun, Function<throwable> fallback)
}/<throwable>
/<code>

下面是一個 Hystrix CircuitBreaker 進行保護的代碼(兩者唯一的區別是對於熔斷髮生後異常處理邏輯不一致):

<code>CircuitBreaker circuitBreaker = factory.create("hystrix");
return circuitBreaker.run( -> {
return restTemplate.getForObject("https://httpbin.org/status/500", String.class);
}, throwable -> {
if (throwable instanceof RuntimeException && throwable.getMessage.toLowerCase.contains("open")) {
return "degrade by hystrix: " + throwable.getMessage;
}
return "biz/system error: " + throwable.getMessage;
});/<code>

Netflix Ribbon 已經不再維護,新組件 Spring Cloud LoadBalancer 同樣可以完成客戶端負載均衡:

4 年 46 个版本,一文读懂 Spring Cloud 发展历史

Spring Cloud LoadBalancer 目前還比較簡單,支持的負載均衡策略有限,建議大家暫時還是使用 Ribbon,後續再觀察。相信 Spring Cloud LoadBalancer 後續會越來越完善。

4 年 46 个版本,一文读懂 Spring Cloud 发展历史

Spring Cloud Alibaba

與 Netflix 的“刪庫”不同,Spring Cloud Alibaba 是阿里中間件團隊主導的一個新生項目,正處於高速迭代中。

其次,對於中國用戶來說,Spring Cloud Alibaba 還有一個非常特殊的意義:它將曾經紅極一時的 Dubbo,以及阿里巴巴的強力消息中間件 RocketMQ 融入 Spring Cloud 體系。還在糾結於如何讓這些共存的團隊,你們所面臨過的各種困難與問題,馬上就會迎刃而解。不用再煩惱是不是要擴展 Dubbo 的註冊中心,還是自己為 RocketMQ 實現一套的 Spring Cloud Stream 的 Binder 等等問題。

再次,對於 Spring Cloud Alibaba 的上手學習成本很低。如果您已經是 Spring Cloud 的用戶,那麼恭喜您,在 Spring Cloud Common 的抽象和 Spring Cloud Alibaba 團隊的努力下,你會非常容易、甚至不需要改變多少編碼模式,就能適應它。

今年 Spring Cloud Alibaba 會繼續跟 Spring Cloud 加強合作。目前 Spring Cloud Alibaba 官網在 Spring 官網已經上線,且對應的 Spring Cloud Circuit Breaker Sentinel、Spring Cloud Stream RocketMQ Binder 模塊也在 Spring Cloud Circuit Breaker 和 Spring Cloud Stream 項目主頁被推薦使用。

最近 Spring Cloud Alibaba 也已經在 Spring Initializr 上線:

4 年 46 个版本,一文读懂 Spring Cloud 发展历史

但是,生成的工程中骨架中,只有組件座標信息,缺少對應的使用方法和 demo 代碼;於是,開發者還是需要去尋找相關使用教程,或者樣例代碼;如果找的不對,或者是版本不匹匹配,還需要花費不少時間去排查和解決問題;這些問題都在無形中增加用戶的工作量。

我們將對軟件工程的抽象層次自上而下進行切分,會得到如下的幾個層級:行業、解決方案、應用、功能、組件;明顯的,start.spring.io 目前只能提供組件級別的支持。再將組件這層展開,會發現這樣一個生命週期:組件引入、組件配置、功能開發、線上運維。start.spring.io 也只實現了“組件引入”這一功能。

我們的目標是“讓阿里雲成為廣大 java 開發者最好用的雲”。要實現這個目標,是否可以再向前走幾步,在解決“組件引入”問題的基礎上,將組件的典型使用方法、樣例代碼、使用說明也加入到工程中呢?基於這種思考,我們上線了自己的 bootstrap 站點:start.aliyun.com。

當然,本著不重複造輪子的原則,我們不再構建一套工程生成底層框架,而是使用 Spring Initializr 來實現這部分功能。在此之上專注於增加新特性,實現服務廣大開發者的目標。

在 start.aliyun.com 中,我們為廣大開發者帶來了如下便利特性:

  • 為每個組件提供了單獨的 DemoCode 和對應的配置樣例(本次已發佈);

  • 工程內置說明,減少用戶查找文檔的困難(部分實現);

  • 開發者只需要做減法,而非加法的使用方式(部分實現);

  • 提供多組件集成的解決方案(開發中);

  • 定期跟進 start.spring.io 的更新,方便大家使用到 spring 的最新功能。

未來,我們還需要在助力開發者這條路上繼續發力,不僅僅是做好組件集成的工作,還要需要繼續向上支持,提供更多功能、服務、應用層級的快速構建能力。

作者簡介:方劍,Spring Cloud Alibaba PMC,阿里巴巴雲原生應用平臺高級開發工程師,目前主要負責 Spring Cloud Alibaba 開源相關工作。平時關注分佈式系統、高可用、Spring 生態等相關技術。


分享到:


相關文章: