启动spring gateway网关服务报错 Unable to find GatewayFilterFactory with name RequestRateLimiter

网上查了很多资料,提供的解决方案就是排查下面2点:

1、检查application.yml的配置, 限流配置我是从spring gateway官网拷贝修改的,没问题。

2、检查maven配置,pom.xml中已经添加了
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
    <version>2.4.4</version>
</dependency>

 经过以上排查,启动还是报标题上的错误,根据日志里报错代码的位置,跟踪源码发现报错位置在 org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#loadGatewayFilters方法的(GatewayFilterFactory)this.gatewayFilterFactories.get(definition.getName())这一行代码,如图

definition.getName()的值为RequestRateLimiter,而this.gatewayFilterFactories中确实没有RequestRateLimiterGatewayFilterFactory类,因而报错。

继续跟踪调试源码,发现xxxGatewayFilterFactory的bean初始化是在GatewayAutoConfiguration中实现的,而RequestRateLimiterGatewayFilterFactory也在此类中,但是它的初始化有一些依赖条件。

RequestRateLimiterGatewayFilterFactory的初始化依赖到RateLimiter了,而RateLimiter是接口类型,它的实现为RedisRateLimiter,而RedisRateLimiter的初始化又依赖到了ReactiveStringRedisTemplate。

经过研究发现,ReactiveStringRedisTemplate是响应式/反应式编程方式访问redis的,ReactiveStringRedisTemplate初始化又依赖到了ReactiveRedisConnectionFactory工厂类,此工厂类的初始化在spring框架中只有lettuce模式支持,jedis模式不支持,研究到此,终于找到报错的原因了,application.yml中我配置的redis相关配置为jedis模式,需要改为lettuce模式。修改后配置如下:

redis:
  database: 0
  timeout: 3000
  client-type: lettuce
  cluster:
    nodes: xxx
    max-redirects: 7
  lettuce:
    pool:
      max-active: 500
      max-wait: -1
      max-idle: 50
      min-idle: 100
      time-between-eviction-runs: 180000

记录以上问题的排查跟踪过程,希望对遇到同样问题的小伙伴有所帮助。

结束语:开发过程中遇到问题,如果google,bing搜索大量资料之后没有找到解决方案,还是要自己亲自去跟踪分析源码,一步步排查相关类的初始化过程和类的依赖关系的。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值