有時候會搞亂的blockHandler與fallback

前言

之前老顧介紹了sentinel的降級熔斷文章,有些小夥伴在使用的過程中對blockhandler和fallback的使用會搞亂,這裏老顧在這裏在繼續強化一下他們的區別以及使用。

兩者區別

這裏說明一下,老顧使用的是Alibaba的Sentinel限流降級框架,再之前老顧介紹了Sentinel的限流、服務降級功能,但是隻是限制後,返回不可控的結果肯定是不行的,我們還要保證調用者在調用那些被限制的服務時候,不管是不是被限制,都要讓他們拿到一個合理的結果,而不是扔回去一個異常就完事了。

Sentinel提供了這樣的功能,讓我們可以另外定義一個方法來代替被限制或異常服務返回數據,這就是fallback和blockHandler

fallback:若本接口出現未知異常,則調用fallback指定的接口。

blockHandler:若本次訪問被限流或服務降級,則調用blockHandler指定的接口。

fallback

此回調是針對接口出現異常了,就進入此fallback方法,我們看一下代碼。

從代碼看出,只要請求http://localhost:8081/test?id=2,接口就會報異常,繼而會調用fallback中的方法,走到了testFallback方法中:

在testFallback增加一個Throwable 類型的參數,可以通過這個參數來實現捕獲不同的異常,從而做對應的異常處理。

外置類

fallback 函數位置是有要求的,必須和原方法在同一個類中,但在實際需求中,我們需要放在其他類中。@SentinelResource提供了通過fallbackClass指定對應的類的Class對象,添加一個static函數,否則無法解析。

創建一個FallBackService類,並定義一個static 函數;請求同一個url,效果是一樣的;此好處就是業務代碼類比較簡潔了。

fallback中還有一個defaultFallback

defaultFallback(since 1.6.0):默認的 fallback 函數名稱,可選項,通常用於通用的 fallback 邏輯(即可以用於很多服務或方法)。默認 fallback 函數可以針對所有類型的異常(除了 exceptionsToIgnore 裏面排除掉的異常類型)進行處理。

同時配置了fallback和defaultFallback,則只有 fallback 會生效。 defaultFallback 函數簽名要求:返回值類型必須與原函數返回值類型一致; 方法參數列表需要爲空,或者可以額外多一個 Throwable 類型的參數用於接收對應的異常。defaultFallback函數默認需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 fallbackClass 爲對應的類的 Class 對象,注意對應的函數必須爲 static 函數,否則無法解析。

blockHandler

超出流量限制的部分是否會進入到blockHandler的方法,要注意是超出流量限制的請求調用,會進入blockHandler方法。

blockHandler是針對流量超出的請求,即針對的是BlockException異常;上面的請求都包含了fallback和blockHandler,那效果應該是什麼呢?在Sentinel控制檯配置一下流控規則。

如果請求url的參數id值爲1,如果快速在1秒內請求多次,就超出了流控的設置,進入blockHandler方法。

如果請求url的參數id爲2,因爲會產生異常,所以第一次請求的時候 ,會進入fallback方法,後面快速請求多次就超出了流控,進入blockHandler方法。

i

i

總結

fallback是針對方法出現異常了,則會進入fallback方法。blockhandler是針對流控設置,超出規則,則會進入blockhandler方法。若 blockHandler 和 fallback 都進行了配置,則被限流降級而拋出BlockException時只會進入 blockHandler 處理邏輯。若未配置 blockHandler、fallback 和 defaultFallback,則被限流降級時會將 BlockException 直接拋出。

注:1.6.0 之前的版本 fallback 函數只針對降級異常(DegradeException)進行處理,不能針對業務異常進行處理。

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