SpringCloud Alibaba-5-服務容錯
1. 微服務架構中高併發帶來的問題
在微服務架構中,我們將業務拆分成一個個的服務,服務與服務之間可以相互呼叫,
但是由於網路原因或者自身的原因,服務並不能保證服務的100%可用。
如果單個服務出現問題,呼叫這個服務就會出現網路延遲,此時若有大量的網路湧入,會形成任務堆積,最終導致服務癱瘓。
2. 服務雪崩效應
在分散式系統中,由於網路原因或自身的原因,服務一般無法保證 100% 可用。
如果一個服務出現了問題,呼叫這個服務就會出現執行緒阻塞的情況,此時若有大量的請求湧入,就會出現多條執行緒阻塞等待,進而導致服務癱瘓。
由於服務與服務之間的依賴性,故障會傳播,會對整個微服務系統造成災難性的嚴重後果,這就是服務故障的 “雪崩效應” 。
3. 服務雪崩常見容錯方案
常見的容錯思路有隔離、超時、限流、熔斷、降級這幾種。
-
隔離
指將系統按照一定的原則劃分為若干個服務模組,各個模組之間相對獨立,無強依賴。
當有故障發生時,能將問題和影響隔離在某個模組內部,而不擴散風險,不波及其它模組,不影響整體的系統服務。
常見的隔離方式有:執行緒池隔離和訊號量隔離。 -
超時
指在上游服務呼叫下游服務的時候,設定一個最大響應時間,如果超過這個時間,下游未作出反應,就斷開請求,釋放掉執行緒。 -
限流
指限制系統的輸入和輸出流量以達到保護系統的目的。
為了保證系統的穩固執行,一旦達到的需要限制的閾值,就需要限制流量並採取少量措施以完成限制流量的目的。 -
熔斷
指當下遊服務因訪問壓力過大而響應變慢或失敗,上游服務為了保護系統整體的可用性,可以暫時切斷對下游服務的呼叫。
這種犧牲區域性,保全整體的措施就叫做熔斷。
-
降級
指為服務提供一個託底方案,一旦服務無法正常呼叫,就使用託底方案。
4. 常見的容錯元件
-
Hystrix
Hystrix是由Netflix開源的一個延遲和容錯庫,用於隔離訪問遠端系統、服務或者第三方庫,防止級聯失敗,從而提升系統的可用性與容錯性。 -
Sentinel
阿里巴巴開源的一款斷路器實現,本身在阿里內部已經被大規模採用,非常穩定。
5. Hystrix快速入門
PS:Hystrix已經不維護了。
6. Sentinel快速入門-整合Sentinel
6.1 什麼是Sentinel
Sentinel (分散式系統的流量防衛兵) 是阿里開源的一套用於服務容錯的綜合性解決方案。
它以流量為切入點, 從流量控制、熔斷降級、系統負載保護等多個維度來保護服務的穩定性。
Sentinel 分為兩個部分:
-
核心庫(Java 客戶端)不依賴任何框架/庫,能夠運行於所有 Java 執行時環境,同時對 Dubbo /Spring Cloud 等框架也有較好的支援。
-
控制檯(Dashboard)基於 Spring Boot 開發,打包後可以直接執行,不需要額外的 Tomcat 等應用容器。
6.2 微服務整合Sentinel
新增依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
安裝Sentinel控制檯
7. Sentinel的概念和功能
7.1 基本概念
-
資源
Sentinel的資源就是指Sentinel要保護的東西(它可以是 Java 應用程式中的任何內容,可以是一個服務,也可以是一個方法,甚至可以是一段程式碼。)。 -
規則
Sentinel的規則就是指定義如何進行保護資源。
作用在資源之上, 定義以什麼樣的方式保護資源,主要包括流量控制規則、熔斷降級規則以及系統保護規則。
- 功能
Sentinel的主要功能就是容錯,主要體現在如下三個方面:-
流量控制
-
熔斷降級
當檢測到呼叫鏈路中某個資源出現不穩定的表現,例如請求響應時間長或異常比例升高的時候,則對這個資源的呼叫進行限制,讓請求快速失敗,避免影響到其它的資源而導致級聯故障。
Sentinel 對這個問題採取了兩種手段:通過併發執行緒數進行限制Sentinel 通過限制資源併發執行緒的數量,來減少不穩定資源對其它資源的影響。當某個資源出現不穩定的情況下,例如響應時間變長,對資源的直接影響就是會造成執行緒數的逐步堆積。當執行緒數在特定資源上堆積到一定的數量之後,對該資源的新請求就會被拒絕。堆積的執行緒完成任務後才開始繼續接收請求。通過響應時間對資源進行降級除了對併發執行緒數進行控制以外,Sentinel 還可以通過響應時間來快速降級不穩定的資源。當依賴的資源出現響應時間過長後,所有對該資源的訪問都會被直接拒絕,直到過了指定的時間視窗之後才重新恢復。 -
系統負載保護
-