sentinel context元件原始碼分析

2021-09-29 03:31:40 字數 3039 閱讀 1767

context元件在sentinel中扮演的是一種什麼樣的角色呢?借用原作者的注釋:

this class holds metadata of current invocation

其實就是儲存一次資源訪問鏈路元資料的類,鏈路的各個節點都能通過獲取鏈路繫結的context來獲取一些資訊進行相應的處理。很多涉及鏈路的框架都會有類似設計,例如netty的channelhandlercontext,go語言網路包中的context等等。下面通過原始碼分析sentinel中context的建立和使用流程。

com.alibaba.csp.sentinel.context.context

public

class

context

. each is associated with a distinct context name.

*/private

static

volatile map

contextnamenodemap =

newhashmap

<

>()

;private

static

final reentrantlock lock =

newreentrantlock()

;private

static

final context null_context =

newnullcontext()

;static

private

static

void

initdefaultcontext()

...

contextutil持有了乙個執行緒本地變數和乙個靜態的node map,通過分析它的trueenter方法可以知道這兩個變數的作用

com.alibaba.csp.sentinel.context.contextutil#trueenter

protected

static context trueenter

(string name, string origin)

else

else}}

finally}}

context =

newcontext

(node, name)

; context.

setorigin

(origin)

; contextholder.

set(context);}

return context;

}

context是負責在一條鏈路中傳遞資訊的,因此自然是在slot中進行傳遞並使用,以entrywithpriority方法為例

com.alibaba.csp.sentinel.ctsph#entrywithpriority()

private entry entrywithpriority

int count,

boolean prioritized, object.

.. args)

throws blockexception indicates that the amount of context has exceeded the threshold,

// so here init the entry only. no rule checking will be done.

return

newctentry;}

if(context == null)

// global switch is close, no rule checking will do.if(

!constants.on)

processorslot

chain =

lookprocesschain;/*

* means amount of resources (slot chain) exceeds ,

* so no rule checking will be done.

*/if(chain == null)

entry e =

newctentry

;try

catch

(blockexception e1)

catch

(throwable e1)

return e;

}

從執行緒本地變數獲取到的context被傳入slotchain中並在各個slot中被使用,這裡還是以flowslot為例

com.alibaba.csp.sentinel.slots.block.flow.flowrulechecker#selectnodebyrequesterandstrategy

static node selectnodebyrequesterandstrategy

(/*@nonnull*/ flowrule rule, context context, defaultnode node)

return

selectreferencenode

(rule, context, node);}

else

ifequals

)return

selectreferencenode

(rule, context, node);}

else

ifequals

&& flowrulemanager.

isotherorigin

(origin, rule.

getresource()

))return

selectreferencenode

(rule, context, node);}

return null;

}

根據鏈路狀態會從context中取一些資料

Cartographer原始碼篇 原始碼分析 1

在安裝編譯cartographer 1.0.0的時候,我們可以看到 主要包括cartorgarpher ros cartographer ceres sover三個部分。其中,ceres solver用於非線性優化,求解最小二乘問題 cartographer ros為ros平台的封裝,獲取感測器資料...

URLRewriter元件及原始碼

微軟推出的一款重寫url的乙個元件,以及元件源 用法如下 原理 當iis接收到請求之後,判斷請求頁面的字尾名,然後通過iis配置中的對映中設定的,哪種字尾的檔案是由哪個處理程式處理的規則交由相應的程式來處理該請求完成操作。所以我們要在iis裡設定對映 讓 html 的檔案交由 net 的處理程式 即...

Flex 分頁 元件 原始碼

flex 分頁 元件 原始碼 最近因為專案需求,需要寫個flex 分頁 元件 下面貼出 pagingbar.mxml 在其他元件中引用 其中common 是我自定義的標籤 裡面引入了這個分頁元件的所在位置例如 xmlns common com.iman.common.寫完之後說說怎麼用。裡面每次改變...