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

Spring Cloud LoadBalancerClient自定义配置未生效默认用轮询如何解决

解决方案

你的自定义负载均衡策略未生效是三个常见配置错误导致的,按以下步骤修正即可:

1. 修正自定义负载均衡配置类

如果该配置是针对特定服务生效,不要让它被主启动类的@ComponentScan扫描到(避免变成全局配置),类本身无需额外加注解:

public class CustomLoadBalancerConfiguration {

    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                            LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory
                .getLazyProvider(name, ServiceInstanceListSupplier.class),
                name);
    }
}

2. 绑定自定义配置到指定服务

在你的Spring Boot启动类或者全局配置类上,添加@LoadBalancerClient注解,把自定义配置和你要调用的eventService绑定:

@SpringBootApplication
// 单个服务绑定用@LoadBalancerClient,多个服务用@LoadBalancerClients批量配置
@LoadBalancerClient(name = "eventService", configuration = CustomLoadBalancerConfiguration.class)
public class YourApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}

如果你希望这个随机负载均衡策略全局生效(所有调用的服务都用),只需要给CustomLoadBalancerConfiguration加@Configuration注解,并且放在主启动类的扫描路径下即可,不需要加@LoadBalancerClient注解。

3. 修正RestTemplate的配置

@LoadBalanced注解必须搭配@Bean使用才会生效,你当前直接在类属性上加注解、自己实例化RestTemplate的写法是无效的,按以下方式修改:

3.1 新增RestTemplate配置类

@Configuration
public class RestTemplateConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

3.2 修改Client类的RestTemplate注入方式

public class Client {
    @Autowired
    private LoadBalancerClient loadBalancerClient;

    // 直接注入配置好的RestTemplate,不要自行实例化
    @Autowired
    private RestTemplate restTemplate;

    private String getBaseUrl() {
        ServiceInstance serviceInstance = loadBalancerClient.choose("eventService");
        System.out.println(serviceInstance);
        return serviceInstance.getUri().toString();
    }
   
    @GetMapping("/all")
    public String getAll() throws JsonProcessingException {
        String url = getBaseUrl()+"/xx";
        return restTemplate.getForObject(url, String.class);
    }
}

修正完成后重启服务,调用接口即可看到负载均衡已经切换为随机策略。

内容的提问来源于stack exchange,提问作者Hans95

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:45:04