引子:
上文Spring Cloud Alibaba專題–服務層的架構演進(二)中說到,微服務的架構搭建因為門檻過高,嘗試搭建微服務架構的過程像更像是從入門到放棄的勸退過程。就像初期的Spring一樣。Spring雖然相比老一代strus2架構搭建簡單了很多,但是其配置複雜度仍然讓很多人诟病。針對這個問題,Spring官方推出了Spring Boot。通過約定大于配置的規範,以及大量預設開箱即用的Starter,使得Spring的配置極大的簡化,那麼微服務門檻高的問題是不是也能照葫蘆畫瓢解決呢?答案是肯定的,這個類似于Spring Boot的産品就是Spring Cloud
一:Spring Cloud介紹
Spring Cloud為開發人員提供了快速建構分布式系統的能力
1.Spring Cloud制定了譬如服務端負載均衡,配置發現,消息總線等等相關的标準,通過這些标準,任何實作了标準的相關領域的中間件都可以非常輕松的接入Spring Cloud。基于同一标準實作的中間件可以直接替換。
2.在提供這一系列标準後,Spring Cloud官方實作了套自己的實作,比如服務發現中心Eureka,配置中心Spring Cloud Config,負載均衡器Ribbon等等
3.處理自家的實作,Spring Cloud也人性化的給常用的其他的中間件做了接入Spring Cloud的驅動,即對應的spirng-cloud-xxxx.starter(自己家的産品當然也有這個),比如配置中心Consul,Zookeeper等等
(1)Spirng Cloud支援的元件
功能 | 翻譯 | 選擇 |
---|---|---|
Distributed/versioned configuration | 分布式/版本化配置管理 | Spring Cloud Config、Consul、Nacos、Zookeeper |
Routing | 路由 | Zuul、Spring Cloud Gateway |
Service-to-service calls | 端到端的調用 | RestTempalte、Feign |
Service registration and discovery | 端到端的調用 | Euraka、Consul、Nacos、Zookeeper |
Load balancing | 負載均衡 | Ribbon |
Circuit Breakers | 斷路器 | Hystrix、Sentinel、Resilience4J |
Global locks | 全局鎖 | Spring Cloud Cluster(已經遷移到Spring Integration) |
Leadership election and cluster state | 選舉與叢集狀态 | Spring Cloud Cluster(已經遷移到Spring Integration) |
Distributed messaging | 分布式消息 | Spring Cloud Stream+Kafka/RabbitMQ/RocketMQ |
(2)Spirng Cloud元件能力腦圖
注:以上圖檔來自網際網路
二:Spring Cloud Alibaba
Spirng Cloud Alibaba已經2019年8月1日成功孵化。可以在Spring的官網中看到
1.Spring Cloud Alibaba簡介
Spring Cloud Alibaba 緻力于提供微服務開發的一站式解決方案。此項目包含開發分布式應用微服務的必需元件,友善開發者通過 Spring Cloud 程式設計模型輕松使用這些元件來開發分布式應用服務。
依托 Spring Cloud Alibaba,您隻需要添加一些注解和少量配置,就可以将 Spring Cloud 應用接入阿裡微服務解決方案,通過阿裡中間件來迅速搭建分布式應用系統。
主要功能
- 服務限流降級:預設支援 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降級功能的接入,可以在運作時通過控制台實時修改限流降級規則,還支援檢視限流降級 Metrics 監控。
- 服務注冊與發現:适配 Spring Cloud 服務注冊與發現标準,預設內建了 Ribbon 的支援。
- 分布式配置管理:支援分布式系統中的外部化配置,配置更改時自動重新整理。
- 消息驅動能力:基于 Spring Cloud Stream 為微服務應用建構消息驅動能力。
- 分布式事務:使用 @GlobalTransactional 注解, 高效并且對業務零侵入地解決分布式事務問題。
- 阿裡雲對象存儲:阿裡雲提供的海量、安全、低成本、高可靠的雲存儲服務。支援在任何應用、任何時間、任何地點存儲和通路任意類型的資料。
- 分布式任務排程:提供秒級、精準、高可靠、高可用的定時(基于 Cron 表達式)任務排程服務。同時提供分布式的任務執行模型,如網格任務。網格任務支援海量子任務均勻配置設定到所有 Worker(schedulerx-client)上執行。
- 阿裡雲短信服務:覆寫全球的短信服務,友好、高效、智能的互聯化通訊能力,幫助企業迅速搭建客戶觸達通道。
注:以上文字來自Spring Cloud Alibaba官網
可以看到,雖然Spring Cloud Alibaba是Spring Cloud的一個子項目,但是這個子項目同樣是和Spirng Cloud一樣是微服務開發的一站式解決方案,這不是重複了嗎?
2.為什麼要使用Spring Cloud Alibaba
- 一個很重要的原因就是SpringCloud中一些元件閉源了,不再維護,如果在生産環境出現了問題,官方不再免費維護了。比如:注冊中心Eureka在2.0版本之後宣布閉源了,容錯元件Hystrix、網關元件Zuul也已經宣布停止維護了
- 雖然說SpringCloud在官方給出了最優的替換方案,但是那些替換方案不再屬于SpringCloud技術棧。換句話說:就是SpringCloud的技術棧不再完整了!此時,我們就有必要尋找一個新的完整的技術棧
同樣是業界一流的開源大廠,相對于Spring官方,Alibaba不僅擁有衆多的開源産品,而且開源的很多産品都是經過内部雙11、雙12大促的考驗,在不斷總結和優化後開源出來的産品。這個時候以Alibaba的技術背景下的分布式一站式解決方案進入孵化器,也就是現在的Spring Cloud Alibaba
是以:在目前的背景下,Spring Cloud Alibaba是作為首選的分布式一站式解決方案
3.使用Spring Cloud Alibaba的好處
1.既然是一站式解決方案,常見的分布式元件的內建,适配及标準實作,官方都已經做了,分布式環境搭建将變得非常簡單,再也不用為了內建某個元件,辛苦的寫Starter以及初始化資料了(寫的還不一定好使=_=!!)
2.依賴這Spring Cloud這座大山(雖然部分元件不在維護,但絲毫不能影響Spirng Cloud在分布式解決方案中做的鋪墊),出了支援原來Spring Cloud的能力外,對于阿裡系的Dubbo等相關的技術站同樣支援,而且,針對Spirng Cloud能力做增強(以前不支援的能力)和優化(自家的東西優化)
3.幾年前,很多人還在為了争論用Dubbo好還是用Spring Cloud好(當然,這兩個東西在一塊比并不合适),現在,Spring Cloud Alibaba在分布式解決方案上形成了大統一
4.版本說明
(1)元件版本關系
(2)畢業版本依賴關系(推薦使用)
(3)本專題使用的版本
雖然Spring Cloud Alibaba 2021.1版本已經可以使用了,最新版雖然擁有更強的功能,但是同樣可能存在更多的bug,這裡選擇目前時間次新的版本2.2.5RELEASE
5.Spring Cloud Alibaba的使用
Spring Cloud Alibaba基于Spring Cloud,而Spring Cloud又是基于Spring Boot,按照上面的版本對應關心,Spring Cloud Alibaba使用的是2.2.5.RELEASE,Spring Cloud的版本應為Hoxton.SR8,而Spring Boot的版本應為2.3.2.RELEASE
依賴版本聲明
Spring Cloud Alibaba,Spring Cloud以及Spring Boot都提供了依賴版本聲明的pom,我們可以使用Maven的dependencyManagement來控制依賴版本,這樣,隻要是對應的pom中規定了的依賴包,我們引入的時候就不必聲明版本号了,注意,使用Spring Cloud Alibaba,或Spring Cloud的任意一個驅動包,都會自動将對應的Spring Cloud依賴以及Spring Boot的依賴加入,項目中一旦引入一個,就不用再自己聲明依賴Spring Cloud或Spring Boot了
<properties>
<java.version>1.8</java.version>
<spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version>
<dubbo.version>2.7.8</dubbo.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<!--spring-cloud-alibaba dependencies pom 依賴包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring-cloud-alibaba dependencies pom 依賴包-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring-cloud dependencies pom 依賴包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencyManagement>