跳到主要内容

路由隔离后的版本权重功能如何设计

在 微服务负载均衡的增强-微服务中的LoadBalancer策略增强 此章节,讲解了在自定义增强的配置类 WorkLoadBalancerClientConfiguration 上添加了 @AutoConfigureBefore 注解,来替换掉原有的配置类 LoadBalancerClientConfiguration 作用是替换掉原有的负载均衡的bean

而在此章节,我们先看下原有 LoadBalancerClientConfiguration 中的一个bean

@Configuration(proxyBeanMethods = false)
@ConditionalOnDiscoveryEnabled
public class LoadBalancerClientConfiguration {

private static final int REACTIVE_SERVICE_INSTANCE_SUPPLIER_ORDER = 193827465;

@Bean
@ConditionalOnMissingBean
public ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new RoundRobinLoadBalancer(
loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
}
//其他省略... ...
}

这个bean中逻辑就是原有的负载均衡逻辑,我们要紧贴着原有的负载均衡逻辑之前,执行 link-flow 的版本权重功能,所以要替换到这个bean,我们来看下结果

RoundRobinLoadBalancer

public class RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer {

private static final Log log = LogFactory.getLog(RoundRobinLoadBalancer.class);

final AtomicInteger position;

final String serviceId;

ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;

/**
* @param serviceInstanceListSupplierProvider a provider of
* {@link ServiceInstanceListSupplier} that will be used to get available instances
* @param serviceId id of the service for which to choose an instance
*/
public RoundRobinLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider,
String serviceId) {
this(serviceInstanceListSupplierProvider, serviceId, new Random().nextInt(1000));
}

/**
* @param serviceInstanceListSupplierProvider a provider of
* {@link ServiceInstanceListSupplier} that will be used to get available instances
* @param serviceId id of the service for which to choose an instance
* @param seedPosition Round Robin element position marker
*/
public RoundRobinLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider,
String serviceId, int seedPosition) {
this.serviceId = serviceId;
this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;
this.position = new AtomicInteger(seedPosition);
}
}

serviceInstanceListSupplierProvider 是执行负载均衡需要的调度器,它的私有范围是默认的,也就是不能被继承,所以用继承此类的方式就不行了,所以要是重新创建个类重写里面的逻辑,其实也就是新增个方法