Spring-Cloud-Loadbalancer模块中有一个自动配置类,其中定义了默认的负载均衡器:

这个Bean上添加了@ConditionalOnMissingBean注解,也就是说如果我们自定义了这个类型的bean,则负载均衡的策略就会被改变。没有自定义时,默认采用轮询算法进行负载均衡。

在微服务中添加一个配置类

示例代码如下:

import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.loadbalancer.NacosLoadBalancer;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
public class OpenFeignConfig {
    @Bean
    public ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(
            Environment environment, NacosDiscoveryProperties properties,
            LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new NacosLoadBalancer(
                loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name, properties);
    }
}

配置生效

这个配置类不要加 @Configuration 注解,若配置类加 @Configuration 并被扫描,会强制全局生效,所有 Feign 客户端只能用这一种策略,无法为不同服务定制
@LoadBalancerClients 指定配置,既能设为全局默认(对所有远程服务生效),也能针对特定服务单独配置不同策略
好处是灵活,比如调用服务 A 用 Nacos 负载均衡,调用服务 B 用随机策略,通过这种方式能精准控制,避免策略冲突,适应不同服务的调用需求。

我们要在启动类上通过注解来声明这个配置。
有两种做法:

  • 全局配置:对所有服务生效
@LoadBalancerClients(defaultConfiguration = OpenFeignConfig.class)
  • 局部配置:只对某个服务生效
@LoadBalancerClients({
        @LoadBalancerClient(value = "item-service", configuration = OpenFeignConfig.class)
})

当前该负载均衡算法只会在当前微服务调用item-service时生效

觉得上面的内容有用吗?快来点个赞吧!

点赞() 我要打赏

温馨提示 : 本站内容来自会员投稿以及互联网,所有源码及教程均为作者总结编辑,请大家在使用过程中提前做好备份,以免发生无法预知的错误,源码类教程请勿直接用于生产环境!

 可能感兴趣的文章