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>
具体原因:
👉 你的项目用了 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,就不会再触发这个错误。
-