网上查了很多资料,提供的解决方案就是排查下面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搜索大量资料之后没有找到解决方案,还是要自己亲自去跟踪分析源码,一步步排查相关类的初始化过程和类的依赖关系的。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐