流控是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進行測試
得到的結果如下: