源码解析
ContextUtil
static 代码块
这里会添加一个默认的 EntranceNode 实例。
enter
该行代码可不写,通常情况下,都不会显示设置 context。
ContextUtil.enter("user-center", "app-A");
如果不显式调用该方法,就会进入到默认 context。
然后上面的这个方法会走进 ContextUtil#trueEnter
,添加名为 “user-center” 的 EntranceNode 节点:
若不显式调用 ContextUtil#enter,那 root 就只有一个默认节点 sentinel_default_context。
context,线程执行的上下文,在 Sentinel 中对于一个新的 context name,Sentinel 会往树中添加一个 EntranceNode 实例。所以它的作用是为了区分调用链路,标识调用入口。在 sentinel-dashboard 中,我们可以很直观地看出调用链路:
SphU
entry
CtSph#entryWithPriority
lookProcessChain(resourceWrapper)
链中每一个节点是一个 Slot 实例,这个链通过 BlockException 异常来告知调用入口最终的执行情况。
Sentinel 提供了 SPI 端点,让我们可以自己定制 Builder,如添加一个 Slot 进去。
由于 SlotChainBuilder 接口设计,我们只能全局所有的 resource 使用相同的责任链配置。
按照默认的 DefaultSlotChainBuilder 生成的责任链继续源码。
对相同的 resource,使用同一责任链实例,不同 resource,使用不同责任链实例。
resource 实例根据 resource name 来判断,和线程没有关系。
参考
https://juejin.cn/post/6906302891875647495
https://github.com/alibaba/Sentinel/wiki/Sentinel-%E6%A0%B8%E5%BF%83%E7%B1%BB%E8%A7%A3%E6%9E%90
https://www.javadoop.com/post/sentinel