路由隔离后的版本权重功能如何设计
在 微服务负载均衡的增强-微服务中的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 是执行负载均衡需要的调度器,它的私有范围是默认的,也就是不能被继承,所以用继承此类的方式就不行了,所以要是重新创建个类重写里面的逻辑,其实也就是新增个方法