一、核心概念

1. 资源(Resource)

  • 定义:Sentinel 中的核心保护对象,可以是接口、方法、代码块等。例如:/order/query 接口、/user/{id} 方法。
  • 来源
    • 自动监控:Sentinel 默认监控 Spring MVC 的每个端点(Controller 方法)。
    • 手动定义:通过 @SentinelResource 注解或 Entry API 定义资源。

2. 规则(Rule)

  • 类型
    • QPS 限流:按每秒请求数(Queries Per Second)限制流量。
    • 线程数限流:限制同时处理请求的线程数。
    • 关联限流:当关联资源触发阈值时,对当前资源限流。
    • 链路限流:针对特定调用链路的入口进行限流。
    • 热点参数限流:对某些参数值进行独立限流(如商品 ID)。
  • 流控模式
    • 直接模式:统计当前资源的请求,触发阈值时直接限流(默认模式)。
    • 关联模式:统计关联资源的请求,触发阈值时限流当前资源。
    • 链路模式:统计从指定链路访问到本资源的请求,触发阈值时限流指定链路。

二、操作步骤(详细版)

1. 集成 Sentinel

(1)添加依赖

在 Spring Boot 项目中,添加以下 Maven 依赖:

<!-- Sentinel 核心依赖 -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.6</version>
</dependency>

<!-- Sentinel 与 Spring Cloud 集成 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<!-- Sentinel 控制台依赖 -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>1.8.6</version>
</dependency>

(2)配置 Sentinel 控制台

application.yml 中配置 Sentinel 控制台地址:

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080  # Sentinel 控制台地址

(3)启动 Sentinel 控制台

下载并运行 Sentinel 控制台:

java -jar sentinel-dashboard-1.8.6.jar

访问 http://localhost:8080,默认账号密码为 sentinel/sentinel


2. 配置流控规则

(1)通过控制台添加规则

  1. 登录 Sentinel 控制台,进入 流控规则 页面。
  2. 点击“新建”,填写以下信息:
    • 资源名:需要限流的资源(如 /order/query)。
    • 针对来源:默认为 default(不限流特定来源)。
    • 阈值类型:选择 QPS 或 线程数。
    • 单机阈值:设置阈值(如 QPS=5)。
    • 流控模式:选择直接、关联或链路。
    • 流控效果:选择快速失败、Warm Up 或排队等待。
  3. 保存规则,实时生效。

(2)通过代码动态配置

使用 FlowRuleManager 动态添加规则:

List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("order/query");  // 资源名
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);  // QPS 限流
rule.setCount(5);  // 阈值
rule.setLimitApp("default");  // 针对来源
rules.add(rule);
FlowRuleManager.loadRules(rules);

3. 测试限流规则

(1)使用 JMeter 压测

  1. 在 JMeter 中创建 HTTP 请求,设置目标接口(如 /order/query)。
  2. 设置线程组:20 个线程,持续时间 2 秒(QPS=10)。
  3. 运行测试,观察 Sentinel 控制台的实时监控数据,验证限流是否生效。

(2)手动测试

在浏览器中快速刷新接口(如 /order/query),触发限流后会返回错误信息:

Blocked by Sentinel (flow limiting)

三、常见错误及解决方案

1. 限流规则未生效

  • 原因
    • 资源名不匹配(如未正确配置 @SentinelResource)。
    • 阈值设置过低或过高。
    • Sentinel 控制台未正确连接。
  • 解决方案
    • 检查资源名是否与接口路径一致。
    • 通过日志查看 Sentinel 的规则加载情况。
    • 确保应用与 Sentinel 控制台网络连通。

2. 关联模式未生效

  • 原因
    • 关联资源未正确配置。
    • 未触发关联资源的阈值。
  • 解决方案
    • 确保关联资源的请求量达到阈值。
    • 在控制台检查关联资源的监控数据。

3. 链路模式未生效

  • 原因
    • 调用链路未正确标记。
    • 未使用 @SentinelResource 注解定义资源。
  • 解决方案
    • 确保调用链路中的每个方法都标记为资源。
    • 使用 @SentinelResource 注解明确资源名。

四、注意事项

  1. 合理划分资源粒度

    • 过粗:无法精准控制(如对整个服务限流)。
    • 过细:增加内存开销(如每个方法独立限流)。
    • 建议:按业务逻辑划分资源(如 /order/create/order/query)。
  2. 动态调整规则

    • 通过 Sentinel 控制台动态修改规则,无需重启服务。
    • 避免频繁修改规则导致性能抖动。
  3. 监控与告警

    • 在 Sentinel 控制台中实时监控 QPS、线程数等指标。
    • 配置告警规则,及时发现异常流量。
  4. 流控效果选择

    • 快速失败:适用于对系统处理能力已知的场景(如压测后确定阈值)。
    • Warm Up:适用于突发流量场景,避免冷启动崩溃。
    • 排队等待:适用于均匀流量场景(如漏桶算法)。

五、使用技巧

  1. 使用注解简化配置

    @RestController
    public class OrderController {
        @GetMapping("/order/query")
        @SentinelResource(value = "order/query", blockHandler = "handleBlock")
        public String queryOrder() {
            return "Order details";
        }
    
        public String handleBlock(BlockException ex) {
            return "Blocked by Sentinel";
        }
    }
    
  2. 热点参数限流

    • 对特定参数值(如商品 ID)进行独立限流:
      @GetMapping("/product/{id}")
      @SentinelResource(value = "product/{id}", blockHandler = "handleBlock")
      public String getProduct(@PathVariable String id) {
          return "Product " + id;
      }
      
  3. 自定义异常处理

    • 通过 blockHandlerfallback 方法处理限流和降级逻辑。
  4. 链路模式的调用链分析

    • 使用 @SentinelResource 注解标记链路中的每个方法,确保调用链路清晰。

六、最佳实践

1. 高并发接口的限流

  • 场景:秒杀活动、促销页面。
  • 策略
    • 设置 QPS 限流(如 1000 QPS)。
    • 使用 Warm Up 模式,避免冷启动崩溃。
    • 对热点参数(如商品 ID)单独限流。

2. 关联资源限流

  • 场景:支付接口和查询接口竞争数据库资源。
  • 策略
    • 当支付接口(/order/pay)的 QPS 超过阈值时,对查询接口(/order/query)限流。
    • 配置关联规则,确保优先处理支付请求。

3. 链路模式的调用链保护

  • 场景:不同业务入口调用同一服务(如 /api/v1/user/api/v2/user)。
  • 策略
    • /api/v1/user 的入口限流,避免影响 /api/v2/user 的调用。

七、性能优化

  1. 资源粒度优化

    • 避免过度划分资源,减少内存开销。
    • 合并相似资源(如 /user/{id} 可统一限流)。
  2. 规则优化

    • 简化规则数量,避免冗余配置。
    • 使用动态规则(如 Nacos 数据源)管理规则。
  3. 线程池配置

    • 调整 Sentinel 内部线程池大小,适应高并发场景。
    • 避免线程池阻塞影响业务逻辑。
  4. 缓存与异步处理

    • 对高频请求使用缓存,减少后端压力。
    • 异步处理非关键路径请求,提高响应速度。
  5. 监控与调优

    • 定期分析 Sentinel 监控数据,优化阈值设置。
    • 使用压测工具(如 JMeter)验证限流效果。

八、总结

Sentinel 的流量控制规则是保障微服务稳定性的重要工具。通过合理划分资源、配置流控模式和阈值,结合动态规则管理与性能优化,可以有效应对高并发场景,防止系统崩溃。实际应用中,建议结合业务场景选择合适的流控策略,并通过监控与测试持续优化规则。