这里有个很有趣的问题,就是我们在责任链的NodeSelectorSlot中获取资源对应的Node时,为什么用的是Context的name,而不是SentinelResource的name呢? 首先,我们知道一个资源对应一条责任链。但是进入一个资源调用的Context却可能是不同的。如果使用资源名来作为key,获取对应的Node,那么通过不同context进来的调用方法获取到...
5.2 ClusterBuilderSlot -- 聚合相同资源不同Context的Node 此节点负责聚合相同资源不同Context对应的Node,以供后续限流判断使用。 可以看到,ClusterNode的获取是以资源名为key。ClusterNode将会成为当前node的一个属性,主要目的是为了聚合同一个资源不同Context情况下的多个node。默认的限流条件判断就是依据ClusterNode中的...
2.构建Context# 分析这个类型中的InternalContextUtil.internalEnter(Constants.CONTEXT_DEFAULT_NAME); /*** This class is used for skip context name checking.此类型是用于跳过Context名称的检测*/privatefinalstaticclassInternalContextUtilextendsContextUtil{staticContextinternalEnter(String name){// 从这里继续跟踪...
context是保存在ThreadLocal中的,每次执行的时候会优先到ThreadLocal中获取,为null时会调用MyContextUtil.myEnter(Constants.CONTEXT_DEFAULT_NAME, "", resourceWrapper.getType())创建一个context。当Entry执行exit方法时,如果entry的parent节点为null,表示是当前Context中最外层的Entry了,此时将ThreadLocal中的context清空...
所以ContextUtil.enter(..)可以同时指定资源的入口和调用者,一个资源一定有入口,因为不指定入口默认就是sentinel_default_context,但是调用者不指定就会没有。 对于一个http请求来说,Sentinel默认服务名需要放到S-user这个请求头中,所以如果你想知道接口的调用服务,需要在调用方发送请求的时候将服务名设置到S-user请求...
ContextUtil#enter方法与ContextUtil#exit方法并不是必须调用的,当不需要为资源区分不同调用链入口的配置限流规则时可以被省略,但Context实例是调用链上方法执行所依赖的环境,因此,在默认的情况下,Sentinel会自动创建一个调用链入口名称为sentinel_default_context的Context实例,同时会创建一个调用链入口名称为sentinel_defau...
{// 且配置的流控策略是 直接关联策略if(strategy==RuleConstant.STRATEGY_DIRECT){returncontext.getOriginNode();}// 配置的策略为关联或则链路returnselectReferenceNode(rule,context,node);}returnnull;}static NodeselectReferenceNode(FlowRule rule,Context context,DefaultNode node){// 关联资源名称 (如果策略...
4.新建NacosPropertiesConfiguration文件 在 com.alibaba.csp.sentinel.dashboard.rule 下创建 Nacos 配置文件的读取类,实现代码如下:package com.alibaba.csp.sentinel.dashboard.rule;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Configuration;@...
DefaultNode:链路节点,用于统计调用链路上某个资源的数据,维持树状结构。 ClusterNode:簇节点,用于统计每个资源全局的数据(不区分调用链路),以及存放该资源的按来源区分的调用数据。 EntranceNode:入口节点,特殊的链路节点,对应某个 Context 入口的所有调用数据。
Context的初始化: protectedstaticContexttrueEnter(Stringname,Stringorigin){//从ThreadLocal中获取Context 若当前线程Context存在,则不用重新创建Contextcontext=contextHolder.get();if(context==null){Map<String,DefaultNode>localCacheNameMap=contextNameNodeMap;DefaultNodenode=localCacheNameMap.get(name);if(node...