背景
为保障系统的稳定性和高可用性,需引入流量控制与熔断降级机制。通过集成阿里开源的Sentinel,实现对下游系统调用的精细化流量管理,
具体包括:
1. 限流保护:根据下游服务的承受能力,配置QPS或并发线程数阈值,避免突发流量压垮下游系统。
2. 熔断降级:当下游响应时间超过阈值或异常比例激增时,自动触发熔断策略,快速返回预设降级结果(如缓存数据、默认值或友好提示),避免资源耗尽。
3. 实时监控:通过Sentinel Dashboard可视化监控接口流量与熔断状态,便于及时调整策略。
该方案将显著提升渠道中台系统的容错能力,确保核心业务链路的高可用,同时为下游服务提供过载保护,实现系统间的良性协作
版本选型
Spring boot版本:2.6.9
Spring cloud 版本:2021.0.3
Spring cloud Alibaba版本:2021.0.1.0
Spring cloud Gateway版本: 3.1.x
大家可以根据自己系统的版本去选型,版本跨度大的话可能会有bug
以gateway网关举例
结合官方文档分析,Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流
Sentinel 1.6.0 引入了 Sentinel API Gateway Adapter Common 模块,此模块中包含网关限流的规则和自定义 API 的实体和管理逻辑:
· GatewayFlowRule:网关限流规则,针对 API Gateway 的场景定制的限流规则,可以针对不同 route 或自定义的 API 分组进行限流,支持针对请求中的参数、Header、来源 IP 等进行定制化的限流。
· ApiDefinition:用户自定义的 API 定义分组,可以看做是一些 URL 匹配的组合。比如我们可以定义一个 API 叫 my_api,请求 path 模式为 /foo/** 和 /baz/** 的都归到 my_api 这个 API 分组下面。限流的时候可以针对这个自定义的 API 分组维度进行限流。
简述实施方案
Sentinel Dashboard(控制台)默认情况下,只能将配置规则保存到内存中,这样就会导致 Sentinel Dashboard 重启后配置规则丢失的情况,因此我们需要将规则保存到某种数据源中
然而,默认情况下,Sentinel 和nacos之间的关系是单向数据通讯的,也就是只能先在数据源中配置规则,然后数据源会被规则推送至 Sentinel Dashboard 和 Sentinel 客户端,但是在 Sentinel Dashboard 中修改规则或新增规则是不能反向同步到数据源中的。
所以我们需要修改一下 Sentinel 的源码,让其可以同步规则至数据源,改造之后的交互流程如下图所示:
1. 在 Dashboard 创建规则 → 保存到 Nacos
2. Nacos 通知所有订阅的客户端
3. 客户端从 Nacos 拉取最新规则
4. 客户端每秒上报指标到 Dashboard
5. Dashboard 从 Nacos 获取规则展示
- 源码可根据官网建议及网上资料去修改,不懂可私信我,大致流程配置nacos参数,实现推拉到nacos。
集成步骤
1. liunx部署并启动sentinel控制台
java -jar C:\Users\zhuxiao\Desktop\sentinel-dashboard-1.8.6.jar(路径为jar包所在路径)
2. 项目导入相关依赖jar包
集成sentinel工具
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
配置网关流控规则
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>
3.yml配置(持久化到nacos中)
4. 网关做流量控制
配置SentinelGatewayFilter,以router维度配置限流规则
配置SentinelGatewayBlockExceptionHandler,处理由 SentinelGatewayFilter 抛出的 BlockException(即流量控制触发的拦截)