You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3中@LoadBalanced修饰的RestTemplate报错解决方案咨询

Spring Boot 3.x 中 @LoadBalanced RestTemplate 报错 "Service Instance cannot be null" 解决方案

关于 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:24:59