天天看點

Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰

前言

上一節我們講了Sentinel的簡介和與Hystrix的對比,本節我們講解Sentinel的具體使用。

前期準備

  1. 加入pom依賴
    Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰
<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
           
  1. 修改Nacos的yml配置
    Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰
    Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰
sentinel:
      transport:
        dashboard: localhost:8081
        port: 8719
           
  1. 啟動Sentinel
    Spring Cloud微服務腳手架搭建實戰——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
           
Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰
Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰

4. 啟動pay服務

Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰

實作流控規則

剛才通路了http://127.0.0.1:9003/OrderPay後,sentinel面闆中就出現了服務。
Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰
Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰

添加流控規則

Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰

各項功能參數講解

Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰
Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰

添加測試

Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰
Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰

測試

Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰

可以發現當點選速度過快後就能發現傳回了預設值,禁止了通路。

其他的功能可根據功能講解圖的提示,來體驗一下效果

Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰
Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰

實作降級規則

Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰
Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰

各參數講解圖

Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰

RT規則編碼測試

  1. 給接口加上等待時間,模拟業務處理時間
@GetMapping("/testD") 
public String testD()    { 
 { 
	 try { 
	 	TimeUnit.SECONDS.sleep(1);
	 	 } 
 	catch (InterruptedException e) {
 		 e.printStackTrace(); 
 		 }
 	 log.info("testD 測試RT"); return "------testD";    } ;    
  } 
           
  1. 設定降級規則
    Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰
  2. jmeter工具測試
    Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰
    Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰
    其他的規則請自行測試

熱點規則

根據接口傳遞的參數限流。

  1. 代碼
@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";  
} 

           
  1. 配置規則
    Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰
    Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰
    通路接口測試效果。

系統規則

系統規則隻是将限流規則提升到了整個服務層面,配置基本沒變,隻是對整個系統請求起作用,如QPS限制設定為1,則所有接口超過限制都無法通路。

Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰

授權規則

設定調用方調用服務的白名單和黑名單,白名單調用發可不被流控規則限制。

Spring Cloud微服務腳手架搭建實戰——Sentinel使用實戰

叢集流控

為什麼要使用叢集流控呢?假設我們希望給某個使用者限制調用某個 API 的總 QPS 為 50,但機器數可能很多(比如有 100 台)。這時候我們很自然地就想到,找一個 server 來專門來統計總的調用量,其它的執行個體都與這台 server 通信來判斷是否可以調用。這就是最基礎的叢集流控的方式。

另外叢集流控還可以解決流量不均勻導緻總體限流效果不佳的問題。假設叢集中有 10 台機器,我們給每台機器設定單機限流門檻值為 10 QPS,理想情況下整個叢集的限流門檻值就為 100 QPS。不過實際情況下流量到每台機器可能會不均勻,會導緻總量沒有到的情況下某些機器就開始限流。是以僅靠單機次元去限制的話會無法精确地限制總體流量。而叢集流控可以精确地控制整個叢集的調用總量,結合單機限流兜底,可以更好地發揮流量控制的效果。

叢集流控中共有兩種身份:

Token Client:叢集流控用戶端,用于向所屬 Token Server 通信請求 token。叢集限流服務端會傳回給用戶端結果,決定是否限流。

Token Server:即叢集流控服務端,處理來自 Token Client 的請求,根據配置的叢集規則判斷是否應該發放 token(是否允許通過)。