1. 程式人生 > 其它 >【SpringCloud-Alibaba系列教程】7.容錯

【SpringCloud-Alibaba系列教程】7.容錯

一丶背景

在微服務架構中,我們將業務拆分成一個個的服務,服務與服務之間可以相互呼叫,但是由於網路原因或者自身的原因,服務並不能保證服務的100%可用,如果單個服務出現問題,呼叫這個服務就會出現網路延遲,此時若有大量的網路湧入,會形成任務堆積。最終導致服務癱瘓。

二丶為什麼會有容錯?

服務容錯是高併發所帶來的問題,在微服務架構中,服務於服務之間可以互相呼叫,但是由於網路原因或者自身的原因,我們並不能保證服務一直可以使用。所以當一個服務出現了問題,我們在呼叫這個服務的時候就會出現執行緒阻塞的情況,此時如果有大量的請求湧入,就會出現多執行緒阻塞等待,從而導致伺服器癱瘓,由於服務之間的依賴性,故障就會傳播上去,最終導致伺服器整個崩潰。這就是“雪崩效應”。

三丶常見的容錯方案

1.超時

設定請求超時時間,讓請求執行緒在等待超過一定的時間後就判定為請求失敗從而釋放請求執行緒,在某些場景下執行緒釋放得夠快的話,就不會因為不斷建立執行緒而導致資源耗盡引起的服務崩潰。

2.限流

我們經過測試,發現某個請求能夠承受的最大QPS(每秒查詢率)是1000,那我們就把這個請求的QPS閾值設定成800,超過了這個閾值,請求直接返回被限流的錯誤。

3.倉壁模式(設定獨立執行緒池,空間相對隔離)

艙壁模式實際上就是借鑑於現實生活中的船艙結構而設計,一艘船想要不那麼容易沉也需要具備有一定的”容錯“能力,而早期的船由於設計上的欠缺,只要一個地方進水了,那麼水就會逐漸漫進整個船艙,這種結構的船幾乎沒有“容錯”能力,所以就比較容易沉。於是此時就有人想到將原本一體的船艙分隔成一個個獨立的船艙,船艙之間都使用鋼板焊死隔開,這些鋼板就是所謂的艙壁了。採用這種設計後,就算當其中一個兩個船艙進水了,也不會影響到其他船艙,這艘船依舊能夠正常行駛。
在軟體層面上借鑑這種思想,我們可以讓每個服務都執行在自己獨立的執行緒池中,執行緒池之間是互不干擾的,服務A的執行緒池資源耗盡也不會影響到服務B。此時執行緒池就像船艙的艙壁一樣將不同的服務資源隔離開來,這樣某個服務掛掉也不會影響其他服務的執行。

4.斷路器模式

檢測一定時間內的錯誤率,錯誤數,比如5秒之內錯誤率,錯誤次數,達到某個閾值,就認為B服務所呼叫的A服務掛了,就跳閘(開啟斷路器),就不會堆積那麼多執行緒等待了,然後在10秒之後(稱作斷路器時間視窗),斷路器就變成半開狀態,此狀態向A再次傳送僅一次請求,如果這次請求又失敗了,就再跳閘(斷路器開啟狀態),預設等待10秒(斷路器時間視窗,不是非得10秒,這個值可以自定義),斷路器又變成半開狀態,再次向A傳送一次請求,如果這次請求成功了,斷路器就徹底恢復,閘徹底閉合。

四丶Sentinel是什麼

Sentinel的官方標題是:分散式系統的流量衛兵。從名字上看,很容易猜到它是用來做服務穩定性保障的。對於服務穩定性保障元件,如果熟悉Spring Cloud的使用者,第一反應肯定是Hystrix。但是比較可惜的是 Netflex 已經宣佈對 Hystrix 停止更新。那麼,在未來我們還要什麼更好的選擇呢?除了Spring Cloud 官方推薦的 resilience4j之外,目前Spring Cloud Alibaba下整合的 Sentinel也是使用者重點考察和選型的目標。

Sentinel的功能和細節比較多,一篇內容很難介紹完整。這篇文章只是讓我們對Sentinel有一個整體的認識,後面我們會對如何把 Sentinel 整合到Spring Cloud 應用中做詳細的介紹。

隨著微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。

Sentinel 具有以下特徵
豐富的應用場景: Sentinel 承接了阿里巴巴近10年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的範圍)、訊息削峰天谷、叢集流量控制、實時熔斷下游不可用應用等。
完備的實時監控:Sentinel 同時提供實時的監控功能。你可以在控制檯中看到接入應用的單臺機器秒級資料,甚至500臺以下規模的叢集彙總執行情況。
廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模組,例如與Spring Cloud 、Dubbo、 gRPC的整合。只需要引入相應的依賴並進行簡單的配置即可快速的接入Sentinel。
完整的 SPI 擴充套件點: Sentinel 提供簡單易用、完善的 SPI 擴充套件介面。你可以通過實現擴充套件介面來快速的定製邏輯。例如定製規則管理、適配動態資料來源等。

Sentinel的主要特徵:
Sentinel 的開源生態:

五丶我們開始吧

首先引入pom檔案

<!--容錯sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

然後下載控制檯:https://github.com/alibaba/Sentinel/releases
在下載目錄執行

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.serve=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.3.jar

在瀏覽器輸入:http://localhost:8080
賬號密碼輸入Sentinel就可以進入查看了

下面我們在程式碼中實現開啟application.yml進行如下配置


這樣我們就完成了相關配置。
到此,我們這一章的容錯,以及sentinel的配置就完成了,下期我們詳細講解sentinel的具體使用。
後期會在這個專案上不斷新增,喜歡的請點個start~
專案原始碼參考一下分支220131_xgc_highConcurrency
Gitee:https://gitee.com/coderxgc/springcloud-alibaba
GitHub:https://github.com/coderxgc/springcloud-alibaba

程式碼改變世界