最近在进行spring cloud gateway 整合 sentinel 在此过程中遇到的问题进行汇总
1. spring gateway 整合sentinel gateway的路由会自动加一个前缀 效果如下
问题原因 代码在 org.springframework.cloud.gateway.discovery.DiscoveryClientRouteDefinitionLocator#DiscoveryClientRouteDefinitionLocator(java.lang.String, org.springframework.cloud.gateway.discovery.DiscoveryLocatorProperties)
断点的结果
问题原因:会进行判断是否存在路由前缀 不存在则进行 拼接
问题的解决办法:增加配置
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
lowerCaseServiceId: true
#需要新增的配置
routeIdPrefix: xx_
后续需要注意: 根据routeId限流时 要配置 前缀+项目名称 如上这种写法需要配置的routeId 为 xx_gateway-service
问题二 sentinel流控规则里阀值不生效
从1.6.3版本开始,Sentinel Web filter默认收敛所有URL的入口context,因此链路限流不生效。1.7.0版本开始(对应SCA 2.1.1.RELEASE),我们在CommonFilter引入了WEB_CONTEXT_UNIFY这个init parameter,用于控制是否收敛context。将其配置为false即可根据不同的URL进行链路限流。 参考:https://github.com/alibaba/sentinel/issues/1213
官方文档: https://sentinelguard.io/zh-cn/docs/api-gateway-flow-control.html
问题三 服务注册不到sentinel dashboard
- 这个注册默认有点慢 需要等等
- 单个应用的话 可以检查 用户目录下的日志文件 用户目录/logs/csp 看看有无对应服务的日志 另外 可以看下 sentinel 启动日志 确保sentinel 可以访问到
- 另外加上如下配置 尝试一下
spring:
cloud:
sentinel:
eager: true
- 如上都没有解决的话 检查下 sentinel client和服务端版本是否 一致
可能存在版本不兼容问题 - 可能用户无权限 写入日志到用户目录下 默认会写入日志到用户目录下
问题四 异常处理器失效的问题
- 检查 默认的异常处理器 有无生效
启动会进行打印日志
2023-01-11 14:24:55.892 INFO [main] [,,,] c.a.c.s.gateway.scg.SentinelSCGAutoConfiguration.sentinelGatewayFilter - [Sentinel SpringCloudGateway] register SentinelGatewayFilter with order: -2147483648
2023-01-11 14:24:56.186 INFO [main] [,,,] c.a.c.s.gateway.scg.SentinelSCGAutoConfiguration.sentinelGatewayBlockExceptionHandler - [Sentinel SpringCloudGateway] register SentinelGatewayBlockExceptionHandler
- 检查是否压测方式以及断言有问题
当使用Aoifox进行压测 发现居然100% 成功
后来修改为 jmter 才发现正常的
问题五 限流无法生效
可能有的博客说 注:SpringBoot版本大于 2.2.0 以及小于 2.3.1才可以,超过这个版本Sentinel网关限流将不生效;这个说法不一定准 可能存在一定的道理
spring boot spring cloud 以及 spring cloud alibaba 版本很关键 建议直接使用 官方的版本说明
官方的版本说明 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
传送图 如下 根据springboot版本来匹配
目前使用生效的版本
spring boot : 2.3.12.RELEASE spring cloud: Hoxton.SR12
spring cloud alibaba: Hoxton.SR12
spring gateway 整合sentinel 官方文档 : https://sentinelguard.io/zh-cn/docs/api-gateway-flow-control.html
--------------------------------------------------2023-01-18-----------------------------------------------------------
问题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 端口不同 导致链路采集有误