Sentinel:阿里云高并发流量控制

Sentinel 是阿里开源的分布式流量治理组件,核心目标是通过流量控制、熔断降级等机制,让系统获得 "自适应免疫力",解决高并发下的服务稳定性问题(如流量击穿、雪崩效应)。适配 Spring Cloud、Dubbo 等主流框架,支持动态规则配置与实时监控。

一 Sentinel的三大核心概念

|------|-------------------------|--------------------------------------------|
| 概念 | 通俗解释 | 举例 |
| 资源 | 要保护的 "目标"(接口、方法、代码块) | 订单接口/api/order/create、Feign 调用user-service |
| 规则 | 保护资源的 "策略"(限流、熔断等) | "订单接口 QPS 超 100 就限流""调用超时超 3 秒就熔断" |
| 簇点链路 | 资源的 "调用关系图"(展示谁调用了这个资源) | 前端→订单服务→库存服务(库存服务是订单服务的下游资源) |

核心逻辑:先定义 "资源",再给资源加 "规则",通过 "簇点链路" 查看资源调用情况。

二 Sentinel的安装与使用

1、Sentinel控制台的下载

下载地址:https://github.com/alibaba/Sentinel/releases/tag/1.8.3

直接下载jar包

建议放在单独目录(如 D:\sentinel 或 /home/user/sentinel),避免路径含中文 / 空格。

启动(防止8080端口被占用,从而使用18080):

复制代码
java -Dserver.port=18080 -Dcsp.sentinel.dashboard.server=localhost:18080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar

2、访问Sentinel

浏览器输入:localhost:18080

账号密码 默认都是 sentinel

三 集成SpringCloud

1 引入依赖

XML 复制代码
​
		<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
        </dependency>

​<!-- sentinel + nacos -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

2 添加配置

java 复制代码
spring:
  application:
    name: mdx-shop-user # 服务名(注册到Nacos)
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # Nacos地址
        namespace: mdx # 环境隔离(如dev/test)
        group: mdx # 服务分组
    sentinel:
      transport:
        dashboard: localhost:18080 # Sentinel控制台地址
      datasource: # 规则持久化(存Nacos,避免重启丢失)
        flow: # 流控规则
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}-flow-rules
            groupId: SENTINEL_GROUP
            rule-type: flow # 规则类型(flow=流控,degrade=熔断)
        degrade: # 熔断规则
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}-degrade-rules
            groupId: SENTINEL_GROUP
            rule-type: degrade
feign:
  sentinel:
    enabled: true # 开启Feign+Sentinel整合(Feign调用失败触发降级)

3 定义资源

java 复制代码
@RestController
@RequestMapping("/api/user")
public class UserController {

    // 资源名:userGetById,降级方法:getUserFallback
    @SentinelResource(value = "userGetById", blockHandler = "getUserFallback")
    @GetMapping("/{id}")
    public String getUserById(@PathVariable String id) {
        // 业务逻辑:查询用户信息
        return "用户ID:" + id + ",姓名:张三";
    }

    // 降级方法:参数、返回值必须和原方法一致,最后加BlockException
    public String getUserFallback(String id, BlockException e) {
        // 限流/熔断时返回的提示
        return "当前访问人数过多,请稍后重试(用户查询服务)";
    }
}

4 Nacos中配置Sentinel

打开 Nacos 控制台(localhost:8848/nacos),新建配置:​

  • 数据 ID:mdx-shop-user-flow-rules(对应 yml 中的 dataId);
  • 分组:SENTINEL_GROUP;
  • 配置格式:JSON;
  • 配置内容(流控规则示例):

    java 复制代码
    [
      {
        "resource": "userGetById", // 资源名
        "grade": 1, // 阈值类型:1=QPS,0=并发线程数
        "count": 10, // 阈值:每秒10次请求
        "controlBehavior": 0, // 流控效果:0=快速失败,1=Warm Up,2=排队等待
        "strategy": 0, // 流控模式:0=直接,1=关联,2=链路
        "clusterMode": false // 是否集群:默认false
      }
    ]

    同理,新建熔断规则配置(数据 ID:mdx-shop-user-degrade-rules):​

java 复制代码
[
  {
    "resource": "mdx-shop-order#/api/order/{userId}(String)", // Feign自动生成的资源名
    "grade": 0, // 熔断策略:0=慢调用比例,1=异常比例,2=异常数
    "count": 3000, // 最大RT:3000ms
    "slowRatioThreshold": 0.5, // 慢调用比例阈值:50%
    "statIntervalMs": 10000, // 统计时长:10秒
    "timeWindow": 5 // 熔断时长:5秒
  }
]

四 核心规则精讲(一):流控规则(控制 "流量",避免服务被冲垮)​

流控 ="流量控制",核心是:当资源的请求量超过设定阈值时,如何 "拦截" 多余请求。​

需重点掌握 3 个配置维度,每个维度都对应实际业务场景:​

  1. 第一步:选 "阈值类型"(按什么维度限流?)​

决定 "用 QPS 还是并发线程数" 作为限流标准,二选一:​

|-------------|-----------------|-------------------|
| 阈值类型​ | 定义​ | 适用场景​ |
| QPS(每秒请求数)​ | 每秒访问资源的请求次数​ | 接口抗并发能力有限(如秒杀接口)​ |
| 并发线程数​ | 同时处理该资源请求的线程数量​ | 资源调用耗时久(如数据库慢查询)​ |

举例:秒杀接口用 "QPS=100"(每秒最多 100 人抢);查询订单详情(查数据库)用 "并发线程数 = 20"(同时最多 20 个线程查库,避免数据库连接耗尽)。​

  1. 第二步:选 "流控模式"(对谁限流?)​

决定 "限流作用在哪个调用链路",3 种模式对应不同业务需求:​

|-----------|--------------------------|--------------------------------------------------|
| 流控模式​ | 逻辑​ | 场景举例​ |
| 直接模式(默认)​ | 资源自身超阈值,直接限流该资源​ | 订单接口自身 QPS 超 100,直接拦截订单请求​ |
| 关联模式​ | 当 "关联资源" 超阈值,限流当前资源​ | 支付接口(关联资源)超负载,限流订单创建(当前资源),避免更多支付请求​ |
| 链路模式​ | 只限制 "特定调用链路" 的请求,其他链路不限​ | 商品详情接口有 2 个调用方:APP 端和管理端,只限流 APP 端的请求(管理端需优先访问)​ |

关键提醒:用 "链路模式" 时,需在配置文件加一行:spring.cloud.sentinel.web-context-unify=false(关闭 Web 上下文统一,才能识别不同调用链路)。​

  1. 第三步:选 "流控效果"(限流后怎么处理?)​

决定 "拦截请求后,给用户返回什么 / 怎么处理",3 种效果各有侧重:​

|--------------|-----------------------------------|--------------------------|
| 流控效果​ | 逻辑​ | 适用场景​ |
| 快速失败(默认)​ | 超阈值直接抛异常(BlockException),返回自定义提示​ | 非核心接口(如商品推荐),允许快速失败​ |
| Warm Up(预热)​ | 初始阈值低,逐渐升高到目标阈值(默认 30 秒)​ | 秒杀 / 活动启动场景(避免瞬间流量冲垮服务)​ |
| 排队等待(匀速)​ | 用 "漏桶算法" 让请求匀速通过,超时丢弃​ | 核心接口(如支付),需保证请求不丢失,匀速处理​ |

举例:秒杀活动用 Warm Up:初始阈值 30(前 30 秒每秒 30 人),30 秒后升到 100(正常阈值),避免启动瞬间 100QPS 冲垮服务;支付接口用排队等待:QPS=50,超时时间 500ms,超过 50QPS 的请求排队,500ms 内没处理完就丢弃,保证支付请求有序处理。​

流控规则配置实操(控制台版,最直观)​

  1. 启动 Sentinel 控制台(java -jar sentinel-dashboard-1.8.6.jar),访问localhost:8080(账号 sentinel);
  1. 先调用一次资源(如访问/api/order/create),让簇点链路显示该资源;
  1. 点击资源后的 "流控" 按钮,按需求配置:
  • 示例 1(秒杀接口):阈值类型 = QPS,阈值 = 100,流控模式 = 直接,流控效果 = Warm Up;
  • 示例 2(支付关联限流):资源选 "订单创建",阈值类型 = QPS,阈值 = 50,流控模式 = 关联,关联资源选 "支付接口"。

五 核心规则精讲(二):熔断规则("断尾",避免级联崩溃)​

熔断 ="服务故障时自动断开调用",核心是:当下游资源(如 A 调用 B,B 是下游)故障时,A 不再调用 B,而是直接返回降级结果,避免 A 被 B 拖垮。​

需先理解熔断的 "3 个状态",再学 "3 种熔断策略":​

  1. 先懂熔断的 "状态机"(核心逻辑)​

熔断规则的本质是让资源在 3 个状态间切换,确保故障时 "快速断连",恢复时 "谨慎试探":​

|----------|------------------------|---------------------------------|
| 状态​ | 行为​ | 切换条件​ |
| 关闭(默认)​ | 正常调用下游资源,统计异常 / 慢调用情况​ | 满足 "熔断策略"(如慢调用超 50%)→ 切换到 "开启"​ |
| 开启(熔断中)​ | 不调用下游资源,直接返回降级结果​ | 熔断时长到(如 5 秒)→ 切换到 "半开"​ |
| 半开(试探)​ | 允许少量请求调用下游,验证是否恢复​ | 若请求正常→ 切换到 "关闭";若仍异常→ 切回 "开启"​ |

举例:A 服务调用 B 服务,B 挂了→A 的熔断状态从 "关闭"→"开启"(5 秒内 A 不调用 B)→5 秒后到 "半开"(A 发 1 个请求给 B)→若 B 恢复(请求成功)→A 切回 "关闭"(正常调用);若 B 还没好(请求失败)→A 切回 "开启"(再等 5 秒)。​

  1. 3 种熔断策略(触发熔断的 "条件")​

决定 "什么情况下,触发熔断(从关闭→开启)",按业务场景选:​

|--------|-------------------------------------------------------------------------------------------|---------------------------------|
| 熔断策略​ | 触发条件(需同时满足)​ | 适用场景​ |
| 慢调用比例​ | 1. 统计周期内,请求 RT(响应时间)> 设定 "最大 RT";2. 慢调用占比 > 设定 "比例阈值"(如 50%);3. 统计周期内请求数 ≥ 5(避免少量请求误判)​ | 下游服务响应慢(如数据库查大表超时)​ |
| 异常比例​ | 1. 统计周期内,业务异常数(如抛 Exception)占比 > 阈值;2. 统计周期内请求数 ≥ 5​ | 下游服务报错多(如 B 服务抛 500 错误)​ |
| 异常数​ | 1. 统计周期内,业务异常总数 ≥ 设定 "异常数阈值";2. 统计周期内请求数 ≥ 5​ | 下游服务突发故障(如 B 服务连不上,瞬间抛 10 个异常)​ |

配置示例(慢调用比例):​

给 "订单调用库存" 资源配熔断:最大 RT=3000ms(超过 3 秒算慢调用),比例阈值 = 0.5(50% 是慢调用),统计时长 = 10 秒,熔断时长 = 5 秒。​

→ 10 秒内,若 "订单调用库存" 的请求中,50% 以上 RT>3 秒,且请求数≥5→触发熔断,5 秒内不再调用库存服务,直接返回 "库存服务繁忙"。​

熔断规则配置实操(控制台版)​

簇点链路找到目标资源(如 "订单调用库存"),点击 "降级" 按钮;​

选择熔断策略(如 "慢调用比例"),配置参数:​

  • 最大 RT:3000(单位 ms);
  • 比例阈值:0.5(50%);
  • 统计时长:10(单位秒);
  • 熔断时长:5(单位秒);
    故意让下游服务慢(如库存服务加Thread.sleep(4000)),触发熔断后,查看是否返回降级结果。
相关推荐
xrkhy4 小时前
微服务之SpringCloud Alibaba(注册中心Nacos)
spring cloud·微服务·架构
摇滚侠4 小时前
Spring Boot 3零基础教程,WEB 开发 整合 Thymeleaf 笔记36
java·spring boot·笔记
来生硬件工程师4 小时前
【STM32笔记】:P04 断言的使用
c语言·笔记·stm32·单片机·嵌入式硬件·硬件架构·硬件设计
Cathy Bryant4 小时前
大模型推理(九):采样温度
笔记·神经网络·机器学习·数学建模·transformer
阳光宅男@李光熠4 小时前
【质量管理】构建供应链韧性的第一道防线——高风险供应商的识别
笔记·学习
岑梓铭4 小时前
考研408《计算机组成原理》复习笔记,第五章(5)——CPU的【微程序控制器】
笔记·考研·408·计算机组成原理·计组
白云偷星子4 小时前
MySQL笔记13
数据库·笔记·mysql
optimistic_chen5 小时前
【Java EE进阶 --- SpringBoot】Mybatis - plus 操作数据库
数据库·spring boot·笔记·java-ee·mybatis·mybatis-plus
唐僧洗头爱飘柔95275 小时前
【SpringCloud(6)】Gateway路由网关;zuul路由;gateway实现原理和架构概念;gateway工作流程;静态转发配置
spring·spring cloud·架构·gateway·请求转发·服务降级·服务雪崩