Sentinel實現熔斷和限流


一、概述

1、簡介

​ 隨着微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。github地址:https://github.com/alibaba/Sentinel 。具有以下特征:

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

2、主要特性

3、下載地址:https://github.com/alibaba/Sentinel/releases 。下載好后在命令行窗口執行 java -jar sentinel-dashboard-xxx.jar即可(xxx是下載的版本號),在瀏覽器地址欄輸入http://localhost:8080看到以下界面,便安裝成功。賬號密碼都是 sentinel 。

二、初始化監控工程

1、新建一個模塊,在pom中添加以下依賴;

<dependencies>
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  </dependency>
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  </dependency>
  <!--持久化會用到-->
  <dependency>
      <groupId>com.alibaba.csp</groupId>
      <artifactId>sentinel-datasource-nacos</artifactId>
  </dependency>
  <!--OpenFeign-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
  </dependency>
  <!--引入自己定義的包-->
  <dependency>
      <groupId>com.xhanglog.springcloud</groupId>
      <artifactId>cloud-api-commons</artifactId>
      <version>${project.version}</version>
  </dependency>

  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>
  <!--熱部署-->
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <scope>runtime</scope>
      <optional>true</optional>
  </dependency>
  <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
  </dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
  </dependency>
</dependencies>

2、配置文件application.yml;

server:
port: 8401
spring:
application:
  name: cloudalibaba-sentinel-service
cloud:
  nacos:
    discovery:
      server-addr: localhost:8848 #nacos服務注冊中心地址
  sentinel:
    transport:
      dashboard: localhost:8080 #配置sentinel dashboard地址
      port: 8719 #默認8719端口,如果被占用會+1掃描,直到找到未被占用的端口

management:
endpoints:
  web:
    exposure:
      include: "*"

3、主啟動類加上 @EnableDiscoveryClient 注解。

4、啟動項目,發送一個請求,看sentinel控制台會出現如下圖內容:

三、流控規則

1、增加流控規則的界面如下,官方文檔地址:https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6

說明:

  • 資源名:唯一名稱,默認請求路徑;
  • 針對來源:Sentinel 可以對調用者進行限流,填寫微服務名,默認default(不區分來源);
  • 閾值類型:
    • QPS(每秒鍾請求數量):當調用該api的QPS達到閾值的時候,進行限流;
    • 線程數:當調用該api的線程數達到閾值的時候,進行限流;
  • 流控模式:
    • 直接:api達到限流條件時,直接限流;
    • 關聯:當關聯的資源達到閾值時就限流自己;
    • 鏈路:只記錄指定鏈路上的流量(指定資源從入口進來的流量,如果達到閾值就進行限流);
  • 流控效果:
    • 快速失敗:直接失敗拋異常;
    • Warm Up:根據codeFactor(冷加載因子,默認3)的值,從閾值/codeFactor,經過預熱時長才達到設置的QPS閾值;
    • 排隊等待:勻速排隊,讓請求勻速通過,閾值類型必須設置為QPS,否則無效。

四、降級規則

​ 除了流量控制以外,對調用鏈路中不穩定的資源進行熔斷降級也是保障高可用的重要措施之一。由於調用關系的復雜性,如果調用鏈路中的某個資源不穩定,最終會導致請求發生堆積。Sentinel 熔斷降級會在調用鏈路中某個資源出現不穩定狀態時(例如調用超時或異常比例升高),對這個資源的調用進行限制,讓請求快速失敗,避免影響到其它的資源而導致級聯錯誤。當資源被降級后,在接下來的降級時間窗口之內,對該資源的調用都自動熔斷(默認行為是拋出 DegradeException)。增加降級規則界面如下,官網說明地址:https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7

說明:

  • RT(平均響應時間):

    平均響應時間超出閾值且在時間窗口內通過的請求大於等於5時觸發降級,時間窗口期過后會關閉斷路器,RT最大為4900ms,超出此閾值的都會算作 4900 ms,若需要變更此上限可以通過啟動配置項 -Dcsp.sentinel.statistic.max.rt=xxx 來配置。

  • 異常比例(秒級):

    QPS >= 5,並且每秒異常總數占通過量的比值超過閾值之后,資源進入降級狀態,異常比率的閾值范圍是 [0.0, 1.0],代表 0% - 100%。時間窗口結束后關閉降級。

  • 異常數(分鍾級):

    資源近 1 分鍾的異常數目超過閾值之后會進行熔斷。注意由於統計時間窗口是分鍾級別的,若 時間窗口小於 60s,則結束熔斷狀態后仍可能再進入熔斷狀態。

五、熱點 Key 限流

​ 統計某個熱點數據中訪問頻次最高的 Top K 數據,並對其訪問進行限制。熱點參數限流會統計傳入參數中的熱點參數,並根據配置的限流閾值與模式,對包含熱點參數的資源調用進行限流。熱點參數限流可以看做是一種特殊的流量控制,僅對包含熱點參數的資源調用生效。請求如下圖,官網地址:https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81

配置舉例:

  • 編寫兩個方法

    @GetMapping("/testHotKey")
    @SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
    public String testHotKey(@RequestParam(value = "p1",required = false)String p1,
                             @RequestParam(value = "p2",required = false)String p2){
        return "************************testHotKey";
    }
    
    public String deal_testHotKey(String p1, String p2, BlockException exception){
        return "************************deal_testHotKey";
    }
    
  • 熱點規則配置如下圖;

  • 當瀏覽器沒秒請求包含p1參數的次數超過1次,會執行deal_testHotKey的結果。

六、規則持久化

1、將sentinel的規則持久化到nacos中,在pom中引入以下依賴;

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

2、在配置文件中添加以下配置:

spring:
  cloud:
    sentinel:
      #將sentinel配置信息持久化到nacos
      datasource:
        ds1:
          nacos:
            server-addr: localhost:8848
            dataId: cloudalibaba-sentinel-service
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow

3、在nacos中加入配置,文件類型為json,dataId就是以上配置的dataId;

[
    {
        "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表示Warm UP,2表示排隊等待;
  • clusterMode:是否集群。

案例代碼地址:https://github.com/xhanglog/springcloud-learning


免責聲明!

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



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