SpringCloud 專欄:快速入門指南!
一、背景介紹
在微服務架構日益盛行的今天,Spring Cloud 憑借其豐富的功能集、高度的可集成性和對微服務架構的天然支持,自推出以來,就受到軟件開發者的熱烈追棒和廣泛應用。
使用過 Spring Cloud 的同學應該深有感觸。Spring Cloud 是一個功能強大的微服務框架,它提供了一套完整的分布式系統解決方案,比如配置管理、服務治理、熔斷機制、智能路由、微代理、控制總線等多種功能,可以幫助開發者快速構建和管理微服務應用。無論是大型企業還是初創公司,都可以以非常低的成本搭建一套高效、分布式、容錯的云平臺。
當項目引入 Spring Cloud 技術之后,一個接口的請求流程可以用如下圖來簡要描述。
從圖中可以看出,與單體應用相比,微服務的接口調用鏈路和服務部署方式要復雜許多。
二、技術體系
Spring Cloud 的核心技術體系,可以用如下圖來簡要概括。
在介紹 Spring Cloud 核心組件之前,我們先簡單的介紹一下 Netflix 這家公司,因為上圖提到的很多核心組件都來自于這家公司。
Netflix 是一家技術實力雄厚的美國流媒體娛樂公司,主要通過互聯網向全球觀眾提供電影、電視劇、紀錄片、動畫片等在線視頻服務,類似于國內的騰訊視頻,全球范圍內擁有超過 2 億的訂閱用戶。
如果要滿足這么龐大的用戶群體在線訪問網站視頻內容,常規的網站架構肯定是無法承載的,為了更好的滿足海量用戶的在線視頻服務,Netflix 在微服務架構方面有著深入的研究和實踐,并開源了一系列組件。如上文提到的 Eureka、Ribbon、Hystrix、Feign、Zuul 等組件,就是 Netflix OSS 開源項目的一部分。由于其優秀的微服務架構實踐和服務特性,Spring Cloud 將其集成到自己的生態圈,并組成微服務的核心。
2.1、第一代 Spring Cloud
初代的 Spring Cloud 核心成員,可以用如下表來概括。
組件 | 來源 | 說明 |
spring-cloud-eureka | 來源于Netflix Eureka | 服務注冊中心組件 |
spring-cloud-ribbon | 來源于Netflix Ribbon | 服務負載均衡組件 |
Spring-cloud-hystrix | 來源于Netflix Hystrix | 服務熔斷器組件 |
Spring-cloud-feign | 來源于Netflix Feign | 服務遠程調用組件 |
Spring-cloud-zuul | 來源于Netflix Zuul | 服務網關組件 |
Spring-cloud-config | 自研 | 服務配置中心組件 |
Spring-cloud-bus | 自研 | 服務消息總線 |
Spring-cloud-sleuth | 自研 | 服務日志跟蹤 |
Spring-cloud-zikpin | 來自第三方 | 服務日志全鏈路監控 |
在此,只列舉了一些常用的核心組件,實際上 Spring Cloud 生態圈的核心組件非常的多,比如 Spring Cloud Security、Spring Cloud Data Flow、Spring Cloud Stream、Spring Cloud Task、Spring Cloud Connectors、Spring Cloud CLI 等等,每個組件都有它獨特的技能,再次就不一一介紹了,有興趣的朋友可以訪問 Spring Cloud 的官網介紹。
2.1、第二代 Spring Cloud
在 2018 年,由于 Netflix 對 Eureka,Hystrix 等組件不再繼續開發和維護了, 因此 Spring Cloud 不斷的引入了其它的開源組件,以此來壯大自己的生態圈,同時也陸續推出了自己的一些組件。
Spring Cloud 第一代和第二代的核心組件差異匯總,如下表所示。
核心組件 | 第一代 Spring Cloud | 第二代 Spring Cloud |
服務注冊中心 | Eureka, Consul | Nacos |
服務負載均衡 | Ribbon | spring-cloud-loadbalancer |
服務熔斷器 | Hystrix | Resilience4j,Sentinel |
服務遠程調用 | Feign | Spring Cloud OpenFeign,基于 Feign 的升級版 |
服務網關 | Zuul | Spring Cloud Gateway |
配置中心 | Spring Cloud Config | Nacos,Apollo |
服務日志全鏈路監控 | zipkin | Skywalking |
因為 Zuul 1.x 性能一般,雖然 Netflix 之后也推出了 Zuul 2.x,相比第一代性能也提升了不少,但當時一直跳票(延遲對外開放)。隨后 Spring Cloud 官方推出了自研的 Spring Cloud gateway,類似自研的還有 spring-cloud-loadbalancer,spring-cloud-r4j,Spring-cloud-openfeign 等,相比初代組件,性能和維護方面都有明顯的提升。
三、版本選擇
如果你翻看過 Spring Cloud 項目源碼,你會發現它其實是一個擁有諸多子項目的大型綜合項目,同時每個子項目也都維護著自己的發布版本號。這就意味著,每一個 Spring Cloud 的版本都會包含不同的子項目版本。
為了更好的管理子項目版本號,避免主版本名與子項目的發布版本號出現混亂。Spring Cloud 沒有采用版本號的方式來命令,而是通過名稱的方式來命令。
通常情況下,Spring Cloud 對外發行的版本號,采用的是倫敦地鐵站的名字來命令,根據字母表的順序來進行排序,比如:第一個 Release 版本:Angel,第二個 Release 版本:Brixton,以此類推……
每個大版本也有多個小版本號,比如Angel.SR5
、Brixton.SR6
,其中SR5
、SR6
就是小版本號。
小版本號的名稱命令也有講究,當一個大版本的 Spring Cloud 項目發布內容積累到臨界點或者一個嚴重 bug 解決可用后,就會發布一個“service releases”版本,簡稱SRX
版本,其中X
是一個遞增數字。
Spring Cloud 的版本號與每個子項目的版本號之間的關系,可以用如下表簡要概括。
組件 | Angel.SR6 | Brixton.SR5 | 依次類推 |
spring-cloud-aws | 1.0.4.RELEASE | 1.1.1.RELEASE | ... |
spring-cloud-bus | 1.0.3.RELEASE | 1.1.1.RELEASE | ... |
spring-cloud-cli | 1.0.6.RELEASE | 1.1.5.RELEASE | ... |
spring-cloud-commons | 1.0.5.RELEASE | 1.1.1.RELEASE | ... |
spring-cloud-config | 1.0.4.RELEASE | 1.1.3.RELEASE | ... |
spring-cloud-netflix | 1.0.7.RELEASE | 1.1.5.RELEASE | ... |
spring-cloud-security | 1.0.3.RELEASE | 1.1.2.RELEASE | ... |
spring-cloud-starters | 1.0.6.RELEASE | ... | |
spring-cloud-cloudfoundry | 1.0.0.RELEASE | ... | |
spring-cloud-cluster | 1.0.1.RELEASE | ... | |
spring-cloud-consul | 1.0.2.RELEASE | ... | |
spring-cloud-sleuth | 1.0.6.RELEASE | ... | |
spring-cloud-stream | 1.0.2.RELEASE | ... | |
spring-cloud-zookeeper | 1.0.2.RELEASE | ... | |
spring-boot | 1.2.8.RELEASE | 1.3.7.RELEASE | ... |
spring-cloud-task | 1.0.2.RELEASE | ... |
Spring Cloud 的發展勢頭非常迅猛,截止目前,大版本號已經到Leyton
了。盡管如此,對于初學者而言,了解版本號的定義非常重要,避免后續在基于 Spring Cloud 框架來開發的時候走彎路。
由于 Spring Cloud 子項目特別多,尤其是在現有 Spring Boot 基礎上集成的時候,很容易因為版本號不同出現各種不兼容現象,以下是 Spring Cloud 與 Spring Boot 版本匹配關系。
Spring Cloud | Spring Boot |
Angel | 兼容Spring Boot 1.2.x |
Brixton | 兼容Spring Boot 1.3.x,Spring Boot 1.4.x |
Camden | 兼容Spring Boot 1.4.x,Spring Boot 1.5.x |
Dalston | 兼容Spring Boot 1.5.x |
Edgware | 兼容Spring Boot 1.5.x |
Finchley | 兼容Spring Boot 2.0.x |
Greenwich | 兼容Spring Boot 2.1.x |
Hoxton | 兼容Spring Boot 2.2.x,Spring Boot 2.3.x |
Ilford | 兼容Spring Boot 2.4.x,Spring Boot 2.5.x |
Jubilee | 兼容Spring Boot 2.6.x,Spring Boot 2.7.x |
Kilburn | 兼容Spring Boot 3.0.x,Spring Boot 3.1.x |
Leyton | 兼容Spring Boot 3.2.x,Spring Boot 3.3.x |
在實際的微服務開發過程中,當代碼編寫一切都是正常的,但是運行時各種出錯,大概率應該是版本號的選擇上出了問題。推薦結合當前使用的 Spring Boot 版本,采用與 Spring Cloud 匹配的穩定版本號來開發,會省去不少的麻煩。
四、小結
最后總結一下,Spring、Spring Boot、Spring Cloud 這三者之間的關系。
Spring -> Spring Boot -> Spring Cloud
關于 Spring Boot,在之前的技術系列文章中我們有所介紹過, 它是一個基于 Spring 框架實現的應用程序快速開發工具,開發者可以使用它來快速的構建一個可獨立運行的 Java 應用程序,開箱即用。
對于 Spring Cloud,它是一個基于 Spring Boot 實現的云應用開發工具,通過它可以快速搭建微服務架構項目,比如配置管理、服務治理、熔斷機制、智能路由、微代理、控制總線等多種功能,開發者可以以非常低的成本搭建一套高效、分布式、容錯的云平臺。
因此可見,Spring Cloud 離不開 Spring Boot,兩者屬于依賴關系。
在之前的技術系列文章中,我們有詳細的介紹過 Spring Boot 相關知識,本期將開啟 Spring Cloud 技術系列相關知識介紹。
五、參考
1.https://www.didispace.com/spring-cloud/springcloud-version.html
2.http://www.ityouknow.com/springcloud/2017/05/01/simple-springcloud.html