Sentinel之Slots插槽源碼分析授權(quán)規(guī)則(四)

一穿铆、引子

上一節(jié)分析了SystemSlot是如何進(jìn)行系統(tǒng)規(guī)則的檢查的您单,檢查了系統(tǒng)的qps,rt荞雏,thead虐秦,負(fù)載。

接下來繼續(xù)分析Slot鏈的下一個插槽AuthoritySlot(黑白名單控制)凤优。

二悦陋、黑白名單控制

很多時候,我們需要根據(jù)調(diào)用方來限制資源是否通過筑辨,這時候可以使用 Sentinel 的黑白名單控制的功能叨恨。黑白名單根據(jù)資源的請求來源(origin)限制資源是否通過,若配置白名單則只有請求來源位于白名單內(nèi)時才可通過挖垛;若配置黑名單則請求來源位于黑名單時不通過,其余的請求通過秉颗。

調(diào)用方信息通過 ContextUtil.enter(resourceName, origin) 方法中的 origin 參數(shù)傳入痢毒。

規(guī)則配置

黑白名單規(guī)則(AuthorityRule)非常簡單,主要有以下配置項(xiàng):

  • resource:資源名蚕甥,即限流規(guī)則的作用對象
  • limitApp:對應(yīng)的黑名單/白名單哪替,不同 origin 用 , 分隔,如 appA,appB
  • strategy:限制模式菇怀,AUTHORITY_WHITE 為白名單模式凭舶,AUTHORITY_BLACK 為黑名單模式晌块,默認(rèn)為白名單模式

三、源碼分析

1帅霜、AuthoritySlot

public class AuthoritySlot extends AbstractLinkedProcessorSlot<DefaultNode> {

    @Override
    public void entry(Context context, ResourceWrapper resourceWrapper, DefaultNode node, int count, boolean prioritized, Object... args)
        throws Throwable {
        checkBlackWhiteAuthority(resourceWrapper, context);
        fireEntry(context, resourceWrapper, node, count, prioritized, args);
    }

    @Override
    public void exit(Context context, ResourceWrapper resourceWrapper, int count, Object... args) {
        fireExit(context, resourceWrapper, count, args);
    }

    void checkBlackWhiteAuthority(ResourceWrapper resource, Context context) throws AuthorityException {
        Map<String, List<AuthorityRule>> authorityRules = AuthorityRuleManager.getAuthorityRules();

        if (authorityRules == null) {
            return;
        }

        List<AuthorityRule> rules = authorityRules.get(resource.getName());
        if (rules == null) {
            return;
        }

        for (AuthorityRule rule : rules) {
            if (!AuthorityRuleChecker.passCheck(rule, context)) {
                throw new AuthorityException(context.getOrigin());
            }
        }
    }
}

1.在checkBlackWhiteAuthority方法中匆背,首先通過AuthorityRuleManager獲取得到所有的規(guī)則,AuthorityRuleManager是授權(quán)規(guī)則的管理類身冀,可以動態(tài)獲取從dashboard增加的規(guī)則钝尸。
2.根據(jù)資源名獲取該資源對應(yīng)的規(guī)則
3.調(diào)用AuthorityRuleChecker的pass方法進(jìn)行授權(quán)規(guī)則的校驗(yàn),如果返回false說明被攔截了搂根,則拋出一個異常珍促。

2、AuthorityRuleChecker

AuthorityRuleChecker就是授權(quán)規(guī)則檢測的類剩愧,該類是個final修飾的猪叙,下面具體分析。

final class AuthorityRuleChecker {

    static boolean passCheck(AuthorityRule rule, Context context) {
        String requester = context.getOrigin();

        // Empty origin or empty limitApp will pass.
        if (StringUtil.isEmpty(requester) || StringUtil.isEmpty(rule.getLimitApp())) {
            return true;
        }

        // Do exact match with origin name.
        int pos = rule.getLimitApp().indexOf(requester);
        boolean contain = pos > -1;

        if (contain) {
            boolean exactlyMatch = false;
            String[] appArray = rule.getLimitApp().split(",");
            for (String app : appArray) {
                if (requester.equals(app)) {
                    exactlyMatch = true;
                    break;
                }
            }

            contain = exactlyMatch;
        }

        int strategy = rule.getStrategy();
        if (strategy == RuleConstant.AUTHORITY_BLACK && contain) {
            return false;
        }

        if (strategy == RuleConstant.AUTHORITY_WHITE && !contain) {
            return false;
        }

        return true;
    }

    private AuthorityRuleChecker() {}
}

1.首先通過context.getOrigin()獲取請求源仁卷,并判斷requester和limitApp是否為空穴翩。
2.先用requester做精確匹配是否在字符串limitApp中,對于授權(quán)規(guī)則limitApp可以有多個五督,用逗號(,)分隔藏否。
3.然后再判斷requester是否是配置limitApp中的其中的一個,這里為什么會有第二步充包,因?yàn)槿绻鹟imitApp字符串都不包含requester的話副签,requester肯定不在limitApp中,可以理解第二步是一個預(yù)判斷基矮。
4.獲取rule.getStrategy()的策略淆储,這里的策略有兩個。

    public static final int AUTHORITY_WHITE = 0;  //白名單
    public static final int AUTHORITY_BLACK = 1;  //黑名單

5.如果配置的策略是黑名單且requester在配置在limitApp中家浇,則請求攔截本砰。
6.如果配置的策略是白名單且requester在配置不在limitApp中,則請求攔截钢悲。
7.否則請求不攔截点额。

四、我的總結(jié)

1莺琳、AuthoritySlot插槽是整個插槽鏈規(guī)則校驗(yàn)的第二個还棱,用于授權(quán)規(guī)則設(shè)置的校驗(yàn)。
2惭等、授權(quán)規(guī)則有三個配置項(xiàng):resource(資源名)珍手,limitApp(限制來源),strategy(策略)。
3琳要、limitApp可以有多個寡具,用逗號分隔。strategy有兩個策略稚补,白名單童叠、黑名單。
4孔厉、系統(tǒng)規(guī)則限制可以用一句話就說明:如果配置的策略是黑名單且requester在配置在limitApp中拯钻,則請求攔截;如果配置的策略是白名單且requester在配置不在limitApp中撰豺,則請求攔截粪般;否則請求不攔截。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末污桦,一起剝皮案震驚了整個濱河市亩歹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凡橱,老刑警劉巖小作,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異稼钩,居然都是意外死亡顾稀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門坝撑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來静秆,“玉大人,你說我怎么就攤上這事巡李「П剩” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵侨拦,是天一觀的道長殊橙。 經(jīng)常有香客問我,道長狱从,這世上最難降的妖魔是什么膨蛮? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮季研,結(jié)果婚禮上敞葛,老公的妹妹穿的比我還像新娘。我一直安慰自己训貌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著递沪,像睡著了一般豺鼻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上款慨,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天儒飒,我揣著相機(jī)與錄音,去河邊找鬼檩奠。 笑死桩了,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的埠戳。 我是一名探鬼主播井誉,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼整胃!你這毒婦竟也來了颗圣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤屁使,失蹤者是張志新(化名)和其女友劉穎在岂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛮寂,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔽午,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了酬蹋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片及老。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖除嘹,靈堂內(nèi)的尸體忽然破棺而出写半,到底是詐尸還是另有隱情,我是刑警寧澤尉咕,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布叠蝇,位于F島的核電站,受9級特大地震影響年缎,放射性物質(zhì)發(fā)生泄漏悔捶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一单芜、第九天 我趴在偏房一處隱蔽的房頂上張望蜕该。 院中可真熱鬧,春花似錦洲鸠、人聲如沸堂淡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绢淀。三九已至萤悴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間皆的,已是汗流浹背覆履。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留费薄,地道東北人硝全。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像楞抡,于是被迫代替她去往敵國和親伟众。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

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

  • 1.兒童節(jié)快樂拌倍,妹妹在出水痘 2.公司的兒童節(jié)活動 3.今天領(lǐng)了兼職工資赂鲤,買了大西瓜犒勞自己 加油(^ω^)咚咚咚
    北漂中的咚咚咚閱讀 138評論 0 0
  • 1 十年后数初,我們會成什么樣子? 最近喜歡想很多事情梗顺,突然就想到這個話題泡孩。十年后的我們會是什么樣? 猛然想...
    babyfeng筱惵閱讀 242評論 0 1
  • 溫州三天出差寺谤,杭州三天出差仑鸥,轉(zhuǎn)輾上海走親戚。任人與人之間变屁,本身就有吸引力眼俊,有些人,能談得來粟关,感覺很舒服疮胖,有些人,是...
    唐東明閱讀 190評論 0 0