11.4流量控制规则

分类: Sentinel流量控制与熔断

流量控制规则

流量控制规则是 Sentinel 的核心功能之一。本节将学习如何配置和使用流量控制规则。

本章节内容参考官方文档顺序: 根据 Sentinel 官方文档 - Flow Control,官方文档按照以下顺序讲解:

  1. Flow Control Overview(流量控制概览)
  2. QPS Flow Control(QPS 限流)
  3. Thread Count Flow Control(线程数限流)
  4. Associate Flow Control(关联限流)
  5. Link Flow Control(链路限流)
  6. Warm Up(预热限流)
  7. Queue Wait(排队等待)

本节将学习:QPS 限流、线程数限流、关联限流、链路限流、预热限流,以及排队等待。

在商城项目中集成 Sentinel

步骤1:添加 Sentinel 依赖

文件路径: mall-microservices/order-service/pom.xml

<!-- Sentinel --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!-- Sentinel 与 Nacos 集成(规则持久化) --> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency>

步骤2:配置 Sentinel

文件路径: mall-microservices/order-service/src/main/resources/application.yml

spring: cloud: sentinel: transport: dashboard: localhost:8080 # Sentinel 控制台地址 port: 8719 # 客户端与控制台通信端口 datasource: # 流控规则数据源 flow: nacos: server-addr: localhost:8848 data-id: ${spring.application.name}-flow-rules group-id: SENTINEL_GROUP rule-type: flow # 熔断规则数据源 degrade: nacos: server-addr: localhost:8848 data-id: ${spring.application.name}-degrade-rules group-id: SENTINEL_GROUP rule-type: degrade

步骤3:本地搭建 Sentinel 控制台

文件路径: mall-microservices/docker/sentinel/docker-compose.yml

version: '3.8' services: sentinel: image: bladex/sentinel-dashboard:latest container_name: sentinel-dashboard ports: - "8080:8858" environment: - JAVA_OPTS=-Dserver.port=8858 -Dcsp.sentinel.dashboard.server=localhost:8858 networks: - mall-network networks: mall-network: driver: bridge

启动 Sentinel 控制台:

cd mall-microservices/docker/sentinel docker-compose up -d # 访问控制台:http://localhost:8080 # 默认账号密码:sentinel/sentinel

QPS 限流

在订单服务中配置 QPS 限流

场景:限制创建订单接口的 QPS

方式1:通过 Sentinel 控制台配置

  1. 访问 Sentinel 控制台:http://localhost:8080
  2. 进入"流控规则"
  3. 点击"新增流控规则"
  4. 配置:
    • 资源名POST:/api/orders
    • QPS 阈值:10
    • 流控模式:直接
    • 流控效果:快速失败

方式2:通过代码配置

文件路径: mall-microservices/order-service/src/main/java/com/mall/orderservice/config/SentinelConfig.java

package com.mall.orderservice.config; import com.alibaba.csp.sentinel.slots.block.RuleConstant; import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; import java.util.ArrayList; import java.util.List; @Configuration public class SentinelConfig { @PostConstruct public void initFlowRules() { List<FlowRule> rules = new ArrayList<>(); // 创建订单接口 QPS 限流:10 QPS FlowRule createOrderRule = new FlowRule(); createOrderRule.setResource("POST:/api/orders"); createOrderRule.setGrade(RuleConstant.FLOW_GRADE_QPS); createOrderRule.setCount(10); createOrderRule.setLimitApp("default"); rules.add(createOrderRule); // 查询订单接口 QPS 限流:50 QPS FlowRule queryOrderRule = new FlowRule(); queryOrderRule.setResource("GET:/api/orders"); queryOrderRule.setGrade(RuleConstant.FLOW_GRADE_QPS); queryOrderRule.setCount(50); queryOrderRule.setLimitApp("default"); rules.add(queryOrderRule); FlowRuleManager.loadRules(rules); } }

使用 @SentinelResource 注解

文件路径: mall-microservices/order-service/src/main/java/com/mall/orderservice/controller/OrderController.java

package com.mall.orderservice.controller; import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockException; import com.mall.orderservice.common.Result; import com.mall.orderservice.entity.Order; import com.mall.orderservice.service.OrderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/orders") public class OrderController { @Autowired private OrderService orderService; @PostMapping @SentinelResource(value = "createOrder", blockHandler = "createOrderBlockHandler") public Result<Order> createOrder(@RequestBody Order order) { Order created = orderService.createOrder(order); return Result.success("Order created successfully", created); } /** * 限流降级处理 */ public Result<Order> createOrderBlockHandler(@RequestBody Order order, BlockException ex) { return Result.error("Service is busy, please try again later"); } @GetMapping("/{id}") @SentinelResource(value = "getOrder", blockHandler = "getOrderBlockHandler") public Result<Order> getOrder(@PathVariable Long id) { Order order = orderService.getById(id); if (order == null) { return Result.error("Order not found"); } return Result.success(order); } public Result<Order> getOrderBlockHandler(@PathVariable Long id, BlockException ex) { return Result.error("Service is busy, please try again later"); } }

线程数限流

在商品服务中配置线程数限流

场景:限制商品查询接口的并发线程数

文件路径: mall-microservices/product-service/src/main/java/com/mall/productservice/config/SentinelConfig.java

@PostConstruct public void initFlowRules() { List<FlowRule> rules = new ArrayList<>(); // 商品查询接口线程数限流:最多5个并发线程 FlowRule queryProductRule = new FlowRule(); queryProductRule.setResource("GET:/api/products"); queryProductRule.setGrade(RuleConstant.FLOW_GRADE_THREAD); queryProductRule.setCount(5); queryProductRule.setLimitApp("default"); rules.add(queryProductRule); FlowRuleManager.loadRules(rules); }

使用场景:

  • 商品查询接口可能涉及复杂的数据库查询
  • 限制并发线程数可以保护数据库不被压垮
  • 超过线程数限制的请求会被拒绝

关联限流

关联限流说明

关联限流: 当关联资源达到阈值时,限流当前资源。

链路限流

链路限流说明

链路限流: 只统计指定链路上的流量。

预热限流

预热限流说明

预热限流: 系统冷启动时,流量逐渐增加到阈值。

排队等待

排队等待说明

排队等待: 超过阈值的请求进入队列等待。

官方资源

根据 Sentinel 流量控制文档

  1. 流量控制规则:官方文档详细说明了 Sentinel 支持的各种流量控制规则,包括 QPS 限流、并发线程数限流、关联限流、链路限流等。文档强调,Sentinel 的限流规则支持多种控制效果,如快速失败、Warm Up、排队等待等,可以根据业务场景灵活选择。

  2. 规则配置方式:官方文档提供了多种规则配置方式,包括代码配置、控制台配置、Nacos 配置中心配置等。文档特别推荐使用 Nacos 作为规则数据源,这样可以实现规则的持久化和动态更新。

  3. 与 Spring Cloud 集成:官方文档详细说明了 Sentinel 如何与 Spring Cloud Gateway、OpenFeign、RestTemplate 等组件集成,提供了完整的配置示例和最佳实践。

参考资源

本节小结

在本节中,我们学习了:

第一个是 QPS 限流。 限制每秒请求数。

第二个是线程数限流。 限制并发线程数。

第三个是关联限流。 关联资源的限流。

第四个是链路限流。 指定链路的限流。

第五个是预热限流。 系统冷启动的限流。

第六个是排队等待。 请求排队等待。

这就是流量控制规则。合理配置流量控制规则,可以保护系统稳定性。

在下一节,我们将学习熔断降级规则。