DefaultNode,ClusterNode,OriginNode的区别

By ref-nobody 创建时间 2025年5月9日 | 本文最后更新于 2025年5月13日 #Node, #sentinel, #SlotChain

在 Sentinel 中,OriginNodeDefaultNodeClusterNode 是三种核心的统计节点,它们在 统计维度作用范围数据结构 上有显著区别。以下是它们的详细对比:


DefaultNode(默认节点)

  • 统计维度Context(调用链路) + Resource(资源)
    • 同一资源在不同调用链路(Context)中会创建不同的 DefaultNode,用于记录该资源在特定链路中的流量数据。
  • 作用
    • 实现 基于链路的限流(如只限制从某入口调用的资源流量)。
    • 维护树状结构,子节点表示资源调用的嵌套关系(如 A 调用 B 时,B 的 DefaultNode 是 A 的子节点)。
  • 创建时机
    • NodeSelectorSlot 中创建,与 Context 绑定。

示例

ContextUtil.enter("entrance1", "appA");
Entry entry = SphU.entry("resourceA"); // 创建 resourceA 的 DefaultNode

ClusterNode(簇点节点)

  • 统计维度Resource(资源)
    • 同一资源在所有链路中共享一个 ClusterNode,记录该资源的 全局流量总和(不区分调用链路)。
  • 作用
    • 实现 默认模式关联模式 的限流(如限制资源的总 QPS,或关联另一资源的流量)。
    • 存储按来源(origin)区分的子节点 StatisticNode(即 OriginNode 的统计基础)。
  • 创建时机
    • ClusterBuilderSlot 中创建,与资源名绑定。

示例

// 无论从哪个 Context 调用 resourceA,均累加到同一 ClusterNode
SphU.entry("resourceA");

OriginNode(来源节点)

  • 统计维度Resource(资源) + Origin(调用来源)
    • 记录特定来源(如服务名 appA)对某资源的访问数据,本质是 ClusterNode 的子节点(StatisticNode 类型)。
  • 作用
    • 支持 黑白名单控制AuthoritySlot 根据 origin 过滤请求)。
    • 实现 按来源限流(如限制来自 appA 的请求量)。
  • 创建时机
    • ClusterBuilderSlot 中,根据 Contextorigin 字段动态创建。

示例

ContextUtil.enter("entrance1", "appA"); // 设置 origin="appA"
Entry entry = SphU.entry("resourceA");  // 创建 appA 对 resourceA 的 OriginNode

三者的关系与区别

节点类型统计维度作用范围数据结构典型应用场景
DefaultNodeContext + Resource单条调用链路树状结构(子节点为资源嵌套)基于链路的限流(如入口限流)
ClusterNodeResource全局资源平铺结构(无嵌套)全局 QPS 限制、关联流控
OriginNodeResource + Origin特定调用来源作为 ClusterNode 的子节点黑白名单、按来源限流

核心关联

数据聚合

    • DefaultNode 的统计会同步到其关联的 ClusterNode(如 passQps 累加)。
    • OriginNode 的数据存储在 ClusterNode.originCountMap 中。

    规则匹配

      • 链路规则:基于 DefaultNode 判断。
      • 全局规则:基于 ClusterNode 判断。
      • 来源规则:基于 OriginNode 判断。

      示例场景

      假设资源 resourceA 被两个入口(entrance1entrance2)调用,且来源分别为 appAappB
      DefaultNode
      entrance1/resourceAentrance2/resourceA 是两个独立的节点。
      ClusterNode
      只有一个 resourceA 节点,统计所有入口的流量总和。
      OriginNode
      resourceA 下有两个子节点:appAappB 的统计。


        使用RequestOriginParser解析请求来源

        适用条件
        你希望通过 HTTP 请求的 Header/Cookie/参数 自动解析 origin(如从 X-Origin 头提取)。
        你使用 Sentinel 的 Web 适配器(如 sentinel-spring-webmvc 或 sentinel-spring-cloud-gateway)。

        实现示例

        @Component
        public class CustomOriginParser implements RequestOriginParser {
            @Override
            public String parseOrigin(HttpServletRequest request) {
                // 从 Header 获取来源标识(如 "X-Origin")
                String origin = request.getHeader("X-Origin");
                return origin != null ? origin : "default"; // 默认值
            }
        }

        效果
        所有进入的请求会自动调用此接口解析 origin,后续规则(如 FlowRule.setLimitApp("originA"))会基于该值生效。

        总结

        • DefaultNode:链路维度统计,用于精细化限流。
        • ClusterNode:全局资源统计,用于总量控制。
        • OriginNode:来源维度统计,用于权限与来源限流。

        通过组合这三种节点,Sentinel 实现了多层次的流量控制与监控能力。

        Leave a Reply

        Your email address will not be published. Required fields are marked *

        目录