问题
线上的sentinel 在测试压测时候可以正常被限流 但是在正常的流量中 发现被限流的接口很少 (我发誓肯定都配置了限流规则)
约定
文中的 服务名称以及地址 都被改写了
排查步骤
1.检查相关配置 以及 pom依赖配置 发现SentinelGatewayFilter 重复配置
2.猜测可能是配置没有进行初始化 或者初始化存在问题 去掉相关的配置初始化 直接使用sentinel -dashboard 进行配置
3.部署并搭建dashborad 添加相关配置 (spring.cloud.sentinel.transport.dashboard=localhost:8888
),使服务启动注册到sentinel-dashboard中 访问 localhost:8888 (默认是端口8080 可以在启动时候指定 java -Dserver.port=8888 -jar ./sentinel-dashboard-1.8.6.jar &) 需要登录 默认账号密码 都是sentinel 效果如下
4.在流控规则中 添加具体的流控配置 因为我们没有配置API 所以只有 根据routeId 配置
5.接下来使用 压测工具进行 压测 发现限流规则 并没有生效
6.开始漫长的寻找不生效原因
。。。。。。。。。。。。。。
7.后来找到 可能是版本原因 升级 如下组件的版本
com.alibaba.cloud spring-cloud-starter-alibaba-sentinel 2.2.1.RELEASE com.alibaba.cloud spring-cloud-alibaba-sentinel-gateway 2.2.0.RELEASE8.后来 因为其他的版本不兼容问题 只能整理升级 springboot springcloud springcloud-alibaba
于是根据 spring-cloud-alibaba 官方提供的版本说明 进行了 版本 升级 官方版本说明地址 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
目前使用的版本
spring cloud alibaba 2.2.7.RELEASE
spring cloud Hoxton.SR12
spring boot 2.3.12.RELEASE
9.升级过后,首先去掉 代码中 sentinel 的重复配置 同时在nacos的限流配置中 仅保留一个接口的限流配置 同时增加 nacos中 sentinel 相关的配置
10.启动 使用jmter 压测 发现限流生效了
后续的改进
去掉配置的 异常拦截 (旧的配置中定义了 ErrorWebExceptionHandler 处理器) 使用sentinel的拦截配置
调整多个过滤器的顺序 (异常处理器→限流拦截器→全局日志拦截器 ->cat 链路->cat过滤)
官方网关限流文档: https://sentinelguard.io/zh-cn/docs/api-gateway-flow-control.html
阿里巴巴cloud官方文档 : https://github.com/alibaba/spring-cloud-alibaba/blob/2022.x/spring-cloud-alibaba-docs/src/main/asciidoc-zh/sentinel.adoc
后记 以下两个问题 也耽误了很久
问题1. 配置了某个服务的某个接口 限流规则 导致某个服务的其他的接口 也被限流
有问题的配置 {“resource”:“mall_service”,“apiDefinitions”:[{“matchStrategy”:0,“pattern”:“/mall-service/entry/scene/xxx”}],“count”:10,“intervalSec”:1,“controlBehavior”:0}
问题表现 在请求 /该服务下另一个接口 也被限流 sspmall-service/client/points/user/balance
解决办法
指定resource 名称为 特殊的名称 而不是微服务的名称
指定resorceMode=1 含义是 使用自定义API限流
正确的配置
{“resource”:“mall_service_entry_scene_xxx”,“resourceMode”:1,“apiDefinitions”:[{“matchStrategy”:0,“pattern”:“/mall-service/entry/scene/xxx”}],“count”:10,“intervalSec”:1,“controlBehavior”:0}
resource是 同一个自定义API组的名称 以及 限流规则中使用的 自定义API组名称
问题二 本地部署的 dashboard 和 test环境部署的dashboard 采集的链路不一致
本地部署的效果图
测试环境上的效果图
注意观察 一个是叫 请求链路 一个叫做簇点链路 还有资源名 想差很大 同时 当簇点链路为测试环境中的时 接口的限流将失效
本地部署在自己电脑上 同时服务也是在idea中运行
test环境dashboard 部署在服务器(java -jar方式) 而应用是部署在k8s环境中 同时 dashboard和 应用通信的端口不同
解决办法: 测试环境中的dashboard 也部署到和应用相同的k8s环境里
误区 因为看到 测试环境中的链路 和 zuul 集成 sentinel的时候 链路一样 导致一直在找 zuul是否被生效了 而忽略了 dashboard请求 gateway-service 端口不同 导致链路采集有误
the end
三年过年没回家了 明天将踏上回家路
新春快乐