在 Sentinel 中,OriginNode
、DefaultNode
和 ClusterNode
是三种核心的统计节点,它们在 统计维度、作用范围 和 数据结构 上有显著区别。以下是它们的详细对比:
DefaultNode(默认节点)
- 统计维度:
Context(调用链路) + Resource(资源)
- 同一资源在不同调用链路(Context)中会创建不同的
DefaultNode
,用于记录该资源在特定链路中的流量数据。
- 同一资源在不同调用链路(Context)中会创建不同的
- 作用:
- 实现 基于链路的限流(如只限制从某入口调用的资源流量)。
- 维护树状结构,子节点表示资源调用的嵌套关系(如 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
中,根据Context
的origin
字段动态创建。
- 在
示例:
ContextUtil.enter("entrance1", "appA"); // 设置 origin="appA"
Entry entry = SphU.entry("resourceA"); // 创建 appA 对 resourceA 的 OriginNode
三者的关系与区别
节点类型 | 统计维度 | 作用范围 | 数据结构 | 典型应用场景 |
---|---|---|---|---|
DefaultNode | Context + Resource | 单条调用链路 | 树状结构(子节点为资源嵌套) | 基于链路的限流(如入口限流) |
ClusterNode | Resource | 全局资源 | 平铺结构(无嵌套) | 全局 QPS 限制、关联流控 |
OriginNode | Resource + Origin | 特定调用来源 | 作为 ClusterNode 的子节点 | 黑白名单、按来源限流 |
核心关联
数据聚合
DefaultNode
的统计会同步到其关联的ClusterNode
(如passQps
累加)。OriginNode
的数据存储在ClusterNode.originCountMap
中。
规则匹配
- 链路规则:基于
DefaultNode
判断。 - 全局规则:基于
ClusterNode
判断。 - 来源规则:基于
OriginNode
判断。
示例场景
假设资源 resourceA
被两个入口(entrance1
和 entrance2
)调用,且来源分别为 appA
和 appB
:DefaultNode
:entrance1/resourceA
和 entrance2/resourceA
是两个独立的节点。ClusterNode
:
只有一个 resourceA
节点,统计所有入口的流量总和。OriginNode
:resourceA
下有两个子节点:appA
和 appB
的统计。
使用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 实现了多层次的流量控制与监控能力。