默認情況下,Sentinel會將controller中的方法作為被保護資源,Sentinel中的資源用Entry來表示。
Sentinel中Entry可以理解為每次進入資源的一個憑證,如果調用SphO.entry()或者SphU.entry()能獲取Entry對象,代表獲取了憑證,沒有被限流,否則拋出一個BlockException。
Entry是一個抽象的類,在Sentinel中真正創建的Entry是CtEntry。
Entry
- createTime:當前entry的創建時間,毫秒值,用來計算響應時間rt。
- curNode:當前Entry所關聯的node,會在NodeSelectorSlot插槽中設置,主要是記錄了當前Context下的統計信息。
- originNode:context的請求源節點,通常是服務的消費端,如果存在的話,在ClusterBuilderSlot的entry方法中設置
- resourceWrapper:當前Entry所關聯的資源包裝器
CtEntry
CtEntry 是 Entry的子類,主要保存了實體之間的關系、調用鏈、上下文信息。
- parent:entry的父entry,用于在同一個context上下文中,多次調用entry方法,保存entry之間的關系。
- child:entry的子entry,與parent相反
- chain:entry中的插槽鏈
- context:entry的上下文
Sentinel中的資源用Entry來表示。聲明Entry的API示例:
// 資源名可使用任意有業務語義的字符串,比如方法名、接口名或其它可唯一標識的字符串。
try (Entry entry = SphU.entry("resourceName")) {// 被保護的業務邏輯// do something here...
} catch (BlockException ex) {// 資源訪問阻止,被限流或被降級// 在此處進行相應的處理操作
}
Sentinel 提供了?@SentinelResource
?注解用于定義資源,并提供了 AspectJ 的擴展用于自動定義資源、處理?BlockException
?等?。
@SentinelResource屬性?
參數 | 描述 |
---|---|
value | 資源名稱,必需項(不能為空) |
entryType | 資源調用方向,可選項(默認為EntryType.OUT ) |
resourceType | 資源的分類 |
blockHandler | 對應處理BlockException 的函數名稱 |
blockHandlerClass | 處理類的Class 對象,函數必需為static 函數 |
fallback | 用于在拋出異常的時候提供fallback 處理邏輯 |
defaultFallback | 用作默認的回退的方法 |
fallbackClass | 異常類的Class 對象,函數必需為static 函數 |
exceptionsToTrace | 異常類跟蹤列表(默認為Throwable.class) |
exceptionsToIgnore | 排除掉的異常類型 |
@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
?
默認的 fallback 函數名稱,可選項,通常用于通用的 fallback 邏輯(即可以用于很多服務或方法)。默認 fallback 函數可以針對所有類型的異常(除了 exceptionsToIgnore
里面排除掉的異常類型)進行處理。若同時配置了 fallback 和 defaultFallback,則只有 fallback 會生效
- 返回值類型必須與原函數返回值類型一致;
- 方法參數列表需要為空,或者可以額外多一個
Throwable
類型的參數用于接收對應的異常。- defaultFallback 函數默認需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定
fallbackClass
為對應的類的Class
對象,注意對應的函數必需為 static 函數,否則無法解析。
exceptionsToIgnore
?
用于指定哪些異常被排除掉,不會計入異常統計中,也不會進入 fallback 邏輯中,而是會原樣拋出。
1.8.0 版本開始,
defaultFallback
支持在類級別進行配置。注:1.6.0 之前的版本 fallback 函數只針對降級異常(
DegradeException
)進行處理,不能針對業務異常進行處理。特別地,若 blockHandler 和 fallback 都進行了配置,則被限流降級而拋出
BlockException
時只會進入blockHandler
處理邏輯。若未配置blockHandler
、fallback
和defaultFallback
,則被限流降級時會將BlockException
直接拋出(若方法本身未定義 throws BlockException 則會被 JVM 包裝一層UndeclaredThrowableException
)。
public class TestService {// 原函數@SentinelResource(value = "hello", blockHandler = "exceptionHandler", fallback = "helloFallback")public String hello(long s) {return String.format("Hello at %d", s);}// Fallback 函數,函數簽名與原函數一致或加一個 Throwable 類型的參數.public String helloFallback(long s) {return String.format("Halooooo %d", s);}// Block 異常處理函數,參數最后多一個 BlockException,其余與原函數一致.public String exceptionHandler(long s, BlockException ex) {// Do some log here.ex.printStackTrace();return "Oops, error occurred at " + s;}// 這里單獨演示 blockHandlerClass 的配置.// 對應的 `handleException` 函數需要位于 `ExceptionUtil` 類中,并且必須為 public static 函數.@SentinelResource(value = "test", blockHandler = "handleException", blockHandlerClass = {ExceptionUtil.class})public void test() {System.out.println("Test");}
}