zhuangjie
ZhuangJie

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。

  • 解决办法

    1. 确保 pom 里排除掉 spring-cloud-starter-netflix-ribbon

    2. 统一用 spring-cloud-starter-loadbalancer

    3. Feign/RestTemplate 都基于 LoadBalancer,就不会再触发这个错误。

 

posted on 2025-09-11 22:40  zhuangjie  阅读(11)  评论(0)    收藏  举报