前言
上一節我們講了Sentinel的簡介和與Hystrix的對比,本節我們講解Sentinel的具體使用。
前期準備
- 加入pom依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
- 修改Nacos的yml配置
sentinel:
transport:
dashboard: localhost:8081
port: 8719
- 啟動Sentinel
@echo off
java -Dserver.port=8081 -Dsentinel.dashboard.auth.username=Bifang -Dsentinel.dashboard.auth.password=Bifang -jar sentinel-dashboard-1.7.2.jar
@echo on
4. 啟動pay服務
實作流控規則
剛才通路了http://127.0.0.1:9003/OrderPay後,sentinel面闆中就出現了服務。
添加流控規則
各項功能參數講解
添加測試
測試
可以發現當點選速度過快後就能發現傳回了預設值,禁止了通路。
其他的功能可根據功能講解圖的提示,來體驗一下效果
實作降級規則
各參數講解圖
RT規則編碼測試
- 給接口加上等待時間,模拟業務處理時間
@GetMapping("/testD")
public String testD() {
{
try {
TimeUnit.SECONDS.sleep(1);
}
catch (InterruptedException e) {
e.printStackTrace();
}
log.info("testD 測試RT"); return "------testD"; } ;
}
- 設定降級規則
- jmeter工具測試 其他的規則請自行測試
熱點規則
根據接口傳遞的參數限流。
- 代碼
@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";
}
- 配置規則 通路接口測試效果。
系統規則
系統規則隻是将限流規則提升到了整個服務層面,配置基本沒變,隻是對整個系統請求起作用,如QPS限制設定為1,則所有接口超過限制都無法通路。
授權規則
設定調用方調用服務的白名單和黑名單,白名單調用發可不被流控規則限制。
叢集流控
為什麼要使用叢集流控呢?假設我們希望給某個使用者限制調用某個 API 的總 QPS 為 50,但機器數可能很多(比如有 100 台)。這時候我們很自然地就想到,找一個 server 來專門來統計總的調用量,其它的執行個體都與這台 server 通信來判斷是否可以調用。這就是最基礎的叢集流控的方式。
另外叢集流控還可以解決流量不均勻導緻總體限流效果不佳的問題。假設叢集中有 10 台機器,我們給每台機器設定單機限流門檻值為 10 QPS,理想情況下整個叢集的限流門檻值就為 100 QPS。不過實際情況下流量到每台機器可能會不均勻,會導緻總量沒有到的情況下某些機器就開始限流。是以僅靠單機次元去限制的話會無法精确地限制總體流量。而叢集流控可以精确地控制整個叢集的調用總量,結合單機限流兜底,可以更好地發揮流量控制的效果。
叢集流控中共有兩種身份:
Token Client:叢集流控用戶端,用于向所屬 Token Server 通信請求 token。叢集限流服務端會傳回給用戶端結果,決定是否限流。
Token Server:即叢集流控服務端,處理來自 Token Client 的請求,根據配置的叢集規則判斷是否應該發放 token(是否允許通過)。