一、Sentinel流量治理

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

主要做 3 件事:

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

两大核心功能:

1) 限流(Flow):控制请求速率,防止压垮。

  • QPS 限流(最常用)
  • 并发线程数限流(防止下游阻塞)
  • 热点参数限流(针对商品 ID / 用户 ID 限流)

2) 熔断降级(Degrade):下游服务挂了 / 慢了,直接切断调用,返回兜底

  • 慢调用比例熔断
  • 异常比例熔断
  • 异常数熔断

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

二、Sentinel单机限流

1. 什么是Sentinel单机限流

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

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

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

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

单机限流能限制:

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

2. 4 种限流模式

1) 快速失败(默认)

  • 超过阈值直接拒绝 → 返回提示

  • 适用:绝大多数接口

2) 预热模式(Warm Up)

  • 流量慢慢增加,防止冷启动系统被打崩

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

3) 排队等待

  • 超过的请求排队,匀速通过

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

4) 限流 + 关联

  • A 接口访问太多,限制 B 接口

  • 适用:读写分离保护

3. 单机限流实现

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

2) 接口加注解

@RestController
public class TestController {

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

    // 限流后走这个方法
    public String limitHandler(BlockException e) {
        return "限流了,请稍后再试";
    }
}

3) 控制台配置

  • ① 打开 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

2) 单机模式(默认)

  • 总 QPS = 单机阈值 × 实例数

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

3. Spring Cloud Alibaba快速集成

    1) 引入依赖 

    spring-cloud-starter-alibaba-sentinel

    2) 配置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

    3) 定义资源 + 限流(注解方式)

    @RestController
    public class OrderController {
    
        // 定义资源名 + 限流后走的方法
        @SentinelResource(
            value = "createOrder",    // 资源名(随便起,唯一即可)
            blockHandler = "limitHandler"  // 限流后执行的方法
        )
        @GetMapping("/order/create")
        public String createOrder() {
            return "下单成功";
        }
    
        // 限流处理方法
        public String limitHandler(BlockException e) {
            return "当前访问人数过多,请稍后再试!";
        }
    }

    4) 控制台配置集群流控规则

    •  访问 http://127.0.0.1:8080
    • 找到资源 create-order流控
    • 配置(实时生效):
      •    阈值类型:QPS
      •  单机阈值:100
      • 集群模式:全局(总 QPS = 100)
      • 流控效果:快速失败 

      Logo

      AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

      更多推荐