java.lang.AbstractMethodError: org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.choose(Ljava/lang/String;Lorg/springframework/cloud/client/loadbalancer/Request;)Lorg/springframework/cloud/client/ServiceInstance;
A调用B模块出现上面这个问题,那A模块需要移除 spring-cloud-starter-netflix-ribbon ,A 依赖common,而common依赖了spring-cloud-starter-netflix-ribbon ,所以需要排除掉
<dependency>
<groupId>com.atguigu.gulimail</groupId>
<artifactId>gulimail-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
根本原因是在common模块:
-
Spring Cloud 2021 已经移除了 Ribbon;
-
Spring Cloud Alibaba 2.1.0.RELEASE 还依赖 Ribbon;
应该换
Spring Cloud Alibaba 2021.0.5.0
具体原因:
👉 你的项目用了 Spring Cloud 2021(已经移除了 Ribbon),但是某个依赖又引入了 Ribbon 的类。
结果就是:
-
代码期望调用新接口
choose(String, Request), -
运行时加载到的是旧版 Ribbon 的类,只提供
choose(String), -
方法对不上,所以报
AbstractMethodError。
一句话:依赖里混进了 Ribbon,跟 Spring Cloud 版本不兼容。
总结
-
根本原因:Ribbon 已经被移除,但你的依赖里还引入了 Ribbon。
-
解决办法:
-
确保 pom 里排除掉
spring-cloud-starter-netflix-ribbon; -
统一用
spring-cloud-starter-loadbalancer; -
Feign/RestTemplate 都基于 LoadBalancer,就不会再触发这个错误。
-
浙公网安备 33010602011771号