读源代码(版本: 1.8.2
)时, com.alibaba.csp.sentinel.context.ContextUtil
提供有 initDefaultContext()
方法,并在 static
块中初始化了一个 sentinel_default_context
,位置如图:
在测试过程中,有三个不同的场景,如图:
说明:
场景 ① 是 main
方法直接跑的,生成了默认的 sentinel_default_context
场景 ② 是 web
应用,使用了 com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebInterceptor
, 生成了默认的 sentinel_default_context
和 sentinel_spring_web_context
场景 ③ 是 thrift
应用,使用了自定义的 CustomSentinelResourceAspect
(继承自 com.alibaba.csp.sentinel.annotation.aspectj.AbstractSentinelAspectSupport
,并使用了自定义的 feature_thrift_context
),生成了默认的 sentinel_default_context
及自定义的 feature_thrift_context
问题:
1、我理解,默认的 sentinel_default_context
是用来兜底的,是否还有其它作用?
2、如果用户指定了自己的 context
,这个默认的 sentinel_default_context
是不是不应该创建?
3、如果第 2、
个问题是合理的,代码是不是有bug,不应该直接在 static
块中始化默认的 sentinel_default_context
,而在流程走到 com.alibaba.csp.sentinel.context.ContextUtil#enter(java.lang.String name, java.lang.String origin)
中再确定是否需要创建?
2条答案
按热度按时间jrcvhitl1#
大多数情况下,在自定义埋点的时候并不会显式调用
ContextUtil#enter
,而是直接使用SphU#entry
这种形式直接接入。虽然也可以在SphU#entry这个方法中进行懒创建默认的sentinel_default_context
。但是创建的过程是线程安全的会带来一定的性能损耗。与其这样不如先创建好,毕竟大多数情况下还是不会显式调用ContextUtil#enter
。总结:我认为可以说是为了性能考虑,没有必要懒创建。
mi7gmzs62#
大多数情况下,在自定义埋点的时候并不会显式调用
ContextUtil#enter
,而是直接使用SphU#entry
这种形式直接接入。虽然也可以在SphU#entry这个方法中进行懒创建默认的sentinel_default_context
。但是创建的过程是线程安全的会带来一定的性能损耗。与其这样不如先创建好,毕竟大多数情况下还是不会显式调用ContextUtil#enter
。 总结:我认为可以说是为了性能考虑,没有必要懒创建。你看的是哪个版本,我说的是
1.8.2
,比如这个类的方法:com.alibaba.csp.sentinel.adapter.spring.webmvc.AbstractSentinelInterceptor#preHandle
,就是显式调用:如图:并且,它的逻辑是,默认的
sentinel_default_context
必须存在,用户新创建的还不能覆盖它。