
1. 为什么我们需要Sentinel这样的限流熔断工具去年双十一大促期间我负责的一个电商系统在流量高峰时突然崩溃当时每秒请求量达到了平日的20倍。数据库连接池耗尽、服务间调用雪崩、核心接口响应时间从200ms飙升到15秒...这场事故让我深刻认识到在高并发场景下没有完善的流量防护机制系统就像在裸奔。1.1 高并发系统的典型痛点现代分布式系统面临三大流量治理难题突发流量冲击秒杀活动、热点事件带来的流量尖峰可能超过系统设计容量依赖服务不稳定下游服务超时或宕机时若不及时熔断会导致级联故障系统资源竞争数据库连接、线程池等共享资源被耗尽引发整体服务不可用以我最近优化的一个支付系统为例当上游订单系统突发大量请求时支付接口QPS从500暴增到3000MySQL连接池200个连接全部占满平均响应时间从80ms恶化到2秒最终导致支付成功率从99.9%暴跌至60%1.2 Sentinel的核心能力矩阵对比常见的流量控制方案Sentinel提供了更完整的防护维度防护维度传统方案Sentinel方案优势对比流量控制Nginx限流QPS/并发数控制支持方法级细粒度控制熔断降级Hystrix慢调用比例/异常比例熔断更灵活的熔断策略系统保护手动运维Load自适应保护基于BDP算法的智能调控热点防护代码硬编码参数级热点识别动态规则即时生效提示Sentinel与Hystrix最大的区别在于其流量视角的设计理念通过实时的指标统计和规则控制实现更精准的流量整形。2. Spring Boot集成Sentinel全流程实战2.1 环境准备与基础配置首先在pom.xml中添加必要依赖注意版本匹配!-- Sentinel核心依赖 -- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-sentinel/artifactId version2022.0.0.0/version /dependency !-- 接入控制台需要额外添加 -- dependency groupIdcom.alibaba.csp/groupId artifactIdsentinel-transport-simple-http/artifactId version1.8.6/version /dependencyapplication.yml关键配置项spring: cloud: sentinel: enabled: true transport: dashboard: localhost:8080 # 控制台地址 port: 8719 # 本地启动HTTP Server端口 eager: true # 取消延迟加载 filter: url-patterns: /** # 监控所有URL2.2 三种资源保护模式详解2.2.1 注解式保护推荐RestController RequestMapping(/order) public class OrderController { SentinelResource(value createOrder, blockHandler handleFlowLimit, fallback handleSystemError) PostMapping public ResultOrder createOrder(RequestBody OrderDTO dto) { // 业务逻辑 } // 流控处理逻辑 public ResultOrder handleFlowLimit(OrderDTO dto, BlockException ex) { return Result.fail(系统繁忙请稍后重试); } // 降级处理逻辑 public ResultOrder handleSystemError(OrderDTO dto, Throwable t) { return Result.fail(服务暂时不可用); } }2.2.2 代码式保护// 手动定义资源 try (Entry entry SphU.entry(queryStock)) { // 被保护的逻辑 return stockService.query(itemId); } catch (BlockException e) { // 处理流控逻辑 log.warn(触发流控规则, e); return fallbackQuery(itemId); }2.2.3 全局异常处理ControllerAdvice public class SentinelExceptionHandler { ExceptionHandler(BlockException.class) ResponseBody public Result? handleBlockException(BlockException e) { String rule e.getRule().getResource(); if (e instanceof FlowException) { return Result.fail(rule 触发流控); } else if (e instanceof DegradeException) { return Result.fail(rule 服务降级); } return Result.fail(系统限流中); } }2.3 控制台配置实战演示启动Sentinel Dashboardjava -Dserver.port8080 -Dcsp.sentinel.dashboard.serverlocalhost:8080 -jar sentinel-dashboard.jar访问localhost:8080输入默认账号sentinel/sentinel配置流控规则示例资源名createOrder阈值类型QPS单机阈值500流控模式直接流控效果快速失败配置熔断规则示例熔断策略慢调用比例最大RT500ms比例阈值0.550%熔断时长5秒最小请求数103. 高并发场景下的进阶配置技巧3.1 热点参数限流实战电商商品详情页的场景中某些爆款商品会被频繁查询SentinelResource(value getProductDetail, blockHandler hotProductBlockHandler) GetMapping(/products/{id}) public Product getProductDetail( PathVariable(id) Long productId, RequestParam(required false) String promoType) { // 业务逻辑 } // 热点参数处理 public Product hotProductBlockHandler(Long productId, String promoType, BlockException ex) { if (productId.equals(12345L)) { return cacheService.getCachedProduct(); } return Product.EMPTY; }对应的热点规则配置参数索引0对应productId参数单机阈值100普通商品参数例外项12345爆款商品500067890热门新品30003.2 集群流控配置当服务部署多个实例时需要配置集群流控启动Token Server-Dproject.namemy-app -Dcsp.sentinel.heartbeat.interval.ms30000客户端配置spring: cloud: sentinel: transport: client-ip: ${spring.cloud.client.ip-address} cluster: client: server-ip: 192.168.1.100 # Token Server地址 port: 18730控制台配置集群规则流控模式集群阈值类型全局QPS全局阈值100003.3 网关层整合方案对于Spring Cloud Gateway的限流配置Bean Order(Ordered.HIGHEST_PRECEDENCE) public SentinelGatewayFilterFactory sentinelGatewayFilterFactory() { return new SentinelGatewayFilterFactory(); }网关规则配置示例{ resource: product_route, count: 1000, grade: 1, controlBehavior: 0, burst: 50, paramItem: { parseStrategy: 3, fieldName: userId } }4. 生产环境避坑指南4.1 常见配置陷阱规则未持久化问题重启后规则丢失方案集成Nacos/Apollo配置中心Bean public DataSource nacosDataSource() { return new NacosDataSource( nacos-server:8848, my-app, sentinel.rule.config); }热点参数识别不全现象部分热点未被统计解决确保参数类型实现了hashCode/equals熔断恢复抖动现象熔断状态频繁切换优化调整熔断最小请求数建议≥204.2 性能优化要点资源名设计规范错误示例SentinelResource(getUser)正确示例SentinelResource(user_service:getUser:1.0)异步资源统计AsyncEntry entry SphU.asyncEntry(resourceName); CompletableFuture.runAsync(() - { try { // 业务逻辑 } finally { entry.exit(); } });日志输出控制# 关闭不必要的日志 -Dcsp.sentinel.metric.file.single.size1024 -Dcsp.sentinel.log.output.typeconsole4.3 监控与告警集成Prometheus监控配置management: endpoints: web: exposure: include: prometheus,sentinel metrics: tags: application: ${spring.application.name}关键监控指标sentinel_flow_request_total总请求量sentinel_flow_pass_total通过量sentinel_flow_block_total拦截量sentinel_avg_rt平均响应时间告警规则示例Grafana表达式increase(sentinel_flow_block_total[1m]) 100标签severitycritical在实际项目中我们通过这套方案成功将系统可用性从99.5%提升到99.99%。特别是在大促期间虽然整体流量增长了8倍但通过Sentinel的精准流量控制核心服务始终保持稳定。一个特别有用的技巧是为不同的业务场景设置分级流控策略——比如优先保证支付接口的可用性而对商品评价接口实施更严格的限流。