Sentinel之Entry構(gòu)建源碼解析

一宗雇、Entry介紹

  • Entry是sentinel中用來表示是資源是否可以繼續(xù)執(zhí)行一個憑證鸽照,可以理解為token情妖。
  • 使用SphU.entry()時胎署,會返回一個entry吆录,如果拋出了一個異常BlockException,說明資源被保護了琼牧。
  • 使用 SphO.entry() 時恢筝,資源被保護了會返回false,反之true巨坊。

二撬槽、組成

先看代碼

public abstract class Entry {

    private static final Object[] OBJECTS0 = new Object[0];

    private long createTime;
    private Node curNode;
    /**
     * {@link Node} of the specific origin, Usually the origin is the Service Consumer.
     */
    private Node originNode;
    private Throwable error;
    protected ResourceWrapper resourceWrapper;
   
    //以下代碼省略
}

class CtEntry extends Entry {

    protected Entry parent = null;
    protected Entry child = null;

    protected ProcessorSlot<Object> chain;
    protected Context context;
  
    //以下代碼省略
}

Entry

  • createTime:當前entry的創(chuàng)建時間,毫秒值趾撵,用來計算響應(yīng)時間rt侄柔。
  • curNode:當前Entry所關(guān)聯(lián)的node,會在NodeSelectorSlot插槽中設(shè)置占调,主要是記錄了當前Context下的統(tǒng)計信息暂题。
  • originNode:context的請求源節(jié)點,通常是服務(wù)的消費端究珊,如果存在的話薪者,在ClusterBuilderSlot的entry方法中設(shè)置
  • resourceWrapper:當前Entry所關(guān)聯(lián)的資源包裝器

CtEntry

CtEntry 是 Entry的子類,主要保存了實體之間的關(guān)系剿涮、調(diào)用鏈言津、上下文信息。

  • parent:entry的父entry取试,用于在同一個context上下文中悬槽,多次調(diào)用entry方法,保存entry之間的關(guān)系瞬浓。
  • child:entry的子entry初婆,與parent相反
  • chain:entry中的插槽鏈,上一篇文章介紹過:見:http://www.reibang.com/p/f2dd45f02fe8
  • context:entry的上下文

三瑟蜈、Entry源碼分析

Entry是在CtShp類調(diào)用創(chuàng)建的烟逊;

    Entry e = new CtEntry(resourceWrapper, chain, context);

進入到CtEntry中:

  CtEntry(ResourceWrapper resourceWrapper, ProcessorSlot<Object> chain, Context context) {
        //調(diào)用父類構(gòu)造器
        super(resourceWrapper);
        //設(shè)置插槽鏈,資源的保護進行
        this.chain = chain;
        //設(shè)置上下文
        this.context = context;

        setUpEntryFor(context);
    }
      
    //更新entry父子關(guān)系
    private void setUpEntryFor(Context context) {
        // The entry should not be associated to NullContext.
        if (context instanceof NullContext) {
            return;
        }
       //獲取context的當前的entry铺根,并設(shè)為parent
        this.parent = context.getCurEntry();
        if (parent != null) {
            //如果parent存在宪躯,并把parent的entry的child設(shè)為前的entry
            ((CtEntry)parent).child = this;
        }
        //設(shè)置context的當前entry
        context.setCurEntry(this);
    }

可以發(fā)現(xiàn)
1、在CtEntry的父類Entry中設(shè)置的entry的createTime為當前時間
2位迂、在CtEntry中访雪,主要對chain详瑞、context賦值以及parent、child的關(guān)系確定臣缀;

具體分析
當在一個context上下文中首次調(diào)用時坝橡,context.getCurEntry()為null;
Entry的關(guān)系如圖:

Entry

這個時候entry的parent和child都是null精置,只是設(shè)置context.setCurEntry(this)了计寇;

第二次調(diào)用時,context.getCurEntry()是有值的脂倦,這個時候設(shè)置parent和child番宁;
Entry的關(guān)系如圖:

entry

接下來,如果還有entry進來赖阻,會繼續(xù)設(shè)置parent蝶押,child關(guān)系;即在一個上下文context中保存entry之間的父子關(guān)系火欧。

細心的讀者可以發(fā)現(xiàn)在Entry中還有以下兩個變量:

    private Node curNode;

    private Node originNode;
  • 我們可以把Entry理解為Context這個樹的樹干棋电,curNode理解為Entry樹干的葉子,originNode為樹的根苇侵。
  • curNode保存了這一次調(diào)用統(tǒng)計信息赶盔,curNode節(jié)點在NodeSelectorSlot中設(shè)置的。
  • originNode保存了在這個上下文中衅檀,所有的調(diào)用的統(tǒng)計信息和招刨,originNode是一個StatisticNode節(jié)點霎俩,originNode設(shè)置的前提是origin不為空哀军。

四、我的總結(jié)

1打却、Entry的含義杉适,可以理解為一次調(diào)用的憑證。
2柳击、介紹了Entry對象的組成部分及對應(yīng)含義猿推。
3、通過源碼構(gòu)建的分析捌肴,理解的parent和child的關(guān)系蹬叭,在同一個上下文中初次調(diào)用parent和child都為空,后續(xù)在調(diào)用時parent即為上一調(diào)用enry状知。
4秽五、Entry的curNode、originNode是用來保存統(tǒng)計信息Node饥悴。


以上內(nèi)容坦喘,如有不當之處盲再,請指正

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瓣铣,隨后出現(xiàn)的幾起案子答朋,更是在濱河造成了極大的恐慌,老刑警劉巖棠笑,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梦碗,死亡現(xiàn)場離奇詭異,居然都是意外死亡蓖救,警方通過查閱死者的電腦和手機叉弦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來藻糖,“玉大人淹冰,你說我怎么就攤上這事【奁猓” “怎么了樱拴?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洋满。 經(jīng)常有香客問我晶乔,道長,這世上最難降的妖魔是什么牺勾? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任正罢,我火速辦了婚禮,結(jié)果婚禮上驻民,老公的妹妹穿的比我還像新娘翻具。我一直安慰自己,他們只是感情好回还,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布裆泳。 她就那樣靜靜地躺著,像睡著了一般柠硕。 火紅的嫁衣襯著肌膚如雪工禾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天蝗柔,我揣著相機與錄音闻葵,去河邊找鬼。 笑死癣丧,一個胖子當著我的面吹牛槽畔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坎缭,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼竟痰,長吁一口氣:“原來是場噩夢啊……” “哼签钩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坏快,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤铅檩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后莽鸿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昧旨,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年祥得,在試婚紗的時候發(fā)現(xiàn)自己被綠了兔沃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡级及,死狀恐怖乒疏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饮焦,我是刑警寧澤怕吴,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站县踢,受9級特大地震影響转绷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜硼啤,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一议经、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谴返,春花似錦煞肾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拯爽。三九已至索抓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毯炮,已是汗流浹背逼肯。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桃煎,地道東北人篮幢。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像为迈,于是被迫代替她去往敵國和親三椿。 傳聞我的和親對象是個殘疾皇子缺菌,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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