1

我试图通过实现接口 ReactorServiceInstanceLoadBalancer 来定义自定义 LoadBalancer,以替换 RoundRobinLoadBalancer 定义的默认负载均衡器。

但它不起作用。

我发现类'LoadBalancerClientConfiguration'中定义的原始bean在应用程序启动时没有被实例化,而是在调用'LoadBalancerClientFactory.getInstance'时被实例化,并且构造函数是使用StandardEnvironment的bean自动装配的,而在我的配置中定义的bean在应用程序启动时实例化,并使用 StandardReactiveWebEnvironment 的 bean 自动装配。

很困惑!我的英语不太好。感谢您阅读整个描述!下面是我的代码:

    `@Slf4j
public class CustomLoadBalancer implements ReactorServiceInstanceLoadBalancer {
    // ...detail omitted
}

@Configuration(proxyBeanMethods = false)
@ConditionalOnDiscoveryEnabled
public class CustomLoadBalancerClientConfiguration {
    @Bean
    public ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory, ServiceInstanceChooser serviceInstanceChooser) {
        String name = loadBalancerClientFactory.getName(environment);
        return new CustomLoadBalancer(serviceInstanceChooser, loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }
}
4

1 回答 1

2

根据请求创建一个单独的上下文,包括ReactorServiceInstanceLoadBalancer实例serviceId。可以提供您自己的实现,无论是默认实现还是特定服务。请参阅有关如何为 Spring Cloud LoadBalancer 提供自定义配置的文档。

于 2020-10-22T11:47:54.513 回答