Sentinel 流量控制与熔断降级
一、为什么我们需要 Sentinel1. 微服务架构的致命威胁服务雪崩在微服务架构中一个请求往往需要调用多个服务才能完成。如果其中一个服务出现故障响应变慢那么上游服务的线程就会被阻塞在这个慢调用上。随着越来越多的请求被阻塞上游服务的线程池会被占满无法处理新的请求最终导致上游服务也不可用。这个故障会像多米诺骨牌一样逐级传递最终导致整个系统崩溃这就是服务雪崩效应。2. 传统解决方案的局限性为了解决服务雪崩问题人们提出了很多解决方案超时机制给每个请求设置超时时间避免线程无限等待舱壁模式每个服务使用独立的线程池避免一个服务拖垮整个应用熔断模式当服务故障率达到阈值时直接熔断该服务快速失败Hystrix 是最早的熔断框架但它已经停止开发而且存在很多缺点配置复杂学习成本高依赖 Netflix 生态和 Spring Cloud Alibaba 整合不好不支持流量控制、热点参数限流等功能没有可视化控制台运维困难3. Sentinel 的核心价值Sentinel 是阿里巴巴开源的轻量级流量控制框架它以流量为切入点从流量控制、熔断降级、系统自适应保护等多个维度来保护服务的稳定性。Sentinel 的核心优势轻量级核心包只有几百 KB引入后几乎没有性能损耗功能丰富支持流量控制、熔断降级、热点参数限流、系统保护、黑白名单等简单易用提供可视化控制台一键配置规则实时监控生态完善无缝整合 Spring Cloud Alibaba、Dubbo、gRPC 等主流框架高可用支持集群限流、规则持久化满足生产环境需求二、Sentinel 核心概念要真正用好 Sentinel必须先搞懂它的核心概念。1. 资源Resource资源是 Sentinel 的核心概念它可以是任何东西一个接口、一段代码、一个数据库查询、一个 RPC 调用。所有需要被保护的东西都可以定义为资源Sentinel 会对资源进行流量控制和熔断降级。2. 规则Rule规则是 Sentinel 用来判断是否需要对资源进行保护的依据。Sentinel 支持多种类型的规则流量控制规则限制资源的 QPS熔断降级规则当资源故障率达到阈值时熔断该资源热点参数限流规则针对热点参数进行限流系统保护规则从系统整体维度进行保护授权规则控制资源的访问权限3. 流量控制Flow Control流量控制的原理是监控应用流量的 QPS 或并发线程数当达到指定的阈值时对流量进行控制避免系统被突发流量打垮。Sentinel 支持多种流量控制效果直接拒绝超过阈值的请求直接拒绝Warm Up预热模式让流量缓慢增加避免系统突然被压垮匀速排队让请求匀速通过适用于突发流量削峰填谷4. 熔断降级Circuit Breaking熔断降级的原理是监控资源的调用情况当资源的慢调用比例、异常比例或异常数达到阈值时自动熔断该资源的调用。在熔断期间所有对该资源的调用都会快速失败避免故障扩散。熔断一段时间后会进入半开状态尝试放行部分请求判断服务是否恢复。5. 热点参数限流Hot Spot Param Flow Control热点参数限流是针对请求中的热点参数进行限流。比如秒杀活动中某个商品的 ID 是热点参数我们可以针对这个商品 ID 进行单独限流避免单个商品打垮整个系统。三、Spring Boot 整合 Sentinel整合 Sentinel 非常简单只需要三步就能完成。第一步引入依赖xmldependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-sentinel/artifactId /dependency第二步配置 Sentinel在application.yml中添加 Sentinel 配置yamlspring: application: name: user-service cloud: sentinel: transport: dashboard: localhost:8080 # Sentinel 控制台地址 port: 8719 # 客户端和控制台通信端口 # 取消懒加载启动时立即连接控制台 eager: true第三步启动 Sentinel 控制台下载 Sentinel 控制台 jar 包https://github.com/alibaba/Sentinel/releases启动控制台java -jar sentinel-dashboard-1.8.6.jar访问http://localhost:8080默认用户名密码都是 sentinel现在启动你的 Spring Boot 应用就可以在 Sentinel 控制台看到你的服务了。四、核心功能实战4.1 流量控制流量控制是 Sentinel 最基础也是最常用的功能。我们可以通过控制台为任意接口配置流量控制规则。1. 快速入门给接口配置 QPS 限流在 Sentinel 控制台左侧菜单点击 簇点链路找到你要限流的接口点击 流控 按钮配置流控规则阈值类型QPS单机阈值10流控模式直接流控效果快速失败现在这个接口的 QPS 超过 10 时超过的请求会被直接拒绝返回Blocked by Sentinel (flow limiting)。2. 高级流控模式Sentinel 支持三种流控模式直接直接限制当前资源的 QPS关联当关联资源的 QPS 达到阈值时限制当前资源的 QPS链路只限制从指定链路进入当前资源的请求3. 高级流控效果Sentinel 支持三种流控效果快速失败超过阈值直接拒绝Warm Up预热模式阈值从初始值缓慢增加到最大值适用于系统启动时的流量控制匀速排队让请求匀速通过适用于突发流量削峰填谷4.2 熔断降级熔断降级用于保护系统免受慢调用和异常的影响。Sentinel 支持三种熔断策略1. 慢调用比例当资源的慢调用比例达到阈值时熔断该资源。最大 RT慢调用的阈值超过这个时间的调用被认为是慢调用比例阈值慢调用比例达到这个值时触发熔断熔断时长熔断持续的时间最小请求数触发熔断的最小请求数2. 异常比例当资源的异常比例达到阈值时熔断该资源。3. 异常数当资源的异常数达到阈值时熔断该资源。配置示例给/user/get接口配置熔断规则熔断策略慢调用比例最大 RT500ms比例阈值0.5熔断时长10s最小请求数10这个配置的意思是当 1 秒内有至少 10 个请求其中 50% 以上的请求响应时间超过 500ms 时熔断该接口 10 秒。在熔断期间所有请求都会快速失败。4.3 热点参数限流热点参数限流是 Sentinel 最强大的功能之一它可以针对请求中的特定参数进行限流。使用示例给/user/get/{id}接口配置热点参数限流限制每个用户 ID 的 QPS 为 5。在接口上添加SentinelResource注解java运行GetMapping(/get/{id}) SentinelResource(value getUserById, blockHandler getUserByIdBlockHandler) public ResultUser getUserById(PathVariable Long id) { User user userService.findById(id); return Result.success(user); } // 限流后的处理方法 public ResultUser getUserByIdBlockHandler(Long id, BlockException e) { return Result.fail(429, 请求过于频繁请稍后再试); }在 Sentinel 控制台配置热点参数规则资源名getUserById参数索引0第一个参数单机阈值5统计窗口时长1 秒现在每个用户 ID 每秒最多只能访问 5 次这个接口超过的请求会被限流。4.4 系统自适应保护系统自适应保护从系统整体维度进行保护它会监控系统的 CPU 使用率、负载、QPS、平均响应时间和并发线程数当系统指标达到阈值时自动限制所有入口流量保证系统的稳定性。在 Sentinel 控制台左侧菜单点击 系统规则就可以配置系统保护规则。五、高级特性规则持久化默认情况下Sentinel 的规则是存储在客户端内存中的当客户端重启后所有规则都会丢失。这在生产环境是完全不可行的。Sentinel 支持多种规则持久化方式Nacos、Apollo、ZooKeeper、MySQL 等。其中最常用的是 Nacos。第一步引入依赖xmldependency groupIdcom.alibaba.csp/groupId artifactIdsentinel-datasource-nacos/artifactId /dependency第二步配置 Nacos 数据源在application.yml中添加 Nacos 数据源配置yamlspring: cloud: sentinel: datasource: ds1: nacos: server-addr: localhost:8848 dataId: user-service-sentinel-flow-rules groupId: DEFAULT_GROUP rule-type: flow # 流量控制规则 ds2: nacos: server-addr: localhost:8848 dataId: user-service-sentinel-degrade-rules groupId: DEFAULT_GROUP rule-type: degrade # 熔断降级规则第三步在 Nacos 中配置规则在 Nacos 控制台创建对应的配置文件写入规则的 JSON 格式。比如流量控制规则json[ { resource: /user/get, limitApp: default, grade: 1, count: 10, strategy: 0, controlBehavior: 0, clusterMode: false } ]现在Sentinel 会自动从 Nacos 拉取规则并且当规则发生变化时会自动同步到客户端。六、生产环境常见坑与最佳实践坑 1限流不生效常见原因资源名写错了没有添加SentinelResource注解规则没有正确配置客户端没有连接到控制台解决方案检查资源名是否和代码中的一致确保添加了SentinelResource注解检查规则配置是否正确检查客户端和控制台的网络连通性坑 2熔断降级不生效常见原因异常被捕获了没有抛出熔断阈值设置不合理最小请求数设置太大解决方案确保异常能够被 Sentinel 捕获根据实际业务情况合理设置熔断阈值最小请求数不要设置太大一般设置为 5-10坑 3热点参数限流不生效常见原因没有添加SentinelResource注解参数索引写错了参数是基本类型的包装类没有正确识别解决方案必须添加SentinelResource注解检查参数索引是否正确对于包装类参数确保参数不为 null坑 4规则持久化不生效常见原因没有引入对应的数据源依赖Nacos 配置信息写错了规则的 JSON 格式错误解决方案确保引入了正确的数据源依赖检查 Nacos 的地址、dataId、groupId 是否正确验证规则的 JSON 格式是否正确最佳实践资源命名规范使用统一的资源命名规范比如类名.方法名合理设置阈值根据压测结果设置合理的阈值不要凭感觉设置统一异常处理自定义限流和熔断的异常处理返回友好的错误信息结合网关使用在网关层统一配置流量控制规则避免每个服务都配置一遍开启监控告警监控 Sentinel 的限流次数、熔断次数、异常数等指标及时发现问题灰度发布规则新规则先在测试环境验证然后灰度发布到生产环境避免过度保护不要给所有接口都加限流和熔断只给核心接口和容易出问题的接口加定期优化规则根据系统的运行情况定期调整规则阈值总结Sentinel 是微服务架构中不可或缺的流量治理组件它就像系统的 保险丝能在故障发生时自动切断故障链路保护系统不被拖垮。服务雪崩是微服务架构的致命威胁Sentinel 是解决这个问题的最佳方案Sentinel 的核心概念包括资源、规则、流量控制、熔断降级和热点参数限流Spring Boot 整合 Sentinel 非常简单只需要引入依赖和配置支持流量控制、熔断降级、热点参数限流、系统保护等多种功能生产环境必须配置规则持久化避免规则丢失遵循最佳实践避开常见的坑让你的系统更加稳定可靠