最近升级springboot3真是一挖一个坑,又给我发现了 spring-cloud-gateway 引入 openfeign 会导致循环依赖异常,特此记录一下这个坑
一、发现问题
网关里面有一个全局的过滤器,因为要查询一些配置信息,目前是通过 feign client 的方式来调用接口获取信息,一直运行正常。
在升级完 gateway 网关的依赖包后,打算运行一下项目,却发现过滤器里面报了循环依赖的异常。
之前运行得好好地,为什么升级依赖包以后会报异常呢?
二、分析问题
从上面图也能清楚地看到,就是A依赖B,B依赖C,C又依赖A,导致循环依赖,但是我项目里面只有一个 filter 过滤器,而且 feign client 的服务也只是注入调用了一个,怎么就出问题了呢。
1.翻查资料
于是翻查了一下github的 issue ,发现有人也遇到此类问题,如下图
好家伙,原来 gateway 里面的 filter 本身就不能使用 feign,而且时间是2019年的时候,那我之前为什么能用...
2.继续跟踪
刚好,给我发现了一篇文章,说到了这个类似的问题的原因,博主一步步debug源码分析,传送门
大致的问题出在框架本身、 feign client 加载 、过滤器加载顺序有关,导致最终被加载了两次,具体的分析方法文章博主也很详细的说明,在此就不再描述。
这里也有一篇文章是关于 GatewayAutoConfiguration 源码分析,有兴趣的也可以看一下。
三、解决问题
貌似这个问题无解,那总不能改用 web client 吧,于是找找有没有"偏门"的方法解决这个问题,最终还真找到一个简单的方式。
只要在 feign client 服务的加上 Lazy 注解,让其延迟注入,问题解决。