1. 程式人生 > >Spring Cloud 2020.0.0正式釋出,再見了Netflix

Spring Cloud 2020.0.0正式釋出,再見了Netflix

[TOC] ![](https://img-blog.csdnimg.cn/20201223221110542.png#pic_center) > 分享、成長,拒絕淺藏輒止。關注公眾號【**BAT的烏托邦**】,回覆關鍵字`專欄`有Spring技術棧、中介軟體等小而美的**原創專欄**供以免費學習。本文已被 [https://www.yourbatman.cn](https://www.yourbatman.cn) 收錄。 # ✍前言 你好,我是YourBatman。 北京時間2020-12-22深夜,`Spring Cloud 2020.0.0`版本正式釋出。2020.0.0是第一個使用新版本方案的Spring Cloud發行版本。 關於版本號這裡囉嗦幾句:在這之前,Spring Cloud的Release Train名稱採用的是倫敦地鐵站命名方式,如:Hoxton、Greenwich等。 > 說明:2020.0.0版本又名`Ilford`(地鐵站名),因為此專案3月後才按照新規更名,估計是為了團隊內溝通方便吧,你也可以理解為它僅是一個內部代號而已,方便溝通 雖按照字母表順序排列,但仍存在兩個致命問題: - 對非英語**母語**國家(比如天朝)非常不友好,無法快速理清版本號關係 - A-Z,倘若版本號到Z了呢?如何繼續發展?你品,你細品 ![](https://img-blog.csdnimg.cn/20201223185627672.png#pic_center) Spring團隊意識到了這的確是個問題,因此在今年3月份作出了**改變**。詳情參考我前面寫的一篇文章(**強烈建議**每個進來的你都瞭解下這次規則變更):[Spring改變版本號命名規則:此舉對非英語國家很友好](https://mp.weixin.qq.com/s/ZoUG9h1TndW2QpnPyGeIQA) > 說明:版本號規則變更適用於所有Spring技術棧,包含Spring Framework、Spring Boot、Spring Cloud、Spring Data... 文歸正傳。Spring Cloud早在年初就啟動了該版本的研發工作,並在今年4月份就已經發布了其2020.0.0-M1版本(第一個里程碑版本),直到離2020年結束不到10天了才“憋出”大招,正式RELEASE。 Spring Cloud作為構建在Spring Boot之上的雲端計算框架,我覺得本次難產的原因主要有二: 1. Spring Boot 2.4.0版本2020-11-12才正式RELEASE(Spirng Framework 5.3.0版本2020-10-27才RELEASE) 1. [Spring Framework 5.3.0正式釋出,在雲原生路上繼續發力](https://mp.weixin.qq.com/s/Sw6EqAY0DmF-p2qPoaetUg) 2. [Spring Boot 2.4.0正式釋出,全新的配置檔案載入機制(不向下相容)](https://mp.weixin.qq.com/s/KywpJkLDHZbZTxUf4WFxhw) 2. 改動確實太大,研發、測試、文件編寫工作量都是巨大的 從Spring Framework、Spring Boot、Spring Cloud三者的發版線路圖再一次驗證了我的那句話:**你對Spring Cloud多瞭解源自於你對Spring Boot有多瞭解,你對Spring Boot多瞭解源自於你對Spring Framework有多瞭解**。這就是為何我文章花大量筆墨在Spring Framework上而非Spring Boot上的根本原因,底層通透了,上層運用自如。 ![](https://img-blog.csdnimg.cn/20201223213749175.png#pic_center) ## 版本約定 - Spring Framework:5.3.2 - Spring Boot:2.4.1 - Spring Cloud:2020.0.0 - 以上版本為SC“攜帶”的版本 ![](https://img-blog.csdnimg.cn/2020122406543886.png#pic_center) # ✍正文 有個有趣的現象,截止稿前(2020-12-23 22:00:00)**官網**還並未同步標註好當前最新版本為2020.0.0版(如圖): ![](https://img-blog.csdnimg.cn/20201223214028434.png#pic_center) 其實早在24h之前官方部落格就做出了發版宣告: ![](https://img-blog.csdnimg.cn/20201223214714540.png#pic_center) 並且Maven中央倉庫也已存在最新Jar包(證明你正常引包、使用是沒問題的了): ![](https://img-blog.csdnimg.cn/2020122321485778.png#pic_center) 其實,文件層面不止官網這一處沒有sync最新版本,我就不一一例舉,畢竟不太重要。針對此現象我yy一下,是不是Spring Cloud團隊缺人人手不夠用呢?請問社招嗎?O(∩_∩)O哈哈~ ## Spring Cloud版本管理 版本管理對於軟體開發來說太重要,在Spring Boot出現之前依賴關係、版本管理讓人著實頭大(即使有Spring BOM存在),特別是當出現版本**不適配**時很容易就偷走你一下午甚至一整天的時間。 Spring Cloud作為上層應用框架,底層版本匹配了才能正常work,其中最主要就是和Spring Boot的版本號要對齊。 ### 與Spring Boot版本對應關係 Spring Boot的出現和流行大大緩解了上述些情況,但使用起Spring Cloud時它和Spring Boot的版本對應關係依舊是需要**特別關注**的。為此我幫你總結出了這個表格: Release Train | 釋出時間 | Spring Boot版本 | SC Commons版本 -------- | ----- | ----- | ----- **2020.0.x** | **2020-12** | **2.4.x** | **3.0.0** Hoxton | 2019-07 | 2.2.x, 2.3.x (從SR5起) | 2.2.x Greenwich | 2018-11 | 2.1.x | 2.1.x Finchley | 2017-10 | **2.0.x** | 2.0.x Edgware | 2017-08 | 1.5.x | 1.3.x Dalston | 2017-05 | 1.5.x | 1.2.x Brixton | 2016-09 | 1.3.x | 1.1.x Angel | 2016-05 | 1.2.x | 1.0.x > 說明:對於Spring Cloud內部元件、Spring Boot、Spirng Framework、Security等這個龐大體系的版本對照關係,文章已整理好,下篇發出,請記得蒐藏哦 特別提醒:`spring-cloud-starter-loadbalancer`是伴隨著Spring Cloud Commons 2.2.0版本才開始商用的(Hoxton版本),這個版本節點請稍微關注下,因為它替代了Ribbon。 ### 當前支援的版本 Spring Cloud遵循**Pivotal OSS support policy** 協議對**主要版本**提供3年的支援。此外,在Spring Cloud的主要或次要版本釋出後,若存在嚴重的bug和安全問題,就會再維護一段時間(6-12個月不等)。 > 特別注意:這裡指的**主要版本**才是3年,主要版本可不常有的哦 現在2020.0.0版本已釋出,又到了淘汰的時候。現在Spring Cloud官方還會支援的版本有: - **2020.0版本**:(支援Spring Boot 2.4.x)它是**主要版本**,按計劃會支援到2023年12月份 - 它是自Finchley後的又一主要版本 - **Hoxton版本**:(支援Spring Boot 2.2.x和2.3.x)作為Finchley發行系列的一個次要版本,它的常規維護將持續到2021年6月底。從2020-07開始進入到特殊維護期(不加新功能,只改緊急bug),2021-12月底就只會釋出重大錯誤/安全補丁了 - **Greenwich版本**:(支援Spring Boot 2.1.x)2020-01就停止維護了,2020-12-31號也將終結它的特殊維護期 - **Finchley版本**:(支援Spring Boot 2.0.x)它是一個**主要版本**的開始,2018年釋出 - **更老版本**:嗯,忘了吧 ![](https://img-blog.csdnimg.cn/20201223233224440.png#pic_center) Spring官方**建議**:儘量使用最新版本。不過建議歸建議,作為只使用**晚期大眾**技術的我們,坐在第二排甚至第三排看戲才有安全感。但歷史的巨浪總歸會把前排淘汰,因此早點做足準備總是好的,不至於時至被推至前排時只能**裸泳**。 Spring Cloud 2020.0作為一個**主要版本**,帶來了眾多顯著的變化,其中進行了一些阻斷式更新(不向下相容)是本文最大看點,來吧上菜。 ## 阻斷式升級(不向下相容) 差不多在去年(2019年)的這個時候,Spring Cloud在其Roadmap(之前文章有介紹過)裡就宣佈將要**終結**的一些庫/版本,其中最重要的就是指**Spring Cloud Netflix專案進入維護模式**,然後計劃在2020年完全移除。 Spring Cloud做出這樣的決定其實也是“被迫的”。我們知道Spring Cloud一直以來把`Netflix OSS`套件作為其官方預設的一站式解決方案,那時的Netflix OSS套件恨不得可以跟Spring Cloud劃等號。奈何呀,Netflix公司在2018年前後宣佈其核心元件Hystrix、Ribbon、Zuul、Archaius等均進入**維護狀態**。 > 雖然有Zuul 2.x,Archaius 2.x,但它們均不能向下相容,無法平滑升級,因此幾乎等於無法使用 從2018年至今處於維護狀態的模組有(包括其對應的starter,此處並未列出): 1. spring-cloud-netflix-archaius 2. spring-cloud-netflix-hystrix-contract 3. spring-cloud-netflix-hystrix-dashboard 4. spring-cloud-netflix-hystrix-stream 5. spring-cloud-netflix-hystrix 6. spring-cloud-netflix-ribbon 7. spring-cloud-netflix-turbine-stream 8. spring-cloud-netflix-turbine 9. spring-cloud-netflix-zuul ### 1、再見了,Netflix 時至今日,Spring Cloud 2020.0正式釋出,在這個主要版本里,按既定計劃終於對`spring-cloud-netflix`動刀了。我幫你畫了幅`spring-cloud-netflix-dependencies`的xml檔案前後版本主要差異的對比圖,一目瞭然: ![](https://img-blog.csdnimg.cn/2020122400165972.png#pic_center) - `spring-cloud-netflix-dependencies`沒有消失哦,它依舊存在,版本號跟隨大部隊升級為3.0.x版本 - 舊版本的`spring-cloud-netflix-dependencies`管理著Netflix所有元件,包括Hystrix、Ribbon、Zuul、Eureka等。而自2020.0版本起,**它有且只管理Eureka(包括Server和Client)** > 解釋說明:Feign雖然最初屬Netflix公司,但從9.x版本開始就移交給OpenFeign組織管理了,因此不再劃入Netflix管轄範疇 簡單一句話概括:Spring Cloud 2020.0.0版本**徹底刪除**掉了Netflix除Eureka外的**所有**元件。至此,我們懷著感恩的心可以對Netflix OSS套件道一聲謝謝,並可以對它說再見了。 ![](https://img-blog.csdnimg.cn/20201224000042869.png#pic_center) > 說明:Netflix的Eureka專案仍舊是活躍狀態,這個註冊中心設計上還是蠻優秀的,綜合表現尚可,市場上競爭力依舊可圈可點,因此Spring Cloud暫還未放棄它 ```xml org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
``` #### Netflix元件替代方案 Spring Cloud既然把Netflix OSS套件大刀闊斧的砍掉了,那總歸得有替代方案吧。那是必然的,Spring Cloud團隊給我們推薦了用於替代的產品: Netflix | 推薦替代品 | 說明 -------- | ----- | ----- Hystrix | Resilience4j | Hystrix自己也推薦你使用它代替自己 Hystrix Dashboard / Turbine | Micrometer + Monitoring System | 說白了,監控這件事交給更專業的元件去做 Ribbon | Spring Cloud Loadbalancer | 忍不住了,Spring終究親自出手 Zuul 1 | Spring Cloud Gateway | 忍不住了,Spring終究親自出手 Archaius 1 | Spring Boot外部化配置 + Spring Cloud配置 | 比Netflix實現的更好、更強大 ##### Spring Cloud LoadBalancer是什麼? 以上替代品中,你可能最陌生、最好奇的是`Spring Cloud Loadbalancer`,它一度只是Spring Cloud **孵化器**裡的一個小專案,並且一度擱淺。後再經過重啟,發展,現行使其偉大使命,正式用於**完全替換** Ribbon,成為Spring Cloud負載均衡器**唯一實現**。 值得注意的是:Spring Cloud LoadBalancer首次引入是在Spring Cloud Commons 2.2.0時,也就是Hoxton釋出時就引入了,只不過那會還只是備胎/備選,預設依舊是Ribbon挑大樑。下截圖是在Hoxton版本的情況: ![](https://img-blog.csdnimg.cn/20201224004316321.png#pic_center) 如圖,負載均衡抽象`LoadBalancerClient`介面有兩個實現,而到了Spring Cloud 2020.0版本後,`BlockingLoadBalancerClient`就是唯一實現了。 >
關於spring-cloud-loadbalancer負載均衡器的使用,官方有個極其建議教程:https://spring.io/guides/gs/spring-cloud-loadbalancer。有興趣可自己玩玩,若沒興趣,那就關注我後面文章分析吧,我會專程介紹它的 #### Spring Cloud Alibaba是否可作為替代方案? 嗯,也可以。 不過它目前來說並不是Spring Cloud官方的推薦的預設方案。期待國人一起努力,能早日送Spring Cloud Alibaba上去,讓歪果仁用上咱天朝的框架,提issue必須用中文O(∩_∩)O哈哈~。 #### 顯示匯入Netflix包還能否正常work? 既想升級到最新版本的Spring Cloud,又想保持向下相容使用Netflix的技術。雖說spring-cloud-netflix-dependencies裡不再包含netflix的核心元件,那我手動導包並指定版本號行不行?能否正常work呢? **答**:我拍腦袋就給你個答案,**不行**。既然我沒論證過,但這麼使用太畸形了,此方案應被槍斃在萌芽中,不應該有。 另外,從此事也告訴我們:使用Spring Cloud時儘量面向它的**抽象**程式設計,這樣即使Spirng Cloud換底層元件(如換熔斷器、負載均衡器)等等,理論上對我們業務是無影響或者影響很小的,這都得益於它的Spring Cloud Commons抽象,那裡是精華。 ### 2、Bootstrap上下文預設不再啟動 知曉原理的同學知道,Spring Cloud容器是靠`Bootstrap Context`引導上下文來啟動的,對應的類是`BootstrapApplicationListener`。 這在2020.0版本發生了改變,**新版本的Spring Cloud不再依賴於此上下文而啟動**。因此預設情況下,將不再啟動Bootstrap上下文。程式碼層面的改變發生在這裡: ```java BootstrapApplicationListener: @Override public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) { ConfigurableEnvironment environment = event.getEnvironment(); // 在方法開頭加了這麼個判斷 if (!bootstrapEnabled(environment) && !useLegacyProcessing(environment)) { return; } ... } PropertyUtils: // BOOTSTRAP_ENABLED_PROPERTY = spring.cloud.bootstrap.enabled public static boolean bootstrapEnabled(Environment environment) { return environment.getProperty(BOOTSTRAP_ENABLED_PROPERTY, Boolean.class, false) || MARKER_CLASS_EXISTS; } // USE_LEGACY_PROCESSING_PROPERTY = spring.config.use-legacy-processing public static boolean useLegacyProcessing(Environment environment) { return environment.getProperty(USE_LEGACY_PROCESSING_PROPERTY, Boolean.class, false); } ``` #### 開啟方式 若你需要開啟Bootstrap上下文,有兩種辦法可以實現: 1. 設定值`spring.cloud.bootstrap.enabled=true`或者 `spring.config.use-legacy-processing=true`即可。注意:這些個屬性值必須確保其能放進環境裡才能生效。比如靠譜的方式是:系統屬性、環境變數、命令列等 2. 引入一個Jar:`org.springframework.cloud:spring-cloud-starter-bootstrap`,然後什麼都不用做了 1. 說明:這個jar裡面有且僅有一個`Marker`類,作用你懂的,此處不做過多解釋 >
說明:手動開啟Bootstrap上下文,證明你fallback到老的方式去載入SC,那麼一切請按照老方式做即可 ### 3、全新的配置方式 得益於Spring Boot 2.4.x支援全新的配置檔案書寫方式,自此可以使用`spring.config.import`倆匯入其它組建的配置。如: - spring.config.import=configserver:xxx - spring.config.import=zookeeper: - ... 這麼做更具模組化,更符合雲原生環境的要求。 ### 4、其它 - 之前若要禁用Spring Cloud Config Client端的健康指示用的是`health.config.enabled=false`,現改為`management.health.config.enabled=false`。保持了和Spring Boot控制端點風格一致 - 帶有無效字元(破折號)的端點id已經改為符合標準的了,自此啟動時再也沒有討厭的警告了,拯救潔癖者。 - bus-env -> busenv - bus-refresh -> busrefresh - service-registry -> serviceregistry ```java // old @Endpoint(id = "service-registry") public class ServiceRegistryEndpoint { ... } // new @Endpoint(id = "serviceregistry") public class ServiceRegistryEndpoint { ... } ``` ## 常規式升級 常規升級這塊關注點就沒那麼多了,主要對其元件如`Spring Cloud Commons、Spring Cloud Kubernetes、Spring Cloud Openfeign...`等做些常規升級,乏善可陳。 值得關注的一點:Spirng Cloud所有的Module版本號均升級到了`3.0.0`(大版本號的升級),除Spring Cloud Circuitbreaker/Spring Cloud Kubernetes(2.0.0)和Spring Cloud Task(2.3.0)之外。 ## 仍舊存在的問題 雖然2020.0已經RELEASE了,但是仍存在著未解決的問題,例舉幾個此版本**現存**的問題: - 若使用`spring.config.import=configserver:`來配置配置中心,此版本漏掉了支援retry引數 - 解決方案:若你要使用的話,你只得fallback到傳統方式嘍(寫在bootstrap.yaml裡) - `spring-cloud-config-dependencies`裡出現了一個非release版本的jar(具體看下截圖) - 解決方案:手動指定該jar的版本號 ![](https://img-blog.csdnimg.cn/20201224012523158.png#pic_center) > 說明:M1屬於里程碑版本,還屬於較為早起階段,可能存在bug,建議你使用時手動指定版本號替換掉這個jar 看來即使強如Spring團隊,也會出現各種各樣的紕漏呀。這麼一想的話,我又敢放心大膽的回去寫bug去嘍。 # ✍總結 Spring Cloud 2020.0.0是Spring Cloud的**主要版本**,是非常重要的存在,升級、改變也是巨大的。特別體現在Netflix模組的全部移除、Spring Cloud啟動方式變了等等。伴隨著Spring Boot 2.4.x以及Spirng Cloud 2020.0的釋出,並且棄用Netflix OSS套件後,必將走入一個新的**深度程式設計**體驗,滿懷驚喜,很是期待。 > 說明:因為此版本完全擯棄掉了Netflix的一套東西,為了跟上時代,我會使用一段時間後,儘快寫出最新版本的系列教程,助你少踩坑 文末有提到2020.0版本雖已釋出,但仍舊存在些問題。不過話說回來,那些都屬於很小的問題,可能在下個小版本里就得到修復。但尷尬的是,距離2020年結束只有不到10天了,倘若進入到了2021年,按照版本號命名新規,彼時發出的版本將不能再叫2020.x.x而只能是2021.x.x,顯然這就屬於大版本號的迭代了,需要謹慎啊。 **你覺得Spring Cloud團隊在2020年還會發版嗎?歡迎在評論區留下你的看法。** --- ### ✔✔✔推薦閱讀✔✔✔ 【Spring型別轉換】系列: - [1. 揭祕Spring型別轉換 - 框架設計的基石](https://mp.weixin.qq.com/s/5daOOdhIFqrGbpgtnuQMNw) - [2. Spring早期型別轉換,基於PropertyEditor實現](https://mp.weixin.qq.com/s/Afu8YYyREoynAXS6YrJe7g) - [3. 搞定收工,PropertyEditor就到這](https://mp.weixin.qq.com/s/--UO3pH1nxTW3f5nQvEnkg) - [4. 上新了Spring,全新一代型別轉換機制](https://mp.weixin.qq.com/s/SMKs3fYoJm1Dfpy-6m_9ZQ) - [5. 穿過擁擠的人潮,Spring已為你製作好高階賽道](https://mp.weixin.qq.com/s/wnuqbgnS-D-U48XrxHKIvg) - [6. 抹平差異,統一型別轉換服務ConversionService](https://mp.weixin.qq.com/s/9MPkCSM9AbsgKAFQ1eXBNQ) 【Jackson】系列: - [1. 初識Jackson -- 世界上最好的JSON庫](https://mp.weixin.qq.com/s/iqSN4HUoIdX0kGcSdnD7EA) - [2. 媽呀,Jackson原來是這樣寫JSON的](https://mp.weixin.qq.com/s/p6cwP2BVrC8VxkN-T3uAxg) - [3. 懂了這些,方敢在簡歷上說會用Jackson寫JSON](https://mp.weixin.qq.com/s/ZHb3P06IC4xElHwJqDepxw) - [4. JSON字串是如何被解析的?JsonParser瞭解一下](https://mp.weixin.qq.com/s/syAOETfEawiGItaQO35mLA) - [5. JsonFactory工廠而已,還蠻有料,這是我沒想到的](https://mp.weixin.qq.com/s/0ZaDYb_ueFLbvOf3FbetfQ) - [6. 二十不惑,ObjectMapper使用也不再迷惑](https://mp.weixin.qq.com/s/VYy1QVeFLRkciymFHueb5w) - [7. Jackson用樹模型處理JSON是必備技能,不信你看](https://mp.weixin.qq.com/s/hPRdt-6sHt4rZaW2_jhdWQ) 【資料校驗Bean Validation】系列: - [1. 不吹不擂,第一篇就能提升你對Bean Validation資料校驗的認知](https://mp.weixin.qq.com/s/g04HMhrjbvbPn1Mb9JYa5g) - [2. Bean Validation宣告式校驗方法的引數、返回值](https://mp.weixin.qq.com/s/-KeOCq2rsXCvrqD8HYHSpQ) - [3. 站在使用層面,Bean Validation這些標準介面你需要爛熟於胸](https://mp.weixin.qq.com/s/MQjXG0cg8domRtwf3ArvHw) - [4. Validator校驗器的五大核心元件,一個都不能少](https://mp.weixin.qq.com/s/jzOv67ZTSx2rByj0aeUTgw) - [5. Bean Validation宣告式驗證四大級別:欄位、屬性、容器元素、類](https://mp.weixin.qq.com/s/6_7gZ9jmQcDSRiARO6D-yw) - [6. 自定義容器型別元素驗證,類級別驗證(多欄位聯合驗證)](https://mp.weixin.qq.com/s/MN-_JCGnsEWpPJs9xQ_qZA) 【新特性】系列: - [IntelliJ IDEA 2020.3正式釋出,年度最後一個版本很講武德](https://mp.weixin.qq.com/s/vNnfKEGRm7R3PN_lCtXJDA) - [IntelliJ IDEA 2020.2正式釋出,諸多亮點總有幾款能助你提效](https://mp.weixin.qq.com/s/8voJSbmcBbdfNUCUBIcKcA) - [IntelliJ IDEA 2020.1正式釋出,你要的Almost都在這!]() - [Spring Framework 5.3.0正式釋出,在雲原生路上繼續發力](https://mp.weixin.qq.com/s/Sw6EqAY0DmF-p2qPoaetUg) - [Spring Boot 2.4.0正式釋出,全新的配置檔案載入機制(不向下相容)](https://mp.weixin.qq.com/s/KywpJkLDHZbZTxUf4WFxhw) - [Spring改變版本號命名規則:此舉對非英語國家很友好](https://mp.weixin.qq.com/s/ZoUG9h1TndW2QpnPyGeIQA) - [JDK15正式釋出,劃時代的ZGC同時宣佈轉正](https://mp.weixin.qq.com/s/3QaiUGzj5nW2N4Aipm47PQ) 【程式人生】系列: - [螞蟻金服上市了,我不想努力了](https://mp.weixin.qq.com/s/oEShE0fiHSGG8D89NRQYGw) - [如果程式設計師和產品經理都用凡爾賽文學對話......](https://mp.weixin.qq.com/s/SZUJ0sy4vM7UH10pk6NM3g) - [程式人生 | 春風得意馬蹄疾,一日看盡長安花](https://mp.weixin.qq.com/s/PGIFtpI7aZaxY7es0F6C6Q) 還有諸如【Spring配置類】【Spring-static】【Spring資料繫結】【Spring Cloud Netflix】【Feign】【Ribbon】【Hystrix】...更多原創專欄,關注`BAT的烏托邦`回覆`專欄`二字即可全部獲取,也可加我`fsx1056342982`,交個朋友。 > 有些**已完結**,有些**連載中**。我是A哥(YourBatman),咱們下期見