第一步:创建配置类
这个类不要加? @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源码解析和自定义负载均衡策略实现 - 知乎
|