SpringCloud Alibaba Sentinel---實現熔斷與限流


  前言:不斷學習就是程序員的宿命

一、概述

  Github官網:https://github.com/alibaba/Sentinel,就是SpringCloud的Hystrix

  下載地址:https://github.com/alibaba/Sentinel/releases

官網:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#spring_cloud_alibaba_sentinel

二、Sentinel 控制台

1、啟動Sentinel

java -jar sentinel-dashboard-1.7.0.jar

2、登錄Web界面

瀏覽器訪問:http://localhost:8080/,用戶名密碼均為:sentinel

 三、Sentinel流控規則

1、流控模式

1.1直接 (默認)

1.1.1 QPS直接失敗

  以下設置表示:1秒鍾內查詢1次就是OK,若次數超過1,就直接-快速失敗,報默認錯誤

1.1.2線程數直接失敗

1.2、關聯

  當關聯的資源達到閾值時,就限流自己;當與A關聯的資源B達到閾值時,就限流A自己(B惹事,A掛了)

  設置:當關聯資源/testB的qps閾值超過1時,就限流/testA的Rest訪問地址,當關聯資源達到閾值后限制配置好的資源名。

2、流控效果

  Github:https://github.com/alibaba/Sentinel/wiki/Flow-Control

2.1 直接-快速失敗

  直接失敗,拋出異常:Blocked by Sentinel(flow limiting)

  源碼:com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController

2.2 直接-預熱

  默認coldFactor為3,即請求QPS從threshold/3開始,經預熱時長逐漸升至設定的QPS閾值。限流冷啟動

  以下是指開始QPS為10/3=3,5秒后慢慢預熱至10

2.3排隊等待  

  勻速排隊,閾值必須設置為QPS(漏桶算法

  源碼:com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController

  以下設置含義:/testA每秒1次請求,超過的話就排隊等待,等待的超時時間為20000毫秒。

四、Sentinel降級規則

  Github:https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7

   Sentinel斷路器沒有半開狀態(Hystrix斷路器是存在半開狀態的)

1、RT

  以下表示:Jmeter永遠1秒鍾打進來10個線程(大於5,官網)調用testD,我們希望200毫米處理完本次任務。如果超過200毫秒還沒處理完,在未來1秒鍾的時間窗口內,斷路器打開(保險絲跳閘)微服務不可用,保險絲跳閘斷電。

2、異常比例

按照以下配置:

①單獨訪問一次,必然來一次報錯一次(int a =10/0;)

②開啟Jmeter,直接高並發發送請求,多次調用達到官網配置條件,斷路器開啟(保險絲跳閘)微服務不可用,不在報錯error而是服務降級了。

3、異常數

  異常數是按照分鍾統計的,訪問:http://localhost:8401/testExceptionCount,第一次訪問絕對報錯(int a = 10/0);但是達到配置的閾值(5)次報錯后,進入熔斷后降級。

五、熱點規則

  官網:https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81

1、熱點key限流

  配置第一個參數(索引0)閾值為1,違背則會進入Fallback兜底方法

2、參數例外項

  基於上述熱點規則,期望p1參數當它為某個特殊值時,限流值與平時不太一樣(例如當p1=5時,它的閾值為200)

六、系統規則

Github:https://github.com/alibaba/Sentinel/wiki/%E7%B3%BB%E7%BB%9F%E8%87%AA%E9%80%82%E5%BA%94%E9%99%90%E6%B5%81

 

 從整體維度對應用入口流量進行控制,而之前限流是細粒度對某個方法進行QPS等配置,這個是整體級別的。

七、SentinelResource配置

Github:https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81

1、按資源名限流

 關閉8401服務,查看流控規則消失,發現規則是臨時的

2、按URL地址限流

3、自定義限流處理邏輯

  上述問題:

      ①系統默認的,沒有體現我們自己的業務要求

      ②依照現有條件,我們自定義的處理方法又和業務代碼耦合在一起,不直觀

      ③每個業務方法都添加一個兜底方法,那代碼膨脹

      ④全局統一的處理方法沒有體現

(1)新增自定義處理方法

public class CustomerBlockHandler {

    public static CommonResult handlerException(BlockException exception) {
        return new CommonResult(444, "客戶自定義,global handlerException---1");
    }

    public static CommonResult handlerException2(BlockException exception) {
        return new CommonResult(444, "客戶自定義,global handlerException---2");
    }
}
View Code

(2)引用

八、Sentinel服務熔斷Ribbon

1、無配置

 

 測試情況

2、配置Fallback,只負責業務異常

 

 測試情況:

3、配置blockhandler,只負責Sentinel控制台配置違規

 

 測試情況

4、配置Fallback和blockhandler

 

 測試情況:

5、異常忽略-exceptionsToIgnore

 

 

 測試情況:

九、Sentinel服務熔斷OpenFeign

 1、application.yml開啟對feign支持

#激活sentinel對feign的支持
feign:
  sentinel:
    enabled: true

2、主類啟用注解@EnableFeignClients

3、Feign接口

 測試情況:停掉9003提供者,服務降級了

十、熔斷框架比較

 

 十一、Sentinel規則持久化

  之前配置在Sentinel的規則在微服務重啟,規則丟失。

  思路:將限流規則持久化進Nacos保存,只要刷新微服務的某個Rest地址,Sentinel控制台的流控規則就能看到,只要Nacos里面的配置不刪除,針對某個微服務的Sentinel規則持續有效

1、application.yml添加如下配置

server:
  port: 8401
spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        # Nacos服務注冊中心地址
        server-addr: localhost:8848
    sentinel:
      transport:
        # sentinel dashboard 地址
        dashboard: localhost:8080
        # 默認為8719,如果被占用會自動+1,直到找到為止
        port: 8719
      # 流控規則持久化到nacos
      datasource:
        dsl:
          nacos:
            server-addr: localhost:8848
            data-id: ${spring.application.name}
            group-id: DEFAULT_GROUP
            data-type: json
            rule-type: flow
management:
  endpoints:
    web:
      exposure:
        include: "*"
application.yml

2、Nacos控制台新建配置文件

  DataId為spring.application.name,json格式如下:

[
    {
        "resource":"/rateLimit/byUrl",
        "limitApp":"default",
        "grade":1,
        "count":1,
        "strategy":0,
        "controlBehavior":0,
        "clusterMode":false
    }
]

①resource:資源名稱(默認請求路徑)

②limitApp:來源應用默認

③grade:閾值類型,0表示線程數,1表示QPS

④count:單機閾值

⑤strategy:流控模式,0表示直接,1表示關聯,2表示鏈路

⑥controlBehavior:流控效果:0表示快速失敗,1表示warmup,2表示排隊等待

⑦clusterMode:是否集群

3、測試情況


免責聲明!

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



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