Sentinel实现限流

一、Sentinel流量治理

Sentinel是阿里开源微服务流量治理组件。

主要做 3 件事:

  • 限流(控制 QPS / 并发)
  • 熔断降级(下游故障时切断调用,保护自己)
  • 系统负载保护(CPU/load 高自动拒绝)

两大核心功能:

  1. 限流(Flow):控制请求速率,防止压垮。
  • QPS 限流(最常用)
  • 并发线程数限流(防止下游阻塞)
  • 热点参数限流(针对商品 ID / 用户 ID 限流)
  1. 熔断降级(Degrade):下游服务挂了 / 慢了,直接切断调用,返回兜底
  • 慢调用比例熔断
  • 异常比例熔断
  • 异常数熔断

Sentinel单机限流用滑动窗口,无依赖、高性能、强一致,是生产最主流方案;Sentinel集群限流用于全局总控,最终一致。

二、Sentinel单机限流

1. 什么是Sentinel单机限流

单机限流:每个服务实例自己管自己的流量,互不通信、互不干扰。

核心原理:Sentinel 在本地内存里用 LeapArray 滑动窗口 统计 QPS / 线程数, 无临界突刺、精准限流、原子操作、强一致

生产 90% 都用单机限流的原因:

  • 最简单:开箱即用,不用配置集群、Token Server
  • 性能最高:纯内存计算,无网络开销
  • 强一致性:不会超发、不会多算
  • 无风险:不依赖第三方,不引入单点故障
  • 足够用:大多数业务只需要保证单台不被打崩

单机限流能限制:

  • QPS 限流(最常用) 每秒最多多少请求
  • 并发线程数限流 同时执行的线程数,防止压垮下游
  • 热点参数限流 针对某个商品 ID / 用户 ID 单独限流

2. 4 种限流模式

  1. 快速失败(默认)
  • 超过阈值直接拒绝 → 返回提示

  • 适用:绝大多数接口

  1. 预热模式(Warm Up)
  • 流量慢慢增加,防止冷启动系统被打崩

  • 适用:秒杀、刚启动的服务

  1. 排队等待
  • 超过的请求排队,匀速通过

  • 适用:消息队列、订单处理

  1. 限流 + 关联
  • A 接口访问太多,限制 B 接口

  • 适用:读写分离保护

3. 单机限流实现

  1. 引入依赖 spring-cloud-starter-alibaba-sentinel

  2. 接口加注解

java 复制代码
@RestController
public class TestController {

    // 资源名:testApi
    @SentinelResource(value = "testApi", blockHandler = "limitHandler")
    @GetMapping("/test")
    public String test() {
        return "success";
    }

    // 限流后走这个方法
    public String limitHandler(BlockException e) {
        return "限流了,请稍后再试";
    }
}
  1. 控制台配置
  • ① 打开 Sentinel 控制台
  • ② 找到资源 testApi
  • 流控规则 → 单机阈值(如 100 QPS)
  • ④ 集群模式:不开启(默认就是单机)

三、Sentinel 分布式限流

1. 什么是Sentinel分布式限流

分布式限流:全集群统一计数,全局总 QPS 不超限

核心原理: Sentinel 集群限流 = 滑动窗口统计 + 全局令牌桶 + 实例统一上报 / 拉取计数,最终一致性

特点:

  • 天然滑动窗口,无临界突刺
  • 控制台可视化,动态改规则
  • 支持 QPS / 并发线程数 / 热点参数限流
  • 支持熔断、降级、系统保护

核心:Token Server + Token Client 模式

  • Token Server:全局计数器,统一发令牌(可集群部署)
  • Token Client:业务服务,请求前向 Server 拿令牌

2. 集群限流两种模式

  1. 全局模式(常用)
  • 总 QPS = 配置值,与实例数无关

  • 例:全局 QPS = 100 → 不管 3 实例还是 10 实例,总和 ≤100

  1. 单机模式(默认)
  • 总 QPS = 单机阈值 × 实例数

  • 例:单机 100,3 实例 → 总 300

3. Spring Cloud Alibaba快速集成

  1. 引入依赖

spring-cloud-starter-alibaba-sentinel

  1. 配置yml文件

application.yml(开启集群限流)

复制代码
spring:
  cloud:
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080  # Sentinel控制台
        port: 8719
      cluster:
        client:
          enable: true               # 开启集群限流
          server-host: 127.0.0.1     # Token Server地址
          server-port: 8720
  1. 定义资源 + 限流(注解方式)
java 复制代码
@RestController
public class OrderController {

    // 定义资源名 + 限流后走的方法
    @SentinelResource(
        value = "createOrder",    // 资源名(随便起,唯一即可)
        blockHandler = "limitHandler"  // 限流后执行的方法
    )
    @GetMapping("/order/create")
    public String createOrder() {
        return "下单成功";
    }

    // 限流处理方法
    public String limitHandler(BlockException e) {
        return "当前访问人数过多,请稍后再试!";
    }
}
  1. 控制台配置集群流控规则
  • 访问 http://127.0.0.1:8080
  • 找到资源 create-order流控
  • 配置(实时生效 ):
    • 阈值类型:QPS
    • 单机阈值:100
    • 集群模式:全局(总 QPS = 100)
    • 流控效果:快速失败
相关推荐
weixin_4074438712 小时前
基于Sentinel-1/2数据特征优选的冬小麦识别
人工智能·算法·随机森林·机器学习·sentinel
该昵称用户已存在12 小时前
2026 园区能源数字化:MyEMS 微服务拆分与时序数据库选型的落地经验
微服务·能源·时序数据库
苏渡苇13 小时前
微服务间的远程接口调用:OpenFeign 的使用
spring cloud·微服务·架构·springboot·openfeign·sca
凌云若寒13 小时前
SENTINEL软件
学习·sentinel·产品经理·制造·软件需求
未若君雅裁13 小时前
Kafka 消息可靠性:发送确认、acks、副本保存与Offset手动提交
分布式·微服务·kafka
梵得儿SHI14 小时前
SpringCloud 进阶拓展:性能优化指南(缓存三大问题 + 分库分表入门)
spring cloud·缓存·微服务·性能优化·高并发·分库分表·数据库优化
苏渡苇1 天前
Spring Cloud Alibaba:将 Sentinel 熔断限流规则持久化到 Nacos 配置中心
数据库·spring boot·mysql·spring cloud·nacos·sentinel·持久化
还在忙碌的吴小二1 天前
Spring Cloud Alibaba 微服务解决方案新手入门指南
微服务·云原生·架构
a23121211 天前
从零搭建Spring Ai多智能体后端应用
java·运维·微服务·多智能体·后端开发·spring ai