0%

Sentinel流控

Sentinel 流量控制(流控):规则详解与实战配置

流量控制(简称 “流控”)是 Sentinel 的核心功能之一,通过监控资源的实时流量,当达到预设阈值时触发控制策略,避免服务因流量过载而崩溃。Sentinel 的流控规则灵活多样,可根据资源、阈值类型、调用关系等维度精准控制流量。

流量控制的核心目标

在微服务场景中,流量控制主要解决以下问题:

  • 防止突发流量(如秒杀、促销)压垮服务;
  • 避免接口因高并发导致响应延迟或超时;
  • 保护核心业务(如支付接口)的资源占用,优先保障其可用性;
  • 实现流量的削峰填谷(如匀速处理请求),避免系统资源波动。

流量控制规则(FlowRule)核心属性

Sentinel 的流控规则通过FlowRule类定义,包含以下关键属性,每一项都决定了流控的生效方式:

属性名 说明 默认值 配置场景举例
resource 资源名(唯一标识),通常是接口路径(如/order/create)或自定义资源名。 - 限制/order/create接口的流量
count 限流阈值(核心参数),根据grade类型确定是 QPS 数还是线程数。 - QPS 阈值设为 100(每秒最多 100 次请求)
grade 阈值类型: - 0(QPS):每秒请求数 - 1(线程数):并发线程数 0(QPS) 秒杀接口用 QPS 限制,高耗时接口用线程数限制
limitApp 针对特定调用来源限流(如服务名),default表示不区分来源。 default 仅限制user-service调用的流量
strategy 流控模式: - 0(直接):针对资源本身限流 - 1(关联):关联资源触发限流 - 2(链路):指定链路入口限流 0(直接) 支付接口达到阈值时,限制下单接口(关联模式)
controlBehavior 流控效果: - 0(快速失败):直接拒绝并抛异常 - 1(Warm up):预热模式,逐渐提升阈值 - 2(排队等待):匀速处理请求 0(快速失败) 秒杀接口用 Warm up,避免瞬间冲击;消息接口用排队等待

流控规则详解(结合 Dashboard 配置)

Sentinel Dashboard 提供了可视化配置界面,各配置项与FlowRule属性一一对应,以下是详细说明:

1. 基础配置:资源名与阈值类型

  • 资源名:默认是接口的请求路径(如/hello),也可通过@SentinelResource自定义资源名(如"orderService")。

    示例:限制/order/create接口的流量,资源名填/order/create

  • 针对来源(limitApp)

    • 默认为default(不区分调用来源);
    • 若需限制特定服务调用(如仅cart-service调用),填写对应服务名(需注册到服务发现)。
  • 阈值类型(grade)

    • QPS(每秒请求数):适合接口处理速度快、短耗时的场景(如查询接口)。例如:QPS=50 表示每秒最多允许 50 次请求。
    • 线程数:适合接口处理耗时较长(如数据库操作)的场景,避免线程耗尽。例如:线程数 = 10 表示最多允许 10 个并发线程执行该接口。

2. 流控模式(strategy):控制 “哪些流量” 被限制

(1)直接模式(默认)

规则:当资源自身的流量达到阈值时,直接对该资源限流。
示例/order/pay接口 QPS 阈值设为 20,当每秒请求超过 20 次时,直接拒绝新请求。
适用场景:保护单个接口不被过度调用(如详情查询接口)。

(2)关联模式

规则:当 “关联资源” 的流量达到阈值时,限制当前资源的流量(“我为关联资源让路”)。
示例

  • 关联资源:/order/pay(支付接口);
  • 当前资源:/order/create(下单接口);
  • 配置:当/order/pay的 QPS 达到 30 时,限制/order/create的流量。
    适用场景:避免次要接口占用核心接口的资源(如下单接口为支付接口让路,防止支付超时)。
(3)链路模式

规则:仅限制从 “指定入口资源” 调用当前资源的流量(精确到调用链路)。
示例

  • 入口资源:/api/v1/order/create(外部调用入口);
  • 当前资源:orderService.create(内部服务方法);
  • 配置:仅当从/api/v1/order/create调用orderService.create时,才触发限流(内部调用不限制)。
    适用场景:区分不同调用链路的流量(如外部接口调用需限流,内部服务调用不限流)。

3. 流控效果(controlBehavior):控制 “如何限制” 流量

(1)快速失败(默认)

规则:流量超过阈值时,直接拒绝请求并抛出BlockException(提示Blocked by Sentinel (flow limiting))。
特点:响应快,适合不允许排队的场景(如实时查询)。
示例:QPS 阈值 = 10,第 11 次请求直接被拒绝。

(2)Warm up(预热模式)

规则:阈值从 “初始值”(count / coldFactorcoldFactor默认 3)逐渐提升至设定的count,预热时间由warmUpPeriodSec(默认 10 秒)控制。
特点:避免瞬间流量冲击,适合秒杀、活动等场景。
示例

  • QPS 阈值 = 30,coldFactor=3,预热时间 = 10 秒;
  • 前 10 秒:阈值从 10(30/3)逐渐提升到 30;
  • 10 秒后:阈值稳定在 30。
(3)排队等待(匀速模式)

规则:请求按匀速(1000ms / count)通过,超过阈值的请求排队等待,超时未处理则被拒绝(默认超时时间 500ms)。
特点:平滑流量,对应 “漏桶算法”,适合需要匀速处理的场景(如消息推送)。
注意:仅支持 QPS 阈值类型,不支持线程数。
示例:QPS=5,则每 200ms(1000/5)允许 1 个请求通过,超过的请求排队等待。

流控规则配置示例(Dashboard 操作)

以限制/order/create接口为例,配置步骤:

  1. 登录 Sentinel Dashboard,选择目标服务;
  2. 进入 “簇点链路”,找到/order/create接口,点击 “流控”;
  3. 配置规则:
    • 资源名:/order/create
    • 针对来源:default(不区分来源);
    • 阈值类型:QPS,阈值 = 20;
    • 流控模式:直接;
    • 流控效果:快速失败;
  4. 点击 “新增”,规则立即生效。

高级:自定义资源与流控

除了接口路径,还可通过@SentinelResource定义自定义资源,实现更细粒度的流控:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController {

// 自定义资源名"createOrder",并指定限流降级处理方法
@GetMapping("/order/create")
@SentinelResource(value = "createOrder", blockHandler = "handleFlowLimit")
public String createOrder() {
return "订单创建成功";
}

// 限流时的降级处理方法(参数和返回值需与原方法一致,额外添加BlockException参数)
public String handleFlowLimit(BlockException e) {
return "当前下单人数过多,请稍后再试";
}
}

配置:在 Dashboard 中针对资源名createOrder配置流控规则,效果与接口路径资源一致。

总结

Sentinel 的流量控制通过灵活的规则配置,可满足不同场景的流量管理需求:

  • 阈值类型选择:短耗时接口用 QPS,长耗时接口用线程数;
  • 流控模式选择:单个接口保护用 “直接”,核心接口优先用 “关联”,链路区分用 “链路”;
  • 流控效果选择:实时性要求高用 “快速失败”,流量波动大用 “Warm up”,需匀速处理用 “排队等待”

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10