Ali-Sentinel-上下文

归档

类结构

  • com.alibaba.csp.sentinel.context.Context
public class Context {

    private final String name;          // 名称
    private DefaultNode entranceNode;   // 当前调用树的入口节点
    private Entry curEntry;             // 当前处理入口(条目)
    private String origin = "";         // 此上下文的来源(通常指示不同的调用者,例如服务使用者名称或来源IP)
    private final boolean async;

}

创建

    // CtSph 的内部类
    private final static class InternalContextUtil extends ContextUtil {
        // sign_m_010 创建上下文
        static Context internalEnter(String name) {
            return trueEnter(name, ""); // sign_m_020
        }

        static Context internalEnter(String name, String origin) {
            return trueEnter(name, origin);
        }
    }
  • com.alibaba.csp.sentinel.context.ContextUtil
/** 上下文工具类 */
public class ContextUtil {
    private static ThreadLocal<Context> contextHolder = new ThreadLocal<>();
    private static volatile Map<String, DefaultNode> contextNameNodeMap = new HashMap<>();
    private static final Context NULL_CONTEXT = new NullContext();

    // sign_m_020 创建上下文
    // 参数 name => "sentinel_default_context"
    protected static Context trueEnter(String name, String origin) {
        Context context = contextHolder.get();
        if (context == null) {
            Map<String, DefaultNode> localCacheNameMap = contextNameNodeMap;
            DefaultNode node = localCacheNameMap.get(name);
            if (node == null) {
                if (localCacheNameMap.size() > Constants.MAX_CONTEXT_NAME_SIZE) { // 最大 2000
                    setNullContext();
                    return NULL_CONTEXT;    // 超过限制返回空上下文
                } else {
                    LOCK.lock();            // 加锁 (双重检测锁)
                    try {
                        node = contextNameNodeMap.get(name);
                        if (node == null) {
                            if (contextNameNodeMap.size() > Constants.MAX_CONTEXT_NAME_SIZE) {
                                setNullContext();
                                return NULL_CONTEXT;    // 加锁再检测一次
                            } else {
                                node = new EntranceNode(new StringResourceWrapper(name, EntryType.IN), null);   // 创建入口节点
                                Constants.ROOT.addChild(node);  // 添加到根节点(的子节点集中)

                                Map<String, DefaultNode> newMap = new HashMap<>(contextNameNodeMap.size() + 1);
                                newMap.putAll(contextNameNodeMap);
                                newMap.put(name, node); 
                                contextNameNodeMap = newMap;    // COW 更换
                            }
                        }
                    } finally {
                        LOCK.unlock();
                    }
                }
            }
            context = new Context(node, name);  // 创建上下文
            context.setOrigin(origin);
            contextHolder.set(context);         // 设置到线程变量
        }

        return context;
    }
}

相关推荐

  1. Ali-Sentinel-上下文

    2024-04-27 13:48:01       33 阅读
  2. Ali-Sentinel-入口控制

    2024-04-27 13:48:01       30 阅读
  3. Ali-Sentinel-链路控制

    2024-04-27 13:48:01       26 阅读
  4. Ali-Sentinel-节点与度量

    2024-04-27 13:48:01       32 阅读
  5. Ali-Sentinel-Spring WebMVC 流控

    2024-04-27 13:48:01       26 阅读
  6. <span style='color:red;'>Sentinel</span>

    Sentinel

    2024-04-27 13:48:01      59 阅读
  7. <span style='color:red;'>Sentinel</span>

    Sentinel

    2024-04-27 13:48:01      45 阅读
  8. <span style='color:red;'>Sentinel</span>

    Sentinel

    2024-04-27 13:48:01      41 阅读
  9. <span style='color:red;'>Sentinel</span>

    Sentinel

    2024-04-27 13:48:01      38 阅读
  10. <span style='color:red;'>Sentinel</span>

    Sentinel

    2024-04-27 13:48:01      26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-27 13:48:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-27 13:48:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-27 13:48:01       87 阅读
  4. Python语言-面向对象

    2024-04-27 13:48:01       96 阅读

热门阅读

  1. 代码随想录学习Day 31

    2024-04-27 13:48:01       38 阅读
  2. git撤销更改的门道

    2024-04-27 13:48:01       27 阅读
  3. 网络运维类面试非技术问题

    2024-04-27 13:48:01       23 阅读
  4. 强化学习和深度学习的差异对比

    2024-04-27 13:48:01       35 阅读
  5. 异地多活是什么

    2024-04-27 13:48:01       32 阅读
  6. HttpClient

    2024-04-27 13:48:01       132 阅读
  7. MySQL创建表3

    2024-04-27 13:48:01       32 阅读