| 第一步:创建配置类这个类不要加? @Configuration 注解,或者把这个配置类放在启动类外面的包,@SpringBootApplication 包的外面。下面以nacos提供的根据权重的负载均衡策略配置为例。 官方说明:Cloud Native Applications  
  
 | The classes you pass as? @LoadBalancerClient?or?@LoadBalancerClients?configuration arguments should either not be annotated with?@Configuration?or be outside component scan scope. | 
 package com.myitsite.orderservice.conifg;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.loadbalancer.NacosLoadBalancer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.loadbalancer.core.ReactorServiceInstanceLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
public class MyLoadBalancerConfig {
    @Autowired
    private NacosDiscoveryProperties nacosDiscoveryProperties;
    //自定义loadBlancer负载均衡策略
    @Bean
    public ReactorServiceInstanceLoadBalancer reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        //返回随机轮询负载均衡方式
        //return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name)
        //返回加权随机轮询负载均衡方式
        //return new RoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
        //nacos服务注册中心权重的负载均衡策略
        return new NacosLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name,nacosDiscoveryProperties);
    }
}
 第二步:启动类上配置服务使用的负载均衡策略?第一种情况:针对这个版本,如果配置类在扫描包里面,加上@Configuration时,使用到的服务必须都在启动类上配置@LoadBalancerClients,没有配置的服务,调用会报错。 //假设项目中使用了2个服务,stock-service和product-service
//都配置好不会报错
@LoadBalancerClients(value = {
        @LoadBalancerClient(name = "stock-services",configuration = MyLoadBalancerConfig.class),
        @LoadBalancerClient(name = "product-service",configuration = MyLoadBalancerConfig.class)
})
//调用stock-service不会报错,调用product-service会报错
@LoadBalancerClients(value = {
        @LoadBalancerClient(name = "stock-services",configuration = MyLoadBalancerConfig.class)
})
 第二种情况(推荐):针对这个版本,如果配置类在扫描包里面,不加@Configuration时,启动类上配置@LoadBalancerClients,服务配置了负载均衡策略则使用配置好的策略,没配置的使用LoadBalancer默认的负载均衡策略。 第三种情况(推荐):针对这个版本,如果配置类在扫描包外面,加或者不加@Configuration都不影响,启动类上配置@LoadBalancerClients,服务配置了负载均衡策略则使用配置好的策略,没配置的使用LoadBalancer默认的负载均衡策略。 如果要自定义负载均衡策略,请参考别人的的文章:Spring Cloud Loadbalancer源码解析和自定义负载均衡策略实现 - 知乎 |