SpringCloudAlibaba-服務容錯Sentinel(入門)

一:高並髮帶來的問題?

在微服務架構中,我們將業務拆分成一個個的服務,服務與服務之間可以相互調用,但是由於網路原因或者自身的原因,服務並不能保證服務的100%可用,如果單個服務出現問題,調用這個服務就會

出現網路延遲,此時若有大量的網路湧入,會形成任務堆積,最終導致服務癱瘓。

由於服務與服務之間的依賴性,故障會傳播,會對整個微服務系統造成災難性的嚴重後果,這就是服務故障的 「雪崩效應」 。

雪崩發生的原因多種多樣,有不合理的容量設計,或者是高並發下某一個方法響應變慢,亦或是某台機器的資源耗盡。我們無法完全杜絕雪崩源頭的發生,只有做好足夠的容錯,保證在一個服務發生問
題,不會影響到其它服務的正常運行。也就是"雪落而不雪崩"。

二:解決方式引入服務容錯機制

常見的容錯思路有隔離、超時、限流、熔斷、降級這幾種,下面分別介紹一下。

  • 隔離:它是指將系統按照一定的原則劃分為若干個服務模組,各個模組之間相對獨立,無強依賴。當有故障發生時,能將問題和影響隔離在某個模組內部,而不擴散風險,不波及其它模組,不影響整體的系統服務。常見的隔離方式有:執行緒池隔離和訊號量隔離.
  • 超時:在上游服務調用下游服務的時候,設置一個最大響應時間,如果超過這個時間,下游未作出反應,就斷開請求,釋放掉執行緒。
  • 限流:限流就是限制系統的輸入和輸出流量已達到保護系統的目的。為了保證系統的穩固運行,一旦達到的需要限制的閾值,就需要限制流量並採取少量措施以完成限制流量的目的。
  • 熔斷:在互聯網系統中,當下游服務因訪問壓力過大而響應變慢或失敗,上游服務為了保護系統整體的可用性,可以暫時切斷對下游服務的調用。這種犧牲局部,保全整體的措施就叫做熔斷。

三:常見的容錯組件

  • Hystrix:由Netflix開源的一個延遲和容錯庫,用於隔離訪問遠程系統、服務或者第三方庫,防止級聯失敗,從而提升系統的可用性與容錯性。
  • Resilience4J:一款非常輕量、簡單,並且文檔非常清晰、豐富的熔斷工具,這也是Hystrix官方推薦的替代產品。不僅如此,Resilicence4j還原生支援Spring Boot 1.x/2.x,而且監控也支援和prometheus等多款主流產品進行整合
  • Sentinel: 是阿里巴巴開源的一款斷路器實現,本身在阿里內部已經被大規模採用,非常穩定。

三者之間的區別

  Sentinel Hystrix resilience4j
隔離策略 訊號量隔離(並發執行緒數限流)

執行緒池隔離/訊號量隔離

訊號量隔離

熔斷降級策略

基於響應時間、異常比率、異常數 基於異常比率

基於異常比率、響應時間

實時統計實現

滑動窗口(LeapArray)

滑動窗口(基於 RxJava)

Ring Bit Buffer

動態規則配置

支援多種數據源 支援多種數據源 有限支援
擴展性 多個擴展點 插件的形式 介面的形式
基於註解的支援 支援 支援 支援
限流 基於 QPS,支援基於調用關係的限流 有限的支援 Rate Limiter
流量整形

支援預熱模式、勻速器模式、預熱排隊模式

不支援

簡單的 Rate Limiter模式

系統自適應保護 支援 不支援 不支援
控制台

提供開箱即用的控制台,可配置規則、查看秒級監控、機器發現等

簡單的監控查看

不提供控制台,可對接其它監控系統

四:Sentinel入門

Sentinel (分散式系統的流量防衛兵) 是阿里開源的一套用於服務容錯的綜合性解決方案。它以流量為切入點, 從流量控制、熔斷降級、系統負載保護等多個維度來保護服務的穩定性。

Sentinel 具有以下特徵:

  • 豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景, 例如秒殺(即突發流量控制在系統容量可以承受的範圍)、消息削峰填谷、集群流量控制、實時熔斷下游不可用應用等。
  • 完備的實時監控:Sentinel 提供了實時的監控功能。通過控制台可以看到接入應用的單台機器秒級數據, 甚至 500 台以下規模的集群的匯總運行情況。
  • 廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模組, 例如與 SpringCloud、Dubbo、gRPC 的整合。只需要引入相應的依賴並進行簡單的配置即可快速地接入Sentinel。
  • 完善的 SPI 擴展點:Sentinel 提供簡單易用、完善的 SPI 擴展介面。您可以通過實現擴展介面來快速地訂製邏輯。例如訂製規則管理、適配動態數據源等。

Sentinel 分為兩個部分:

  1. 核心庫(Java 客戶端)不依賴任何框架/庫,能夠運行於所有 Java 運行時環境,同時對 Dubbo /Spring Cloud 等框架也有較好的支援。
  2. 控制台(Dashboard)基於 Spring Boot 開發,打包後可以直接運行,不需要額外的 Tomcat 等應用容器。

五:微服務集成Sentinel

1: pom.xml引入依賴

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

2:修改application.yml

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080 # 指定控制台服務的地址
        port: 9999

2:測試Controller

@Slf4j
@RestController
@RequestMapping("/sentinel")
public class SentinelController {
    @RequestMapping("/mesg1")
    public String message1(){
        return "message1";
    }

    @RequestMapping("/mesg2")
    public String message2(){
        return "message2";
    }
}

六:安裝Sentinel控制台

Sentinel 提供一個輕量級的控制台, 它提供機器發現、單機資源實時監控以及規則管理等功能。

1:下載jar包(本例版本1.7.0)

//github.com/alibaba/Sentinel/releases

2:啟動控制台

# 直接使用jar命令啟動項目(控制台本身是一個SpringBoot項目)
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.0.jar

3:啟動成功後如圖(localhost:8080    用戶、密碼:sentinel)

 

注意點:sentinel默認是懶載入、所以啟動成功後其實頁面是沒有我們集成的微服務資訊,當我們隨便訪問一個介面時才能看到。

簡單測試一個限流功能,針對/sentinel/mesg1做個流控 如下每秒只能調用2次,超出則訪問失敗

 在瀏覽器快速刷新多次/sentinel/mesg1效果如圖

 

Sentinel集成的一個簡單應用到此就實現了,因為Sentinel的功能不單單如此 寫在一篇篇幅感覺過長,所以接下來再寫一篇進行更進一步的學習。

 

Tags: