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)
    • 流控效果:快速失败
相关推荐
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
霸道流氓气质2 天前
Spring Boot 微服务性能优化完全指南
spring boot·微服务·性能优化
地瓜伯伯2 天前
从MESI缓存一致性协议讲透synchronized的底层
java·spring boot·spring·spring cloud·微服务·springcloud
Devin~Y2 天前
大厂 Java 面试实录:从音视频内容社区到 AI RAG 的全链路技术设计
java·spring boot·redis·spring cloud·微服务·kafka·音视频
递归尽头是星辰2 天前
AI 访问数据仓库:从直连到微服务化
数据仓库·人工智能·微服务·dataagent·ai数据治理
就改了3 天前
Windows 环境 SkyWalking 完整实操教程
windows·微服务·skywalking
至乐活着3 天前
Docker Compose多服务编排实战:从零搭建Node.js+MySQL+Redis全栈应用
docker·微服务·devops·容器编排·compose
就改了3 天前
微服务异步场景链路断裂完整解决方案
微服务·云原生·架构
山东点狮信息科技有限公司3 天前
点狮OA-企业级 OA 办公自动化系统架构设计与实践
spring cloud·微服务·性能优化·架构·系统架构
逻极3 天前
Spring Boot 微服务开发提速:我们如何将接口响应时间降低60%
java·spring boot·微服务·性能优化·自动配置