Spring Boot 3中@LoadBalanced修饰的RestTemplate报错解决方案咨询
关于 RestTemplate 的可用性
RestTemplate 在 Spring Boot 3.x 中并未被废弃,官方虽推荐 WebClient 作为异步客户端,但 RestTemplate 仍可正常使用,维护模式下完全无需强制替换。
报错根源
Spring Boot 3.x 对应 Spring Cloud 2022.0.x(Kilburn 版本),该版本彻底移除了已废弃的 Ribbon 负载均衡器,改用 Spring Cloud LoadBalancer 作为默认实现。若项目缺少 LoadBalancer 依赖,或 RestTemplate 配置未适配新的负载均衡逻辑,就会出现找不到服务实例的情况,抛出 java.lang.IllegalArgumentException: Service Instance cannot be null。
解决方案
1. 引入正确的 LoadBalancer 依赖
如果使用 Maven,在 pom.xml 中添加:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
如果使用 Gradle:
implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
若项目之前引入过 Ribbon 依赖,需排除避免冲突:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <exclusions> <exclusion> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </exclusion> </exclusions> </dependency>
2. 修正 RestTemplate 配置
确保配置类中正确定义带负载均衡的 RestTemplate 实例:
import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class RestConfig { @Bean @LoadBalanced public RestTemplate loadBalancedRestTemplate() { return new RestTemplate(); } // 若需要不带负载均衡的实例,可单独定义 @Bean public RestTemplate regularRestTemplate() { return new RestTemplate(); } }
使用时通过 @Qualifier 指定注入的实例:
@Autowired @Qualifier("loadBalancedRestTemplate") private RestTemplate loadBalancedRestTemplate;
3. 确认服务发现与调用逻辑
- 确保服务已成功注册到注册中心(如 Eureka、Nacos),注册中心配置无错误
- 调用服务时必须使用服务名称而非具体 IP+端口,示例:
// 正确:通过服务名调用,触发负载均衡 String response = loadBalancedRestTemplate.getForObject("http://USER-SERVICE/api/users", String.class); // 错误:直接使用IP端口,不会触发负载均衡 // String response = regularRestTemplate.getForObject("http://192.168.1.100:8080/api/users", String.class);
4. 排查自动配置开关
确保未禁用 LoadBalancer 自动配置:
# 请勿添加此配置,否则会关闭负载均衡自动配置 # spring.cloud.loadbalancer.enabled=false
若自定义负载均衡策略,需适配 Spring Cloud LoadBalancer 的 API,而非 Ribbon 的旧接口。
总结
维护模式下完全可以继续使用 RestTemplate,只需补充 LoadBalancer 依赖、修正配置方式,即可恢复 @LoadBalanced 的负载均衡功能,解决服务实例找不到的报错。
内容的提问来源于stack exchange,提问作者Suchit Khadtar

