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)

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)

 

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

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

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

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM