Spring Cloud 理論篇

微服務

在 jsp 時代,應用前後端耦合,前後端 all in 一臺服務器,隨着流量的增大,代碼數量的增加,單體應用不再適合互聯網的發展,微服務順應提出。

微服務是一種用於構建應用的架構方案。區別於更爲傳統的單體式方案,將應用拆分成多個核心功能。每個功能都被稱爲一項服務,可以單獨構建和部署,這意味着各項服務在工作(和出現故障)時不會相互影響。

參考:https://www.redhat.com/zh/topics/microservices/what-are-microservices

Spring Cloud 版本

在微服務大哥的帶領下,各種架構層出不窮,有 Dubbo、gRPC、Thrift、SpringCloud 等等,其中 Spring Cloud 背靠 Spring 生態,脫穎而出。Spring Cloud 框架是在 Springboot 框架基礎上編寫的,因此在技術選型的時候,我們需要注意 Spring Cloud 版本要與 Springboot 版本對應。

Spring Cloud 社區活躍,已經出了好幾個版本,生命力旺盛。值得一提的是他的版本號。SpringCloud 不是使用數字作爲版本號,而是將倫敦地鐵站作爲版本號,這讓我想起被地鐵支配的恐懼。

目前 SprinCloud官網主推薦版本是 Hoxton SR1。Spring Cloud 與 Spring Boot 有明確的版本對應關係。

Spring Cloud Spring Boot
Hoxton 2.2.x
Greenwich 2.1.x
Finchley 2.0.x
Edgware 1.5.x
Dalston 1.5.x
Camden 1.4.x
Brixton 1.3.x
Angel 1.2.x

從圖表可以看出 Spring Cloud 版本號的首字母是按照字母順序排列的。
本文主要介紹的是基於 Spring Boot 1.5.x 的 Dalston 版本的 Spring Cloud。

Spring Cloud 是什麼

Spring boot 是一個身懷絕技的武林高手,能上九天攬月下五洋捉鱉,反正就是牛,他喜歡結交武林各路英雄豪傑,有 MyBatis 、Redis、RabbitMQ、Kafaka、Elasticsearch 等等各路高手,他們喜歡行俠仗義,助人爲樂,慢慢的以 Spring boot 爲大佬的幫派越來越多,有一天 Spring boot 和兄弟們說,要不我們成立一個門派把,就叫 Spring Cloud 。

大家一呼百應。但是成立的門派後,需要管理啊,所以 Spring Cloud 成立了 Eureka 分舵(服務中心),負責對各個分舵同步門派的大事件,有新成員(提供者)加入門派,也需要到 Eureka 分舵報道,其他分舵(消費者)需要協助,也像 Eureka 分舵請求支援。分舵也培養新分舵,出現了幾個職能相同的分舵(服務帶集羣),Eureka 分舵看到分舵越來越多,自己也開始培養新分舵(服務中心集羣)。同時也建立了一個 Ribbon 分舵(客戶端負載均衡),負責對各個分舵進行高效的溝通。 Spring Cloud 門派名聲越來越大,加入的人越來越多,Spring Cloud 開始成立了 Zuul 分舵(網關),負責對新加入的人員進行篩選。

江湖還在,Spring Cloud 門派也越來越強大,到處都是他的傳說

Spring Cloud 與 Dubbo 區別

目前來說,在 Java 領域,微服務主要是 Spring Cloud 和 Dubbo 的天下,因此,人們經常喜歡比較兩種技術,然後選擇其中一種進行搭建。

由於 Dubbo 是國人開發的,有詳細的開發文檔,在 Spring Cloud 的萌芽時, 國人憑着滿腔熱情大力發展 Dubbo,不斷試坑,後來 Dubbo 發展停滯,Spring Cloud 的春風開始席捲神州大地。不過,目前 Dubbo 又開始起色,捐給了 Apache 。

技術維度 Dubbo Spring Cloud
服務註冊中心 Zookeeper Spring Cloud Netflix Eurrke
服務調用方式 RPC REST API
服務監控 Dubbo-monitor spring boot admin
斷路器 不完善 Spirng Cloud Netflix Hystrix
服務網關 Spring Cloud Netflix Zuul
分佈式配置 Spring Cloud Config

Eureka 組件

Eureka 音譯尤里卡,是 Spring Cloud 的註冊中心。在分佈式系統中,包含很多個節點,這些節點大體分爲消費者和提供者。

服務端和客戶端就是通過 Eureka 進行管理的。舉一個例子,Eureka 就好比小區的快遞箱,快遞就是服務端,取快遞的人就是客戶端。我們什麼時候可以取快遞呢,等快遞箱向我們發送短信,我們就可以去取快遞了。這就是 Eureka 的作用。這樣看來服務中心 Eureka 是十分重要的,爲了保證高可用,避免註冊中心掛掉,我們兩眼一抹黑的尷尬局面,一般來說, Eureka 會做集羣,保證高可用。同理可得,服務中心我們也需要集羣,保證高可用。

Eureka 作爲 Spring Cloud 框架的註冊中心,與之對應的是 Dubbo 框架的Zookeeper。他倆有什麼區別呢?這裏需要引入一個 CAP 定理。所謂 CAP 定理,分佈式系統的三個指標 C(一致性)、A(可用性)、P(分區容錯性)不可以同時滿足了。

一般來說,分區容錯無法避免,因此可以認爲 CAP 的 P 總是成立。CAP 定理告訴我們,剩下的 C 和 A 無法同時做到

參考:https://www.ruanyifeng.com/blog/2018/07/cap.html

而 Eureka 的設計原則是 AP,即可用性和分區容錯性。他保證了註冊中心的可用性,但捨棄了數據一致性,各節點上的數據有可能是不一致的(會最終一致)。ZK 的設計原則是 CP,即強一致性和分區容錯性。他保證數據的強一致性,但捨棄了可用性,如果出現網絡問題可能會影響 ZK 的選舉,導致 ZK 註冊中心的不可用。

參考:https://www.infoq.cn/article/jlDJQ*3wtN2PcqTDyokh

Ribbon

微服務劃分成幾個節點,他們分佈在不同的虛擬機,通訊就成了一個難點,通過我們會想到 HttpClient,如果是 Spring的話,我們可以用 RestTemplate,但是在集羣環境下,他們並不能做到負載均衡。因此,Ribbon 出現了。Ribbon 是一款在客戶端實行負載均衡的工具。Ribbon 其實現原理就是根據在配置文件中列出的機器,自動按照某種規則(輪詢,隨機)去連接這些機器。使用者也可以自定義自己的負載均衡算法。負載均衡目的是達到高可用。

Feign

Feign 是有一款客戶端負載均衡工具。既然有了 Ribbon ,爲什麼還要有 Feign 呢? 在實際使用 Ribbon 組件中,我們會發現 Ribbon 會讓我們硬編碼,十分不靈活。因此,在 Ribbon 的基礎下,面向接口編程的 Feign 組件 就出現了。Feign 讓我們可以編寫出優雅的代碼,因此,實際中,Feign 得到大力使用。

Hystrix

Hystrix 是一個用於處理分佈式系統的延遲和容錯的開源庫,在分佈式系統裏,許多依賴不可避免的會調用失敗,比如超時、異常等,Hystrix 能夠保證在一個依賴出問題的情況下,不會導致整體服務失敗,避免級聯故障,以提高分佈式系統的彈性。

Hystrix 斷路器是一種開關裝置,當某個服務單元發生故障之後,通過斷路器的故障監控,向調用方返回一個符合預期的、可處理的備選響應(FallBack),而不是長時間的等待或者拋出調用方無法處理的異常,這樣就保證了服務調用方不會長時間、不必要佔用,從而避免了故障在分佈式系統中的蔓延,乃至雪崩。

提到服務雪崩,我們可以通過一張圖來理解。假設我們有三個服務調用 A B C。當其中下游的 C 服務發生故障,就有可能引起 服務雪崩。爲了解決 服務雪崩,我們就需要引入 Hystrix 組件。

Hystrix 主要是通過服務熔斷和服務降級來解決服務雪崩問題。那麼問題來了,服務熔斷和服務降級的區別又是什麼?

簡單來說服務熔斷屬於服務降級的一種,而服務降級有很多種降級方式!如開關降級、限流降級、熔斷降級。

參考:https://www.cnblogs.com/rjzheng/p/10340176.html

Zuul

Zuul中文是神獸的意思。在Spring Cloud 中,Zuul是一項網關服務,可提供動態路由,監視,彈性,安全性等。

簡單的話,Zuul 就是樓下保安亭的大爺,所有進入大樓的人,都需要大爺檢查,得到大爺的許可。 我們可以通過一張圖理解。

Spring Cloud Config

實際工作中,我們可能會有幾十上百的微服務節點,每一個節點有需要有配置信息,比如數據庫的連接,服務中心的地址等等,當中信息變化的時候,我們可能面臨手動一臺一臺修改的囧境。爲了解決上述問題,我們能否借鑑 Git 的思想,有一個標準的配置,當我們配置修改,我們只需要同步刷新一下即可,不用手動搬運呢?答案是有的,我們可以通過 Spring Cloud Config 達到同步更新配置信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章