Spring Cloud
Spring Cloud 是一套完整的微服務解決方案,基於 Spring Boot 框架,准確的說,它不是一個框架,而是一個大的容器,它將市面上較好的微服務框架集成進來,從而簡化了開發者的代碼量。
它利用 Spring Boot 的開發便利性簡化了分布式系統的開發,比如服務發現、服務網關、服務路由、鏈路追蹤等。Spring Cloud 並不重復造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從而減少了各模塊的開發成本。
一句話總結:Spring Cloud 提供了構建分布式系統所需的“全家桶”。
Spring Cloud核心組件

Spring Cloud Netflix 集成眾多Netflix的開源軟件:Eureka, Hystrix, Zuul, Archaius,組成了微服務的最重要的核心組件,這里主要介紹5大常用組件。
1.Eureka
Eureka 作為 Spring Cloud 框架的注冊中心,與之對應的是 Dubbo 框架的Zookeeper。
上圖簡要描述了Eureka的基本架構,由3個角色組成:
1)Service Provider: 暴露服務的服務提供方。
2)Service Consumer:調用遠程服務的服務消費方。
3)EureKa Server: 服務注冊中心和服務發現中心。
2.Hystrix
熔斷器,容錯管理工具,旨在通過熔斷機制控制服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。
分布式系統環境下,服務間類似依賴非常常見,一個業務調用通常依賴多個別的服務,如下圖:
如果各個服務正常運行,那大家齊樂融融,但是如果其中一個服務Service C崩壞掉會出現什么樣的情況呢?如下圖:
ServiceB依賴於ServiceC,由於ServiceC訪問量比較大,由於ServiceC掛了,很可能ServiceB也會被拖累掛。
同理上游的ServiceA還依賴於ServiceB,同樣也會被涉及。
最終一個服務失敗,導致整條鏈路的服務都失敗的情形,為造成大面積的服務雪崩效應。
這就給之前我們的大A股熔斷是一個道理,所以針對這種情況需要考慮引入Hystrix 熔斷機制,避免大面積雪崩等場景。
Hystrix 斷路器是一種開關裝置,當某個服務單元發生故障之后,通過斷路器的故障監控,向調用方返回一個符合預期的、可處理的備選響應(FallBack),而不是長時間的等待或者拋出調用方無法處理的異常,這樣就保證了服務調用方不會長時間、不必要占用,從而避免了故障在分布式系統中的蔓延,乃至雪崩。
3.Netflix Zuul
Zuul是Spring Cloud全家桶中的微服務API網關。
所有從設備或網站來的請求都會經過Zuul到達后端的應用程序。作為一個邊界性質的應用程序,Zuul提供了動態路由、監控、彈性負載和安全功能。
簡單的話,Zuul 就是樓下保安亭的大爺,所有進入大樓的人,都需要大爺檢查,得到大爺的許可。我們可以通過一張圖理解。
4.Ribbon
Zuul默認和Ribbon結合實現了負載均衡的功能,Ribbon就可基於某種負載均衡算法,自動地幫助服務消費者去請求。
5.Spring Cloud Config
實際工作中,我們可能會有幾十上百的微服務節點,每一個節點有需要有配置信息,比如數據庫的連接,服務中心的地址等等,當中信息變化的時候,我們可能面臨手動一台一台修改的囧境。為了解決上述問題,我們能否借鑒 Git 的思想,有一個標准的配置,當我們配置修改,我們只需要同步刷新一下即可,不用手動搬運呢?答案是有的,我們可以通過 Spring Cloud Config 達到同步更新配置信息。
Spring Cloud架構實現
通過這張圖,可以比較清楚的了解到各組件配置使用運行機制:

1、請求統一通過API網關(Zuul)來訪問內部服務.
2、網關接收到請求后,從注冊中心(Eureka)獲取可用服務
3、由Ribbon進行均衡負載后,分發到后端具體實例
4、微服務之間通過Feign進行通信處理業務
5、Hystrix負責處理服務超時熔斷
6、Turbine監控服務間的調用和熔斷相關指標
微服務、Spring Cloud、Spring Boot三者關系
微服務是一種架構的理念,提出了微服務的設計原則,從理論為具體的技術落地提供了指導思想。
- SpringBoot專注於快速方便的開發單個個體微服務。
- SpringCloud是關注全局的微服務協調整理治理框架,它將SpringBoot開發的一個個單體微服務整合並管理起來,
- 為各個服務之間提供,配置管理、服務發現、斷路器、路由、微代理、事件總線、全局鎖、精選決策、分布式會話等集成服務。
- SpringBoot可以離開SpringCloud獨立開發項目,但是SpringCloud離不開SpringBoot,屬於依賴關系。
- SpringBoot專注於快速、方便的開發單個微服務個體,SpringCloud關注全局的服務治理框架。