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