启动spring gateway网关服务报错 Unable to find GatewayFilterFactory with name RequestRateLimiter
解决:启动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搜索大量资料之后没有找到解决方案,还是要自己亲自去跟踪分析源码,一步步排查相关类的初始化过程和类的依赖关系的。
更多推荐
所有评论(0)