一個(gè)注解搞懂 Sentinel嫁艇,@SentinelResource總結(jié)

在前面的博客中,我給大家演示了使用 @SentinelResource 定義資源完成限流的例子好渠,下面就從源碼解析昨稼,看下SentinelResource是如何實(shí)現(xiàn)限流的。



@SentinelResource可以說是Sentinel學(xué)習(xí)的突破口拳锚,搞懂了這個(gè)注解的應(yīng)用假栓,基本上就搞清楚了 Sentinel 的大部分應(yīng)用場(chǎng)景。

一霍掺、@SentinelResource 解析

Sentinel 提供了 @SentinelResource 注解用于定義資源匾荆,并提供了 AspectJ 的擴(kuò)展用于自動(dòng)定義資源、處理 BlockException 等抗楔。

1棋凳、SentinelResource源碼

查看 Sentinel的源碼,可以看到 SentinelResource 定義了value,entryType,resourceType,blockHandler,fallback,defaultFallback等屬性连躏。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface SentinelResource {

    /**
     * @return 
     */
    String value() default "";

    /**
     * @return the entry type (inbound or outbound), outbound by default
     */
    EntryType entryType() default EntryType.OUT;

    /**
     * @return the classification (type) of the resource
     * @since 1.7.0
     */
    int resourceType() default 0;

    /**
     * @return name of the block exception function, empty by default
     */
    String blockHandler() default "";

    /**
     * The {@code blockHandler} is located in the same class with the original method by default.
     * However, if some methods share the same signature and intend to set the same block handler,
     * then users can set the class where the block handler exists. Note that the block handler method
     * must be static.
     * @return the class where the block handler exists, should not provide more than one classes
     */
    Class<?>[] blockHandlerClass() default {};

    /**
     * @return name of the fallback function, empty by default
     */
    String fallback() default "";

    /**
     * The {@code defaultFallback} is used as the default universal fallback method.
     * It should not accept any parameters, and the return type should be compatible
     * @return name of the default fallback method, empty by default
     * @since 1.6.0
     */
    String defaultFallback() default "";

    /**
     * The {@code fallback} is located in the same class with the original method by default.
     * However, if some methods share the same signature and intend to set the same fallback,
     * then users can set the class where the fallback function exists. Note that the shared fallback method
     * @return the class where the fallback method is located (only single class)
     * @since 1.6.0
     */
    Class<?>[] fallbackClass() default {};

    /**
     * @return the list of exception classes to trace, {@link Throwable} by default
     * @since 1.5.1
     */
    Class<? extends Throwable>[] exceptionsToTrace() default {Throwable.class};
    
    /**
     * Indicates the exceptions to be ignored. Note that {@code exceptionsToTrace} should
     * not appear with {@code exceptionsToIgnore} at the same time, or {@code exceptionsToIgnore}
     * will be of higher precedence.
     *
     * @return the list of exception classes to ignore, empty by default
     * @since 1.6.0
     */
    Class<? extends Throwable>[] exceptionsToIgnore() default {};
}

2剩岳、屬性說明

參考源碼的注釋,逐個(gè)解釋下這幾個(gè)屬性的作用入热。

value

資源名稱拍棕,必需項(xiàng),因?yàn)樾枰ㄟ^resource name找到對(duì)應(yīng)的規(guī)則勺良,這個(gè)是必須配置的绰播。

entryType

entry 類型,可選項(xiàng)尚困,有IN和OUT兩個(gè)選項(xiàng)蠢箩,默認(rèn)為 EntryType.OUT。

public enum EntryType {
    IN("IN"),
    OUT("OUT");
}

blockHandler

blockHandler 對(duì)應(yīng)處理 BlockException 的函數(shù)名稱,可選項(xiàng)谬泌。
blockHandler 函數(shù)訪問范圍需要是 public滔韵,返回類型需要與原方法相匹配,參數(shù)類型需要和原方法相匹配并且最后加一個(gè)額外的參數(shù)掌实,類型為 BlockException陪蜻。

blockHandlerClass

blockHandler 函數(shù)默認(rèn)需要和原方法在同一個(gè)類中,如果希望使用其他類的函數(shù)贱鼻,則需要指定 blockHandlerClass 為對(duì)應(yīng)的類的 Class 對(duì)象宴卖,注意對(duì)應(yīng)的函數(shù)必需為 static 函數(shù),否則無法解析邻悬。

fallback

fallback 函數(shù)名稱症昏,可選項(xiàng),用于在拋出異常的時(shí)候提供 fallback 處理邏輯拘悦。fallback 函數(shù)可以針對(duì)所有類型的異常(除了 exceptionsToIgnore 里面排除掉的異常類型)進(jìn)行處理齿兔。

fallbackClass

fallbackClass的應(yīng)用和blockHandlerClass類似,fallback 函數(shù)默認(rèn)需要和原方法在同一個(gè)類中础米。
若希望使用其他類的函數(shù)分苇,則可以指定 fallbackClass 為對(duì)應(yīng)的類的 Class 對(duì)象,注意對(duì)應(yīng)的函數(shù)必需為 static 函數(shù)屁桑,否則無法解析医寿。

defaultFallback(since 1.6.0)

如果沒有配置defaultFallback方法,默認(rèn)都會(huì)走到這里來蘑斧。
默認(rèn)的 fallback 函數(shù)名稱靖秩,可選項(xiàng),通常用于通用的 fallback 邏輯竖瘾。
默認(rèn) fallback 函數(shù)可以針對(duì)所有類型的異常(除了 exceptionsToIgnore 里面排除掉的異常類型)進(jìn)行處理沟突。若同時(shí)配置了 fallback 和 defaultFallback,則只有 fallback 會(huì)生效捕传。

exceptionsToIgnore(since 1.6.0)

用于指定哪些異常被排除掉惠拭,不會(huì)計(jì)入異常統(tǒng)計(jì)中,也不會(huì)進(jìn)入 fallback 邏輯中庸论,而是會(huì)原樣拋出职辅。

二、Sentinel切面配置

應(yīng)用 @SentinelResource 注解聂示,必須開啟對(duì)應(yīng)的切面域携,引入SentinelResourceAspect。

1鱼喉、AspectJ方式

Sentinel支持 AspectJ 的擴(kuò)展用于自動(dòng)定義資源秀鞭、處理 BlockException 等趋观,如果應(yīng)用中開啟了 AspectJ,那么需要在 aop.xml 文件中引入對(duì)應(yīng)的 Aspect:

<aspects>
    <aspect name="com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect"/>
</aspects>

2气筋、Spring AOP 方式

如果應(yīng)用中使用了 Spring AOP拆内,需要在代碼中添加SentinelResourceAspect的Bean旋圆,通過配置的方式將 SentinelResourceAspect 注冊(cè)為一個(gè) Spring Bean:

@Configuration
public class SentinelAspectConfiguration {

    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }
}

三宠默、總結(jié)

這節(jié)內(nèi)容學(xué)習(xí)了@SentinelResource的相關(guān)屬性,以及在項(xiàng)目中通過切面開啟SentinelResource的方式灵巧,不過為什么使用@SentinelResource必須開啟切面搀矫?
下一節(jié)就學(xué)習(xí)下 Sentinel中的 SentinelResourceAspect 切面原理。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刻肄,一起剝皮案震驚了整個(gè)濱河市瓤球,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌敏弃,老刑警劉巖卦羡,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異麦到,居然都是意外死亡绿饵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門瓶颠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拟赊,“玉大人,你說我怎么就攤上這事粹淋∥睿” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵桃移,是天一觀的道長(zhǎng)屋匕。 經(jīng)常有香客問我,道長(zhǎng)借杰,這世上最難降的妖魔是什么过吻? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮第步,結(jié)果婚禮上疮装,老公的妹妹穿的比我還像新娘。我一直安慰自己粘都,他們只是感情好廓推,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著翩隧,像睡著了一般樊展。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天专缠,我揣著相機(jī)與錄音雷酪,去河邊找鬼。 笑死涝婉,一個(gè)胖子當(dāng)著我的面吹牛哥力,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播墩弯,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼吩跋,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了渔工?” 一聲冷哼從身側(cè)響起锌钮,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎引矩,沒想到半個(gè)月后梁丘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旺韭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年氛谜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茂翔。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡混蔼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出珊燎,到底是詐尸還是另有隱情惭嚣,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布悔政,位于F島的核電站晚吞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谋国。R本人自食惡果不足惜槽地,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芦瘾。 院中可真熱鬧捌蚊,春花似錦、人聲如沸近弟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祷愉。三九已至窗宦,卻和暖如春赦颇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赴涵。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工媒怯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人髓窜。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓扇苞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親纱烘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杨拐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容