Spring Cloud 2022中LoadBalancer与Feign Client兼容性问题
问题:升级Spring Boot 3.1.3后自定义Feign负载均衡失效
把项目升级到Spring Boot 3.1.3(对应Spring Cloud 2022.0.3)后,用Feign Client结合Spring LoadBalancer实现的自定义负载均衡规则失效了,具体情况:
@FeignClient里指定的CustomRequestInterceptorConfigurationBean能正常实例化@LoadBalancerClient里的CustomLoadBalancerConfigurationBean完全没被实例化,导致自定义逻辑跑不起来,只能用Spring默认的轮询算法
相关代码如下:
Feign Client定义
@LoadBalancerClient(name = "example-service", configuration = CustomLoadBalancerConfiguration.class) @FeignClient(name = "example-service", configuration = CustomRequestInterceptorConfiguration.class) public interface ExampleServiceClient { }
自定义负载均衡配置类
@Slf4j public class CustomLoadBalancerConfiguration { @Bean public ReactorServiceInstanceLoadBalancer customLoadBalancer() { // 自定义负载均衡逻辑 } }
当前依赖配置:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2022.0.3</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> <version>4.0.3</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>4.0.3</version> </dependency>
查了Spring Cloud 2022的发布说明,里面提到“AsyncRestTemplate已在Spring Framework 6中移除,因此LoadBalancer的自动配置已被移除”,想问:新版本是不是弃用了@LoadBalancerClient和Feign Client结合的用法?还是我漏了什么配置?
解决方案与说明
@LoadBalancerClient根本没被弃用,只是Spring Cloud 2022(适配Spring Boot 3.x)里负载均衡的自动配置逻辑变了,你得把配置类的加载方式弄对。核心问题:配置类的包位置
- 如果你的
CustomLoadBalancerConfiguration所在的包被Spring Boot主类的@ComponentScan扫到了,会导致这个配置全局生效,反而破坏了和指定Feign Client的绑定逻辑,自然不会按预期实例化。 - 正确操作:把
CustomLoadBalancerConfiguration放到主类扫描范围之外的包下面,别让Spring提前把它当成全局Bean加载了。
- 如果你的
确认Feign和LoadBalancer的绑定关系
- 确保
@LoadBalancerClient的name和@FeignClient的name完全一致,这样才能绑定到同一个服务的实例池里。 - 你已经引入了
spring-cloud-starter-loadbalancer,这步没问题,但可以检查下spring.cloud.loadbalancer.enabled配置是不是true(默认是true,要是被手动关了肯定失效)。
- 确保
换个方式:直接用Feign的配置属性统一管理
没必要分开加两个注解,直接把负载均衡配置放到@FeignClient的configuration里就行,省得搞两个注解的加载问题:@FeignClient(name = "example-service", configuration = {CustomRequestInterceptorConfiguration.class, CustomLoadBalancerConfiguration.class}) public interface ExampleServiceClient { }同样要注意:
CustomLoadBalancerConfiguration不能在主扫描包下,或者给它加个@Configuration(proxyBeanMethods = false),防止变成全局配置。排查小技巧
- 启动项目时开DEBUG日志,搜
LoadBalancerClientFactory相关的日志,看看有没有为example-service创建专属上下文,并且加载了你的CustomLoadBalancerConfiguration。 - 检查有没有其他负载均衡相关的依赖(比如Ribbon),要是不小心引入了会和Spring LoadBalancer冲突,得排除掉。
- 启动项目时开DEBUG日志,搜
内容的提问来源于stack exchange,提问作者rockyg
相关产品推荐
相关产品推荐

