spring cloud gateway 整合sentinel使用过程使用遇到的问题

最近在进行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 端口不同 导致链路采集有误

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值