Alibaba Sentinel 二 :Sentinel流控規則

流控是Sentinel核心功能之一,流控指的是流量控制。

Sentinel的流控操作起來非常簡單,在控制檯進行配置即可看見效,所見即所得。

名詞解釋

資源名: 唯一名稱,默認是請求路徑

針對來源: Sentinel可以針對調用者進行限流,填寫微服務的名稱,默認是default(不區分來源)

閾值類型/單機閾值:可隨時更改,無需重啓系統

  • QPS:每秒的請求數量,當調用該api的QPS達到閾值的時候進行限流。
  • 線程數: 當調用該api的線程數達到閾值的時候進行限流。

流控模式:

  • 直接:api達到限流條件時,直接限流
  • 關聯:當關聯的資源達到限流條件時,限流自己
  • 鏈路:只記錄指定鏈路上的流量(指定資源從入口資源進來的流量,如果達到閾值,就進行限流)【api級別的針對來源】

流控效果:

  • 快速失敗:直接失敗,拋出異常
  • Warm Up: 根據codeFactor(冷加載因子,默認3)的值,從閾值/codeFactor,經過預熱時長,才達到設置的QPS閾值
  • 排隊等待:勻速排隊,讓請求以勻速通過,閾值類型必須設置爲QPS

QPS直接失敗

配置:每秒鐘只能有一個請求。瀏覽器快速刷新請求,會出現下圖的效果

Blocked by Sentinel (flow limiting) 是sentinel提供的默認提示語,表示已經被限流了。提示語的修改,後面會進一步講解。

線程數直接失敗

添加新的配置

新增一個接口進行測試,因爲通過線程進行限流,便於演示,所以讓線程睡眠了2秒鐘。

@GetMapping("/testThreadLimit")
public String testThreadLimit() {
    try {
        Thread.sleep(2000);
    } catch (Exception e){
        e.printStackTrace();
    }
    return "----testThreadLimit";
}

打開兩個頁面,分別快速請求一次,因爲其中一個線程會阻塞2秒鐘,所以另一個請求就會被限流。


流控模式-關聯

上文提到的名稱解釋,關聯就是:當關聯的資源達到限流條件時,限流自己。

舉例說明:新增兩個接口testA,testB,在控制檯中將兩個接口進行關聯,如果testB訪問觸發限制條件,testA就不能被訪問了。

在實際開發中,比如支付接口正在經歷着巨大的訪問壓力,這個時候對下單的接口進行限流就很有必要了。

1. 新增接口

@GetMapping("/testA")
public String testA() {
    return "----testA";
}

@GetMapping("/testB")
public String testB() {
    return "----testB";
}

2. sentinel添加規則

3. 爲了持續對testB接口進行訪問,我使用postman進行模擬。

4. 當使用postman進行訪問testB時,瀏覽器訪問testA,會發現訪問testA返回的是限流的信息。等postman訪問結束後,再次訪問testB,就會發現恢復正常了。

流控效果-Warm Up(預熱)

上圖是配置的效果圖。期望單機每秒限制12次的訪問,但是由於預熱初始化爲3,也就是說5秒後,由每秒3次轉化成每秒12次的限制。

實際操作的效果:不停的請求,剛開始會出現限流信息,慢慢的,達到5秒鐘後,如果你無法在1秒內請求12次,就無法觸發限流規則了。

流控效果-排隊等待

排隊等待就是在不超時的前提下,按照單機閾值進行執行。

如上圖所示,如果一瞬間有10個請求過來,系統會一秒鐘處理一個請求。testA稍加修改

@GetMapping("/testA")
public String testA() {
    System.out.println(DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss") + "  ------" + Thread.currentThread().getName());
    return "----testA";
}

使用postman進行測試

得到的結果如下:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章