SpringCloudAlibaba-服務容錯Sentinel(入門)

不二塵 發表於 2020-08-09

一:高併發帶來的問題?

在微服務架構中,我們將業務拆分成一個個的服務,服務與服務之間可以相互呼叫,但是由於網路原因或者自身的原因,服務並不能保證服務的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)

https://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)

SpringCloudAlibaba-服務容錯Sentinel(入門)SpringCloudAlibaba-服務容錯Sentinel(入門) 

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

SpringCloudAlibaba-服務容錯Sentinel(入門)

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

SpringCloudAlibaba-服務容錯Sentinel(入門)SpringCloudAlibaba-服務容錯Sentinel(入門)

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

SpringCloudAlibaba-服務容錯Sentinel(入門)

 

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