您好,登錄后才能下訂單哦!
Sentinel中的熔斷策略有哪些?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
熔斷策略
Sentinel 提供以下幾種熔斷策略:
慢調用比例 (SLOW_REQUEST_RATIO):選擇以慢調用比例作為閾值,需要設置允許的慢調用 RT(即最大的響應時間),請求的響應時間大于該值則統計為慢調用。當單位統計時長(statIntervalMs)內請求數目大于設置的最小請求數目,并且慢調用的比例大于閾值,則接下來的熔斷時長內請求會自動被熔斷。經過熔斷時長后熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求響應時間小于設置的慢調用 RT 則結束熔斷,若大于設置的慢調用 RT 則會再次被熔斷。
異常比例 (ERROR_RATIO):當單位統計時長(statIntervalMs)內請求數目大于設置的最小請求數目,并且異常的比例大于閾值,則接下來的熔斷時長內請求會自動被熔斷。經過熔斷時長后熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。異常比率的閾值范圍是 [0.0, 1.0],代表 0% - 100%。
異常數 (ERROR_COUNT):當單位統計時長內的異常數目超過閾值之后會自動進行熔斷。經過熔斷時長后熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷、
慢調用比例:
最大 RT:200意思是 在200毫秒處理完這個請求
比例閥值:1 意思是是 在200毫秒處理一個請求 你設置幾就就200毫秒處理幾個
熔斷時長:1意思是一秒內不可用
最小請求數:5 意思是 一秒5次請求
異常比例:
比例閥值:官網:(異常比率的閾值范圍是 [0.0, 1.0],代表 0% - 100%)0.3意思錯誤的達到了百分之30的時候 觸發熔斷
熔斷時間:1的意思是一秒之間不可用
最小請求數:5一秒5個
異常數
異常數:3意思是超過3個異常,就是第4次進入熔斷服務降級,當第五次請求是對的就會恢復
熔斷時長:1秒
熱點參數限流
何為熱點?熱點即經常訪問的數據。很多時候我們希望統計某個熱點數據中訪問頻次最高的 Top K 數據,并對其訪問進行限制。比如:
商品 ID 為參數,統計一段時間內最常購買的商品 ID 并進行限制
用戶 ID 為參數,針對一段時間內頻繁訪問的用戶 ID 進行限制
熱點參數限流會統計傳入參數中的熱點參數,并根據配置的限流閾值與模式,對包含熱點參數的資源調用進行限流。熱點參數限流可以看做是一種特殊的流量控制,僅對包含熱點參數的資源調用生效。
示例:
這里有兩個 參數一個是A 一個是B熱點限流是根據設置參數的下標設置的,下表是從0開始的,@SentinelResource
注解設置要限流的id, blockHandler設置返回可預知的響應體
@GetMapping(value = "select/test") @SentinelResource(value = "test",blockHandler = "teat1") public String test(@RequestParam(value = "a",required = false) Integer a,@RequestParam(value = "b",required = false) Integer b){ return "我是:Sentinel"; }
設置的可預知的響應體這個的BlockException
是必須的參數
public String teat1(@RequestParam(value = "a",required = false) Integer a,@RequestParam(value = "b",required = false)Integer b, BlockException e){ return "沒錯我就是我了"; }
配置
test是@SentinelResource(value = "test",blockHandler = "teat1")
參數索引:0就是0下標
單機閥值:1處理的個數
統計窗口時長 1是一秒處理完成
高級選項
參數類型:選擇參數的數據類型
參數值:1就參數如果等于1就限流
限流閥: 3就是3次
這些可以自己測試
服務熔斷
Sentinel 提供了 @SentinelResource 注解用于定義資源,并提供了 AspectJ 的擴展用于自動定義資源、處理 BlockException 等。
@SentinelResource 注解
@SentinelResource 用于定義資源,并提供可選的異常處理和 fallback 配置項。 @SentinelResource 注解包含以下屬性:
value:資源名稱,必需項(不能為空)
entryType:entry 類型,可選項(默認為 EntryType.OUT)
blockHandler / blockHandlerClass: blockHandler 對應處理 BlockException 的函數名稱,可選項。blockHandler 函數訪問范圍需要是 public,返回類型需要與原方法相匹配,參數類型需要和原方法相匹配并且最后加一個額外的參數,類型為 BlockException。blockHandler 函數默認需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 blockHandlerClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。
fallback / fallbackClass:fallback 函數名稱,可選項,用于在拋出異常的時候提供 fallback 處理邏輯。fallback 函數可以針對所有類型的異常(除了 exceptionsToIgnore 里面排除掉的異常類型)進行處理。fallback 函數簽名和位置要求:
返回值類型必須與原函數返回值類型一致;
方法參數列表需要和原函數一致,或者可以額外多一個 Throwable 類型的參數用于接收對應的異常。
fallback 函數默認需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 fallbackClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。
defaultFallback(since 1.6.0):默認的 fallback 函數名稱,可選項,通常用于通用的 fallback 邏輯(即可以用于很多服務或方法)。默認 fallback 函數可以針對所有類型的異常(除了 exceptionsToIgnore 里面排除掉的異常類型)進行處理。若同時配置了 fallback 和 defaultFallback,則只有 fallback 會生效。defaultFallback 函數簽名要求:
返回值類型必須與原函數返回值類型一致;
方法參數列表需要為空,或者可以額外多一個 Throwable 類型的參數用于接收對應的異常。
defaultFallback 函數默認需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 fallbackClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。
exceptionsToIgnore(since 1.6.0):用于指定哪些異常被排除掉,不會計入異常統計中,也不會進入 fallback 邏輯中,而是會原樣拋出。
1.8.0 版本開始,defaultFallback 支持在類級別進行配置。
注:1.6.0 之前的版本 fallback 函數只針對降級異常(DegradeException)進行處理,不能針對業務異常進行處理。
特別地,若 blockHandler 和 fallback 都進行了配置,則被限流降級而拋出 BlockException 時只會進入 blockHandler 處理邏輯。若未配置 blockHandler、fallback 和 defaultFallback,則被限流降級時會將 BlockException 直接拋出(若方法本身未定義 throws BlockException 則會被 JVM 包裝一層 UndeclaredThrowableException)。
示例:
1,fallback
處理java異常
@SentinelResource(value = "select",fallback = "ErrorFallback")
代碼
@GetMapping(value = "select/{id}") @SentinelResource(value = "select",fallback = "ErrorFallback") public CommonResult getid(@PathVariable Long id){ if(id>3) { throw new NullPointerException(id+"沒有記錄"); }else { return restTemplate.getForObject(URL + "/select/" + id, CommonResult.class); } }
fallback 處理方法
public CommonResult ErrorFallback(@PathVariable Long id,Throwable e){ return new CommonResult<>(500,"不好意,沒有此記錄"); }
處理結果
blockHandler 處理sentinel配置異常 java的異常無法處理 @SentinelResource(value = "select",blockHandler = "ErrorFallback") public CommonResult ErrorFallback(@PathVariable Long id, BlockException e){ return new CommonResult<>(500,"不好意,沒有此記錄"+e.getMessage()); }
測試
這設置的是異常比例 異常達到百分之30進行熔斷
兩個注解同時用
@SentinelResource(value = "select",blockHandler = "ErrorFallback",fallback = "ErrorFallback1")
public CommonResult ErrorFallback1(@PathVariable Long id, Throwable e){ return new CommonResult<>(500,"fallback:不好意,沒有此記錄"+e.getMessage()); } public CommonResult ErrorFallback(@PathVariable Long id, BlockException e){ return new CommonResult<>(500,"blockHandler:不好意,沒有此記錄"+e.getMessage()); }
但是 要是blockHandler 和fallback 同時配置則被限流降級拋出異常BlockException 處理
exceptionsToIgnore
@SentinelResource(value = "select",blockHandler = "ErrorFallback",fallback = "ErrorFallback1" ,exceptionsToIgnore = {IllegalAccessException.class})
blockHandlerClass=定義返回統一返回方法.class
業務
@GetMapping(value = "select/test") @SentinelResource(value = "test",blockHandlerClass= MySentinel.class,blockHandler = "a") public String test(@RequestParam(value = "a",required = false) Integer a,@RequestParam(value = "b",required = false) Integer b){ return "我是:Sentinel"; }
熔斷降級
package com.tang.cloud.mysentinel; import com.alibaba.csp.sentinel.slots.block.BlockException; import jdk.nashorn.internal.ir.Block; import org.bouncycastle.crypto.engines.BlowfishEngine; import org.springframework.web.bind.annotation.RequestParam; /** * 統一返回降級處理 */ public class MySentinel { //返回的的類型和調用的方法的類型一致,參數的類型和個數相同 public static String a(@RequestParam(value = "a",required = false) Integer a, @RequestParam(value = "b",required = false) Integer b, BlockException excep){ return "我在在另一個類中定義的方法"; } }
關于Sentinel中的熔斷策略有哪些問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。