zl程序教程

您现在的位置是:首页 >  Java

当前栏目

【已解决】Requested bean is currently in creation: Is there an unresolvable circular reference?

2023-02-18 16:31:06 时间

在sentinel整合Feign的时候错误提示:循环依赖问题

【已解决】sentinel整合feign出现spring的bean循环依赖问题

在正常情况下order服务调用user服务正常。引入feign后将调用feign相关的抽取到了feign-api项目中.然后启动就报错。错误信息如下:

事故现场回顾:

使用的时候sentinel整合Feign.order和user服务之前使用feign调用正常。在整合sentinel的时候,出现上图问题。

sentinel整合Feign步骤:

一:在服务调用方的配置文件中添加feign开启sentinel服务

本案例中是order调用user服务。所以,也就是需要在order服务的application.yml添加:

feign:
  sentinel:
    enabled: true # 开启feign对sentinel的支持

二:编写失败降级逻辑

业务失败后,不能直接报错,而应该返回用户一个友好提示或者默认结果,这个就是失败降级逻辑。

给FeignClient编写失败后的降级逻辑

①方式一:FallbackClass,无法对远程调用的异常做处理

②方式二:FallbackFactory,可以对远程调用的异常做处理,我们选择这种

这里我们演示方式二的失败降级处理。

三:在feing-api项目中的UserClient接口中使用UserClientFallbackFactory

四:启动类上添加如下:

重启服务,然后就报错了。

从网上查询,有说bean的加载顺序错误。修改后就可以了。如下图:

凯哥也这么来,不行。

还有说对应的server添加@Lazy注解,让其延时加载。如下图:

难道无解决办法了吗?

先来看看凯哥的服务版本:

Spring Boot 版本为:2.3.8.RELEASE

Spring Cloud 版本为:Hoxton.SR10

Spring Cloud Alibaba 版本为:2.2.5.RELEASE

Spring Cloud Gateway:2.2.5.RELEASE

我们去spring官网https://spring.io/projects/spring-cloud 查找spring cloud Hoxton版本对应关系:

找到对应的Hoxton.SR10对应各个版本依赖:

我们可以看到,虽然Hoxton.SR10对spring boot的支持是2.2.x<spring boot<2.3.x

凯哥使用的是spring boot的2.3.5版本符合当前SR10的要求。BUT,SR10的GateWay支持的版本是2.2.7.RELEASE。可是凯哥使用的GateWay版本是2.2.5.RELEASE。版本对应不上啊。噗噗。(一口老血喷出啊~~~)

那么,接着在spring 官网找到支持GateWay是2.2.5的。发现SR8是支持的。如下图:

果断换上试试。

刷新maven依赖后,重启服务。一起OK。

小总结:

spring cloud的版本及对应的spring Boot\GateWay等其他组件的版本关系,最好以官网的为准。不然,就会像凯哥这样,浪费一两个小时。ε=(´ο`*)))唉