解决引入sentinel依赖时与SentinelWebAutoConfiguration循环依赖的问题

Bennett6 2024-08-09 09:03:02 阅读 70

解决引入sentinel依赖时与web依赖形成循环依赖的问题

最近在学习黑马的微服务课程,在学到Sentinel并引入相关依赖时发现出现了SentinelWebAutoConfiguration循环依赖的异常,在此小小记录一下解决问题方法:

在学习黑马微服务课程微服务保护机制,在购物车模块引入Sentinel的依赖,在重启微服务的过程中,出现如下错误:

<code>***************************

APPLICATION FAILED TO START

***************************

Description:

The dependencies of some of the beans in the application context form a cycle:

cartController defined in file [D:\JavaFrameworkAndProjectExercises\hmall\cart-sevice\target\classes\com\hmall\cart\controller\CartController.class]

cartServiceImpl

org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration

┌─────┐

| com.alibaba.cloud.sentinel.SentinelWebAutoConfiguration (field private java.util.Optional com.alibaba.cloud.sentinel.SentinelWebAutoConfiguration.sentinelWebInterceptorOptional)

└─────┘

Action:

Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.

这个错误提示表明在应用程序上下文中存在循环依赖。具体来说,‘cartController’ 依赖于 ‘cartServiceImpl’,而 ‘cartServiceImpl’ 又依赖于 ‘org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration’,形成了一个循环依赖关系。

为了解决这个问题,可以尝试以下方法:

检查并更新您的代码,确保没有循环依赖。这可能涉及到重构代码、更改注入方式(例如使用构造函数注入代替字段注入)等。

如果问题是由库的特定版本引起的,尝试更新到较新的版本,看看问题是否得到解决。

禁用Sentinel的自动配置。在application.properties文件中添加以下行:

spring.autoconfigure.exclude=com.alibaba.cloud.sentinel.SentinelWebAutoConfiguration

或者在application.yml文件中添加以下内容:

spring:

autoconfigure:

exclude: com.alibaba.cloud.sentinel.SentinelWebAutoConfiguration

这将禁用Sentinel的自动配置,从而避免循环依赖的问题。但请注意,这也意味着将无法使用Sentinel的流量控制和熔断降级功能。

作为最后的手段,可以设置spring.main.allow-circular-references属性为true,以允许循环引用。但是,请注意,这可能会导致难以调试的问题和意外的应用程序行为。在application.properties文件中添加以下行:

spring.main.allow-circular-references=true

或者在application.yml文件中添加以下内容:

spring:

main:

allow-circular-references: true

​ 5.禁用Sentinel的过滤器

spring:

sentinel:

filter:

enabled: false

在Spring Boot中,通过设置spring.sentinel.filter.enabled属性为false,可以禁用Sentinel的过滤器功能。这一配置直接影响到Sentinel的流量控制和熔断降级功能,因为这些特性通常依赖于过滤器来实施规则和管理流量。

最后这几种方法可能会对程序产生影响,或者会使Sentinel部分功能失效等,因此,都不是推荐的解决方案。

最好考虑版本兼容性寻找SpringBoot、SpringCloud、Spring Cloud Alibaba对应版本,减少bug的产生

以下是三者之间版本对应关系:

SpringBoot、SpringCloud、Spring Cloud Alibaba版本对应

由于 Spring Boot 3.0,Spring Boot 2.7~2.4 和 2.4 以下版本之间变化较大,目前企业级客户老项目相关 Spring Boot 版本仍停留在 Spring Boot 2.4 以下,为了同时满足存量用户和新用户不同需求,社区以 Spring Boot 3.0 和 2.4 分别为分界线,同时维护 2022.x、2021.x、2.2.x 三个分支迭代。如果不想跨分支升级,如需使用新特性,请升级为对应分支的新版本。 为了规避相关构建过程中的依赖冲突问题,可以通过 云原生应用脚手架 进行项目创建。

2022.x 分支

适配 Spring Boot 3.0,Spring Cloud 2022.x 版本及以上的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记): (注意,该分支 Spring Cloud Alibaba 版本命名方式进行了调整,未来将对应 Spring Cloud 版本,前三位为 Spring Cloud 版本,最后一位为扩展版本,比如适配 Spring Cloud 2022.0.0 版本对应的 Spring Cloud Alibaba 第一个版本为:2022.0.0.0,第个二版本为:2022.0.0.1,依此类推)

Spring Cloud Alibaba Version Spring Cloud Version Spring Boot Version
2022.0.0.0-RC2* Spring Cloud 2022.0.0 3.0.2
2022.0.0.0-RC1 Spring Cloud 2022.0.0 3.0.0

2021.x 分支

适配 Spring Boot 2.4,Spring Cloud 2021.x 版本及以上的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记):

Spring Cloud Alibaba Version Spring Cloud Version Spring Boot Version
2021.0.5.0* Spring Cloud 2021.0.5 2.6.13
2021.0.4.0 Spring Cloud 2021.0.4 2.6.11
2021.0.1.0 Spring Cloud 2021.0.1 2.6.3
2021.1 Spring Cloud 2020.0.1 2.4.2

2.2.x 分支

适配 Spring Boot 为 2.4,Spring Cloud Hoxton 版本及以下的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记):

Spring Cloud Alibaba Version Spring Cloud Version Spring Boot Version
2.2.10-RC1* Spring Cloud Hoxton.SR12 2.3.12.RELEASE
2.2.9.RELEASE Spring Cloud Hoxton.SR12 2.3.12.RELEASE
2.2.8.RELEASE Spring Cloud Hoxton.SR12 2.3.12.RELEASE
2.2.7.RELEASE Spring Cloud Hoxton.SR12 2.3.12.RELEASE
2.2.6.RELEASE Spring Cloud Hoxton.SR9 2.3.2.RELEASE
2.2.1.RELEASE Spring Cloud Hoxton.SR3 2.2.5.RELEASE
2.2.0.RELEASE Spring Cloud Hoxton.RELEASE 2.2.X.RELEASE
2.1.4.RELEASE Spring Cloud Greenwich.SR6 2.1.13.RELEASE
2.1.2.RELEASE Spring Cloud Greenwich 2.1.X.RELEASE
2.0.4.RELEASE(停止维护,建议升级) Spring Cloud Finchley 2.0.X.RELEASE
1.5.1.RELEASE(停止维护,建议升级) Spring Cloud Edgware 1.5.X.RELEASE

Spring Cloud Alibaba 组件版本关系

每个 Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本如下表所示(注意,Spring Cloud Dubbo 从 2021.0.1.0 起已被移除出主干,不再随主干演进):

Spring Cloud Alibaba Version Sentinel Version Nacos Version RocketMQ Version Dubbo Version Seata Version
2022.0.0.0-RC2 1.8.6 2.2.1 4.9.4 ~ 1.7.0-native-rc2
2021.0.5.0 1.8.6 2.2.0 4.9.4 ~ 1.6.1
2.2.10-RC1 1.8.6 2.2.0 4.9.4 ~ 1.6.1
2022.0.0.0-RC1 1.8.6 2.2.1-RC 4.9.4 ~ 1.6.1
2.2.9.RELEASE 1.8.5 2.1.0 4.9.4 ~ 1.5.2
2021.0.4.0 1.8.5 2.0.4 4.9.4 ~ 1.5.2
2.2.8.RELEASE 1.8.4 2.1.0 4.9.3 ~ 1.5.1
2021.0.1.0 1.8.3 1.4.2 4.9.2 ~ 1.4.2
2.2.7.RELEASE 1.8.1 2.0.3 4.6.1 2.7.13 1.3.0
2.2.6.RELEASE 1.8.1 1.4.2 4.4.0 2.7.8 1.3.0
2021.1 or 2.2.5.RELEASE or 2.1.4.RELEASE or 2.0.4.RELEASE 1.8.0 1.4.1 4.4.0 2.7.8 1.3.0
2.2.3.RELEASE or 2.1.3.RELEASE or 2.0.3.RELEASE 1.8.0 1.3.3 4.4.0 2.7.8 1.3.0
2.2.1.RELEASE or 2.1.2.RELEASE or 2.0.2.RELEASE 1.7.1 1.2.1 4.4.0 2.7.6 1.2.0
2.2.0.RELEASE 1.7.1 1.1.4 4.4.0 2.7.4.1 1.0.0
2.1.1.RELEASE or 2.0.1.RELEASE or 1.5.1.RELEASE 1.7.0 1.1.4 4.4.0 2.7.3 0.9.0
2.1.0.RELEASE or 2.0.0.RELEASE or 1.5.0.RELEASE 1.6.3 1.1.1 4.4.0 2.7.3 0.7.1


声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。