ContextUtil为什么要实例化一个“sentinel_default_context”

o0lyfsai  于 4个月前  发布在  其他
关注(0)|答案(2)|浏览(147)

读源代码(版本: 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_contextsentinel_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) 中再确定是否需要创建?

jrcvhitl

jrcvhitl1#

大多数情况下,在自定义埋点的时候并不会显式调用 ContextUtil#enter ,而是直接使用 SphU#entry 这种形式直接接入。虽然也可以在SphU#entry这个方法中进行懒创建默认的 sentinel_default_context 。但是创建的过程是线程安全的会带来一定的性能损耗。与其这样不如先创建好,毕竟大多数情况下还是不会显式调用 ContextUtil#enter
总结:我认为可以说是为了性能考虑,没有必要懒创建。

mi7gmzs6

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 必须存在,用户新创建的还不能覆盖它。

相关问题