本系列导读容错四大金刚连载总览超时
本篇・限流(上):Sentinel 流量防护:限流的意义、选型、底层原理、框架集成与 Dashboard 改造核心定位:超时解决「慢请求如何快速失败释放资源」;限流解决「流量异常,主动拒绝请求,守护服务资源水位」。
下篇预告:限流(下)Sentinel 中间件防护实战:数据库 MyBatis 与 Redis 接入深度取舍。

承接超时治理:超时是被动的事后止损;限流是主动事前防御,二者互补,缺一不可。
保护服务自身,防止被突发流量打垮 突发流量来源多种多样:大促峰值流量、爬虫访问、上游服务 Bug 带来的无限重试、MQ 消息堆积后的爆发消费等。 服务的线程池、连接池、CPU、内存都存在物理上限。如果缺少限流,海量请求涌入会把服务资源全部耗尽,正常业务请求也无法得到处理,发生雪崩现象,出现 “好人跟着坏人一起受难” 的局面。 限流会在请求进入核心业务逻辑之前完成拦截,牺牲一部分超额流量,保障核心业务的正常可用。
实现多调用方流量隔离,避免单点异常扩散 一个服务通常会被多个上游服务同时调用。如果某一个调用方出现异常疯狂刷流量,在没有来源隔离的前提下,会耗尽服务全部资源,连带影响其余所有业务调用方。 基于调用来源的限流能力,可以做到故障域隔离:单个调用方流量打高,仅对该调用方做流量管控,其余业务方不受任何影响。
保护下游依赖,避免压垮底层存储与第三方接口 限流不只作用于入口流量,出口调用同样可以使用。当本服务作为调用方时,可以通过出口限流,控制对数据库、RPC 服务、第三方 API 的调用 QPS。 规避业务批量循环、代码 Bug 循环调用等场景,防止把下游依赖直接打垮。
和熔断配合,阻断故障链式传递 限流主要应对流量过大的场景;熔断主要应对依赖响应异常、超时、报错的场景。 当流量突增与下游抖动叠加发生时,限流挡住超额涌入的流量,熔断切断故障的外部依赖,双重防护,阻止故障顺着调用链向上、向下链式传导。
保障服务水位可控,方便容量规划与发布稳定性 单机限流能够约束单实例最大负载,集群整体承载能力可以简单计算得出:集群 QPS ≈ 单机阈值 × 实例数量。 在新版本发布、实例冷启动的场景,限流可以配合流量权重放量策略,规避上线瞬间的流量尖刺风险。
澄清常见误区 ❌误区:限流就是拒绝用户请求,会带来业务损耗,能不开启就不开启。 ✅真相:不限流的代价是整个服务全量不可用;限流的代价只是丢弃部分超额流量。两害相权取其轻。 限流本身不是最终目的,保障核心业务高可用才是最终目的。
一句话总结:超时管 “慢了怎么退”,限流管 “多了怎么挡”;超时释放单个请求的资源,限流守护整个服务的资源水位。 |
|---|
早在 2018 年,Hystrix 就已经进入维护模式,不再迭代新特性,行业内开始寻找合适的替代方案,主要候选为 Resilience4j 与 Sentinel。
对比项 | Sentinel | Resilience4j | Hystrix |
|---|---|---|---|
出身 | 阿里开源,Spring‑Cloud‑Alibaba 生态 | 国外社区,受 Hystrix 启发 | Netflix 开源,已停止迭代 |
动态规则能力 | 原生支持配置中心动态变更规则,秒级生效 | 需业务自行开发对接配置中心实现动态规则 | 能力有限,主要依赖配置文件,运行时修改困难 |
官方控制台 | 完整控制台,支持簇点链路、监控、规则配置一体化 | 无官方控制台,监控面板需要自行搭建 | 提供简单 Dashboard,功能薄弱 |
中文社区文档 | 社区活跃,中文文档完善 | 中文资料较少 | 曾经流行,现已逐步衰退 |
能力集合 | 限流、熔断降级、热点参数限流、来源访问控制、系统自适应保护,能力完备 | 熔断、重试、舱壁、速率限制;缺少热点参数、系统自适应保护,限流能力偏弱 | 仅专注熔断、隔离,不具备限流能力 |
编程模型 | 支持同步、异步调用,提供工具类简化编码 | 函数式编程,大量使用装饰器模式 | 注解 + AOP 模式 |
生态适配 | 适配 Feign、gRPC、Web 等多种协议,可对接配置中心 | 适配 Spring‑Cloud‑Circuit‑Breaker 抽象 | Spring Cloud Netflix 组件,已逐步被移除 |
运维成本 | 中等,需要维护控制台与配置中心数据源 | 低,但动态规则、监控需要自行开发 | 高,停止维护,不建议新项目使用 |
选型决策分析
Hystrix:仅适合存量老系统继续维持,新项目直接排除,本身不支持限流,动态规则能力不足。
Resilience4j:代码设计轻量优雅,但缺少开箱即用控制台,高级流量防护能力缺失,动态规则需要业务自行开发,中文社区资源不足。适合规模小、不需要复杂流量治理的应用。
Sentinel:和 Spring Cloud Alibaba、Nacos 生态深度适配,能力完整,支持大促场景下控制台秒级调整防护阈值,问题排查友好,同时具备商业版本平滑升级的备选路径。适合 Java 微服务体系。
补充边界:Sentinel 属于进程内基底模式,防护逻辑与业务运行在同一个 Java 进程;如果业务存在大量非 Java 异构服务,则需要考虑 ServiceMesh Sidecar 方案。 |
|---|

Sentinel 整体由两部分配套工作:客户端 SDK + 控制台 Dashboard。
客户端 SDK:以 jar 包形式集成在业务服务进程内,是流量治理的实际执行者,负责滑动窗口统计、规则校验、请求拦截与放行。
控制台 Dashboard:独立的 Web 管理系统,是运维配置入口,负责规则管理、机器自动发现、监控指标可视化展示。
二者配合配置中心(Nacos),完成规则的动态下发与全生命周期流量治理。
3.1 核心模型:资源 Resource + 规则 Rule + 指标统计

图简述:资源盒内部,上层资源状态统计(总请求、异常、超时);下层绑定各类流控、熔断规则。 |
|---|
资源 Resource:被流量防护保护的代码片段,同一个 JVM 内资源名称必须唯一;分为注解式@SentinelResource、编程式SphU.entry()两种定义方式。
规则 Rule:绑定到资源之上的防护策略,不同规则对应限流、熔断、来源管控等不同能力。
指标统计:内存实时统计请求的 pass、block、success、exception、rt 等运行时数据,为规则判断提供依据。
3.2 EntryType 流量方向模型 IN / OUT

图简述:六边形业务逻辑,周边适配器;绿色 = IN 入口流量(Controller、MQ Consumer),蓝色 = OUT 出口流量(DAO、RPC Client)。 |
|---|
EntryType.IN(入口流量):HTTP 接口、gRPC 服务端、MQ 消费,代表流量进入当前服务。
作用:生成调用链路的根节点;支持 origin 调用来源统计;System 系统自适应保护规则仅对 IN 流量生效。
EntryType.OUT(出口流量):Feign/gRPC 客户端调用、数据库操作,代表当前服务调用外部依赖。
⚠️关键认知:流控、熔断规则仅匹配资源名字符串,并不会校验 EntryType。同一个资源名,无论作为 IN 还是 OUT 流量,会共享同一套统计指标与防护规则。 |
|---|
EntryType 虽然不参与规则判断,但它不是多余的标记,它的核心作用是构建完整的调用链路树。
当一个请求进入服务时,IN 类型的入口会创建一个根 Context 上下文;后续所有 OUT 类型的下游调用(RPC、数据库等),都会作为子节点挂载在这个 Context 之下。最终形成一条完整的调用链:
入口请求 /api/stock/query(IN,根节点)
└── 调用商品服务 GoodsRpc#query(OUT,子节点)
└── 查询库存 StockMapper_selectById(OUT,子节点)这条链路会同步上报到 Dashboard 簇点链路页面,运维可以直观看到:一次入口请求到底触发了哪些下游调用、哪一环耗时最长、哪一步出了异常,是线上故障定位的核心依据。
3.3 底层核心机制

图简述:完整底层原理大图,LeapArray 滑动时间窗口,ProcessorSlotChain 各个 Slot 执行顺序。 |
|---|
LeapArray 滑动窗口:内存实现时间分片统计,记录 pass/block/success/exception/rt 各项指标,统计数据仅保存在内存,不会持久化。
ProcessorSlotChain 职责链 SPI 扩展:请求会按固定顺序经过一串 Slot 处理器,依次完成链路构建、指标统计、来源校验、系统保护、热点参数校验、流量控制、熔断降级。可以通过 SPI 自定义扩展 Slot。
熔断器状态机:CLOSED(正常) → OPEN(熔断打开) → HALF‑OPEN(半开探活) → CLOSED(恢复正常)。框架可以监听状态转换事件,输出不同级别日志,作为告警的数据源。
重点:捕获业务异常后,必须调用Tracer.traceEntry(e, entry)上报异常,否则统计模块识别不到异常,熔断逻辑不会正常触发。 |
|---|
3.4 主要规则分类
FlowRule:流量控制,单机限流、集群限流;
DegradeRule:熔断降级,支持慢调用比例、异常比例、异常数三种策略;
AuthorityRule:调用来源黑白名单管控;
SystemRule:系统自适应保护,仅针对入口 IN 流量;
ParamFlowRule:热点参数限流,针对高频访问的参数做防护。
4.1 引入依赖生成自己的starter
基础依赖:业务服务 pom 中引入 spring-cloud-starter-alibaba-sentinel(Sentinel 核心 + Spring Cloud 生态适配)与 sentinel-datasource-nacos(Nacos 规则数据源扩展)两个依赖。
提供编程式工具方法,业务优先使用工具方法,减少注解侵入,自动处理 entry/exit、异常上报、降级逻辑。
提供来源隔离注解,可解析调用方标识写入上下文 origin。
gRPC 协议:客户端、服务端手写拦截器,手动调用异步 entry 接口注册 Sentinel 资源(提供基础框架,无需业务人员开发)。
Feign 协议:不复写拦截器,直接复用官方自动配置,动态代理层自动生成 OUT 类型资源。

图简述:Dashboard 编辑规则写入 Nacos;业务客户端监听 Nacos 拉取规则。 |
|---|

图简述:业务实例输出 metrics 日志;Dashboard 主动 Pull 拉取监控指标,指标不走 Nacos。 |
|---|
完整落地流程:在 Dashboard 控制台页面配置限流规则 → Dashboard 将规则写入 Nacos 配置中心 → 业务进程中的 Sentinel SDK 监听 Nacos 配置变更,主动拉取最新规则到本地内存实时生效。
5.1 官方原版 Dashboard 存在的痛点
规则存储在 Dashboard 内存,一旦 Dashboard 重启,所有配置全部丢失。
V1 版本采用 HTTP 推送模式:控制台保存规则之后,逐个 HTTP 调用每一个业务实例下发规则。实例数量多、网络抖动时,会出现部分实例规则推送失败,多实例之间规则不一致。
Nacos 相关读写代码仅放在测试示例包,不能直接投入生产环境使用。
5.2 改造后 V2 架构设计
将 Nacos 规则读写相关代码,从测试示例迁移到正式生产代码。
规则存储模式改为 Pull 模式:控制台编辑规则,直接写入 Nacos 配置;各个业务客户端监听 Nacos 配置变更,主动拉取规则到本地内存生效。
Nacos data‑id 命名规范:{app}-flow‑rules、{app}-degrade‑rules,使用统一分组。
新增 Repository 抽象层;引入分布式锁,解决多 Dashboard 实例同时编辑同一套规则发生覆盖的问题;使用全局 ID 生成器维护规则唯一 ID。
5.3 双通路设计:规则走 Nacos,监控指标走实例 Pull 拉取
心跳 Push:业务实例默认启动内置 HTTP 服务,开放端口;业务每 10 秒向 Dashboard 上报心跳,完成机器注册发现。
Metrics 监控 Pull:Dashboard 主动访问各个业务实例端口,拉取本地内存中的监控指标,监控数据不走 Nacos。
设计考量:规则属于低频变更配置,适合存配置中心;监控指标是高频临时数据,数据量大,不适合写入配置中心,设计思想和 Prometheus 保持一致。 |
|---|
6.1 分层限流防护思想
IN 入口流量做限流,保护自身服务不被外部流量打垮;OUT 出口流量可按需做限流,保护下游依赖不被本服务打垮。
6.2 K8s 环境单机限流生产实践
当前 K8s 部署环境下,所有实例配置规格保持一致,生产环境优先选用单机限流,简单、可靠、运维成本更低。集群限流仅在开放平台、对外 API 这类需要全局精确配额的场景才启用。
单机限流阈值实操计算方法
通过全链路压测,持续加压,观察实例 CPU 指标;以实例 CPU 达到 90%‑100% 区间时的 QPS,作为单实例极限 QPS。
集群整体极限 QPS = 单实例极限 QPS × 实例副本数
Sentinel 单机限流配置阈值 = 单实例极限 QPS ×(0.7 ~ 0.8),打 7‑8 折预留安全缓冲。
举例:压测出单个实例极限 QPS 为 1000,预留 75% 安全水位,则 Sentinel 单机阈值配置为 750。 |
|---|
6.4 限流落地自查清单
IN 入口流量完成限流配置;需要来源隔离的接口保证来源标识正常传递;
K8s 集群场景:单机限流阈值基于全链路压测结果,打 70‑80 折预留安全水位;
确认 Nacos 限流规则 dataId 命名规范,客户端成功加载对应 FlowRule;
评估内置 HTTP 端口是否需要保留;完成告警配置:blockQPS 突增告警、来源限流异常触发告警。
本篇梳理了限流的业务价值,对比市面上主流容错组件,明确了 Sentinel「客户端 SDK + Dashboard 控制台」配套工作的整体形态,讲解资源、流量方向、滑动窗口、职责链等底层原理,说明了框架集成依赖与 Dashboard Nacos Pull 模式改造的完整设计,同时给出 K8s 环境下单机限流阈值计算方法、业务落地规范与线上踩坑案例。
下篇预告:限流(下)Sentinel 中间件防护实战:MyBatis 数据库粒度限流完整方案,以及 Redis 接入可行性深度分析,回答「哪些中间件适合接入 Sentinel 限流,哪些只允许业务手动调用」。 |
|---|
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。