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
相关产品推荐
相关产品推荐

