Sentinel限流核心逻辑解析 - 详解

news/2026/1/17 15:17:59/文章来源:https://www.cnblogs.com/gccbuaa/p/19496144
static Node selectNodeByRequesterAndStrategy(/*@NonNull*/ FlowRule rule, Context context, DefaultNode node) {
// The limit app should not be empty.
String limitApp = rule.getLimitApp();
int strategy = rule.getStrategy();
String origin = context.getOrigin();
if (limitApp.equals(origin) && filterOrigin(origin)) {
if (strategy == RuleConstant.STRATEGY_DIRECT) {
// Matches limit origin, return origin statistic node.
return context.getOriginNode();
}
return selectReferenceNode(rule, context, node);
} else if (RuleConstant.LIMIT_APP_DEFAULT.equals(limitApp)) {
if (strategy == RuleConstant.STRATEGY_DIRECT) {
// Return the cluster node.
return node.getClusterNode();
}
return selectReferenceNode(rule, context, node);
} else if (RuleConstant.LIMIT_APP_OTHER.equals(limitApp)
&& FlowRuleManager.isOtherOrigin(origin, rule.getResource())) {
if (strategy == RuleConstant.STRATEGY_DIRECT) {
return context.getOriginNode();
}
return selectReferenceNode(rule, context, node);
}
return null;
}

这段 selectNodeByRequesterAndStrategy 方法是 Sentinel 流控规则中决定“对哪个统计节点进行限流判断” 的核心逻辑。它结合了 限流目标(limitApp)限流策略(strategy)当前请求上下文(Context),动态选择一个 Node 对象用于后续的流量控制判断。


一、方法作用

返回一个 Node 对象,代表“要被限流检查的统计对象”。

  • 如果返回 null → 表示 不触发限流(直接放行)。
  • 如果返回非 null → 后续用该 Node 的 QPS/线程数等指标与阈值比较。

二、关键变量说明

变量含义
limitApp = rule.getLimitApp()限流规则的目标调用方:
• 具体应用名(如 "appA"
default:所有来源统一限流
other:除白名单外的所有来源
origin = context.getOrigin()当前请求的实际调用方(由上游传递,如通过 header 设置)
strategy = rule.getStrategy()限流策略:
STRATEGY_DIRECT (0):直接限流
STRATEGY_RELATE (1):关联资源限流
STRATEGY_CHAIN (2):链路限流
node当前资源的 DefaultNode(记录该资源的总体指标)
context.getOriginNode()记录 该 origin 对当前资源的访问指标(如 appA 调用 /order 的 QPS)
node.getClusterNode()当前资源的全局 ClusterNode(所有 origin 汇总)

三、逻辑分支详解 + 场景举例

✅ 分支 1:limitApp == origin 且 origin 有效(非 default/other)

if (limitApp.equals(origin) && filterOrigin(origin)) {
if (strategy == STRATEGY_DIRECT) {
return context.getOriginNode(); //  针对特定 origin 的统计
}
return selectReferenceNode(rule, context, node); // 关联/链路模式
}
✅ 场景 1.1:精准限流某个调用方(DIRECT)
  • 规则:resource="pay", limitApp="mobile", strategy=DIRECT
  • 请求:origin="mobile"
  • 结果:返回 context.getOriginNode() → 检查 mobile 调用 pay 的 QPS
  • 效果:只限制 mobile 应用,web 应用不受影响。
✅ 场景 1.2:关联限流(RELATE)

注意:此时限流依据是 refResource(order)的全局流量,不是 pay 本身的流量。


✅ 分支 2:limitApp == "default"

else if (RuleConstant.LIMIT_APP_DEFAULT.equals(limitApp)) {
if (strategy == STRATEGY_DIRECT) {
return node.getClusterNode(); //  全局统计
}
return selectReferenceNode(rule, context, node);
}
✅ 场景 2.1:对所有调用方统一限流(DIRECT)
  • 规则:resource="pay", limitApp="default", strategy=DIRECT
  • 请求:origin="web""mobile"""
  • 结果:返回 node.getClusterNode() → 检查 pay 接口的总 QPS
  • 效果:无论谁调用,只要 pay 总 QPS > 阈值,就限流。
✅ 场景 2.2:default + RELATE

✅ 分支 3:limitApp == "other" 且 origin 属于 “other”

else if (RuleConstant.LIMIT_APP_OTHER.equals(limitApp)
&& FlowRuleManager.isOtherOrigin(origin, rule.getResource())) {
if (strategy == STRATEGY_DIRECT) {
return context.getOriginNode();
}
return selectReferenceNode(rule, context, node);
}

isOtherOrigin(origin, resource) 通常指:

  • origin 不在该 resource 的白名单中(即“非信任来源”)
✅ 场景 3.1:限制“非白名单”调用方
  • 假设系统配置:resource="admin-api" 的白名单为 ["internal"]
  • 规则:limitApp="other", strategy=DIRECT
  • 请求 A:origin="internal" → ❌ 不进入此分支 → 返回 null → 不限流
  • 请求 B:origin="hacker" → ✅ 进入此分支 → 返回 originNode("hacker")
  • 效果:只限制非白名单调用者,内部系统畅通。

❌ 默认情况:返回 null

如果以上都不匹配(例如 limitApp="appA"origin="appB"),则:

return null;

不触发限流,请求直接通过。

✅ 场景 4:规则不匹配当前请求
  • 规则:limitApp="mobile"
  • 请求:origin="web"
  • 结果:跳过该规则 → 继续检查下一条规则(或最终放行)

这是 Sentinel 规则“按需生效”的体现:规则只对目标 origin 生效。


四、辅助方法 selectReferenceNode 补充说明

static Node selectReferenceNode(FlowRule rule, Context context, DefaultNode node) {
String refResource = rule.getRefResource();
int strategy = rule.getStrategy();
if (StringUtil.isEmpty(refResource)) return null;
if (strategy == STRATEGY_RELATE) {
return ClusterBuilderSlot.getClusterNode(refResource); // 全局关联资源节点
}
if (strategy == STRATEGY_CHAIN) {
if (!refResource.equals(context.getName())) return null; // 必须是入口资源
return node; // 当前节点(但仅在指定链路上)
}
return null;
}

场景补充:

  • STRATEGY_CHAIN:只有当当前调用链的 入口资源(context.getName())等于 refResource 时才限流。
    • 例:refResource = "gateway-entry",只有从网关入口进来的链路才受限制,内部服务间调用不受限。

✅ 五、总结:决策流程图

开始
limitApp == origin?
strategy == DIRECT?
返回 originNode
调用 selectReferenceNode
limitApp == 'default'?
strategy == DIRECT?
返回 clusterNode
limitApp == 'other' 且 origin 属于 other?
strategy == DIRECT?
返回 originNode
返回 null → 不限流

六、最佳实践建议

  1. DIRECT + specific origin:用于多租户隔离、防刷。
  2. DEFAULT + DIRECT:用于保护核心接口整体容量。
  3. RELATE:用于保护下游依赖(如 DB、第三方 API)。
  4. CHAIN:用于防止入口流量打垮内部服务。
  5. OTHER:用于安全防护(黑名单式限流)。

理解 selectNodeByRequesterAndStrategy 是掌握 Sentinel 精细化流控的关键!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1173897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Simulink的混合交直流微电网架构仿真

目录 手把手教你学Simulink--基础微电网场景实例:基于Simulink的混合交直流微电网架构仿真 一、引言:为什么需要混合交直流微电网?——“兼容并蓄”破解多源异构接入难题 挑战: 二、核心原理:混合交直流微电网的“架…

学Simulink--基础微电网场景实例:基于Simulink的微电网储能SOC均衡控制仿真

目录 手把手教你学Simulink--基础微电网场景实例:基于Simulink的微电网储能SOC均衡控制仿真 一、引言:为什么需要储能SOC均衡控制?——“木桶效应”下的寿命与效率保卫战 挑战: 二、核心原理:储能SOC均衡的“检测-分…

真 AI 才实用!2026 语音机器人横向测评,5 大主流品牌不踩坑 - 速递信息

当前企业采购语音机器人的核心痛点,在于市场同质化内卷严重。许多产品仍停留在传统 IVR 的简单应答层面,缺乏真正的 AI 交互能力,难以满足企业降本增效、提升服务质量的核心需求。 为了打破这种“虚假智能”的内卷,…

2026矿用U型钢支护架厂家权威推荐榜单:29U矿用U型钢/矿用U型钢支架/25UY矿用U型钢/36U矿用U型钢/40U矿用U型钢源头厂家精选。 - 品牌推荐官

在矿山巷道支护领域,矿用U型钢及其衍生产品是保障井下作业安全的核心材料。根据行业数据显示,2025年国内矿用支护设备市场规模已突破120亿元,其中U型钢系列产品占比超过45%,成为矿山企业采购的重点品类。在众多供应…

Java多线程编程:从基础到实战的完整指南

引言:为什么需要多线程?在当今多核处理器普及的时代,充分利用计算资源已成为提升程序性能的关键。Java多线程允许程序同时执行多个任务,显著提高应用程序的响应速度和处理能力。无论是Web服务器处理并发请求,还是大数据…

吐血推荐!专科生必用AI论文网站TOP9:开题报告全攻略

吐血推荐!专科生必用AI论文网站TOP9:开题报告全攻略 2026年专科生AI论文写作工具测评:精准选型指南 随着人工智能技术的不断进步,AI论文写作工具逐渐成为高校学生,尤其是专科生撰写论文的重要辅助。然而,面…

RTX 5090 是 AI 开发者的合适选择吗?

传送锚点1. RTX 5090 实际上在多大程度上提升了 AI 工作负载?1.1 32GB 显存是突破吗?2. 开发者必须升级哪些设备才能安全运行 5090?2.1 功率输送需求2.2 冷却与底盘集成2.3 存储需求3. 框架准备好应对 5090 了吗?3.1 Linux&#x…

AI视频生成提速200倍:TurboDiffusion如何让一小时的等待缩短至几十秒?

传送锚点1.0 引言:当AI视频创作不再需要漫长等待2.0 核心看点:四项关键洞察2.1 看点一:令人惊叹的200倍速度飞跃2.2 看点二:速度的秘诀——“组合拳”式的技术优化2.3 看点三:速度与画质兼得,打破“非此即彼…

世界模型正在掀起AI新浪潮

传送锚点全新架构重构计算范式自动化系统的训练场谁将复制出下一个Flash获取方式全新架构重构计算范式 谷歌最新发布的Gemini 3 Flash,从命名方式来看似乎是双子座3家族中一个“轻量”版本。但真正的不同之处不止是体积或速度,而是一种计算范式的转变。…

AI驱动下的武汉GEO优化服务商全景:干货解析与优质选择 - 品牌评测官

随着生成式AI搜索的普及,GEO(生成式引擎优化)已替代传统SEO成为企业数字营销的核心赛道。武汉作为中部数字经济枢纽,凭借跨境电商爆发与政策红利,形成了极具特色的GEO服务生态。本文将先拆解GEO优化的核心逻辑与行…

2026环氧树脂绝缘板厂家权威推荐榜单:环氧树脂绝缘管/螺栓绝缘套管/螺栓绝缘帽/环氧树脂绝缘螺栓/树脂绝缘板源头厂家精选。 - 品牌推荐官

在电机、电器设备及变压器等工业领域,绝缘材料是保障设备稳定运行的核心组件。随着行业对绝缘性能要求的持续提升,具备高耐温、阻燃、防静电等特性的环氧树脂绝缘材料逐渐成为主流选择。本文聚焦环氧树脂绝缘材料领域…

2026年评价高的昆明民航路仓库出租,昆明官渡区仓库出租,昆明仓库出租公司选购决策指南 - 品牌鉴赏师

引言在当今物流与商业蓬勃发展的时代,昆明的仓库出租市场愈发繁荣,为众多企业提供了重要的仓储支持。尤其是昆明民航路仓库出租、昆明官渡区仓库出租等细分领域,满足了不同企业多样化的仓储需求。为了帮助企业在众多…

2026年国内知名的全自动超声波清洗机厂家推荐榜,工件超声波清洗机/工业超声波清洗设备,全自动超声波清洗机工厂电话 - 品牌推荐师

行业背景:清洗技术升级驱动制造业效率革命 随着工业4.0与“双碳”目标的推进,制造业对精密清洗的需求持续攀升。全自动超声波清洗机凭借高效、环保、一致性的优势,成为汽车零部件、半导体、新能源等领域的核心设备。…

收集自己的每日早餐花费,统计每周平均早餐费用,输出最经济的早餐搭配建议。

完整输出一个可运行的 Python 项目示例,用于收集每日早餐花费、统计每周平均早餐费用、输出最经济的早餐搭配建议。1. 实际应用场景描述在快节奏的生活中,很多人习惯在外购买早餐,但往往对每天的花费缺乏记录,导致月底发现餐饮支出…

2026沃尔玛购物卡回收高效操作攻略! - 淘淘收小程序

你是否曾收到沃尔玛购物卡后满心欢喜,却因忙碌或消费习惯差异,让卡片在角落闲置许久?我就有过这样的经历,本计划用购物卡采购好物,却因工作繁忙将其遗忘,等想起时已闲置数月。 生活中这类情况十分常见,节日礼物…

口碑不错的AI搜索优化企业有哪些,哪家性价比高? - 工业品牌热点

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家标杆企业,为ToB企业选型提供客观依据,助力精准匹配适配的AI搜索优化服务伙伴。 TOP1 推荐:南方网通 推荐指数:★★★★★ | 口碑评分:国内专业的AI搜索优…

杭州拼多多代运营公司排名:2026年最新服务商参考榜 - 前沿公社

本文结合市场排行、行业口碑与服务能力评估,为杭州地区的拼多多代运营公司建立一个多维度评分参考体系,帮助商家在选择合作伙伴时能更快速判断适配度。 一、评分依据说明 本参考榜单并非拼多多官方排名,而是基于以下…

PW1515 DEMO板核

PW1515是一款专为保护精密后端电路而设计的高性能、可编程过压过流保护芯片。在当今复杂的电子系统中,电源路径时常面临电压浪涌、负载短路等潜在风险,PW1515充当着系统“安全卫士”的关键角色。它通过监测输入电压与…

Java版LeetCode热题100之翻转二叉树:从递归到迭代的全面解析

Java版LeetCode热题100之翻转二叉树:从递归到迭代的全面解析本文将深入剖析 LeetCode 第226题「翻转二叉树」,不仅提供递归与迭代两种主流解法,还涵盖算法原理、复杂度分析、面试技巧、工程应用及关联题目拓展。全文约9500字,结构…

互联网大厂Java小白求职:音视频场景下的技术面试指南

场景设定 在一家互联网大厂的音视频研发部门,超好吃是一位初入职场的Java程序员,正在接受严肃的面试官的技术面试。这次面试涉及到音视频场景的相关技术点。第一轮提问:基础技术点 面试官:超好吃,Java语言是你的核心技…