Java 为什么豆子是';反应器服务安装负载平衡器';当方法';getInstance';叫什么名字?

Java 为什么豆子是';反应器服务安装负载平衡器';当方法';getInstance';叫什么名字?,java,spring-cloud-gateway,spring-cloud-loadbalancer,Java,Spring Cloud Gateway,Spring Cloud Loadbalancer,我试图通过接口ReactorServiceInstanceLoadBalancer来定义自定义负载平衡器,以替换RoundRobinLoadBalancer定义的默认负载平衡器 但它不起作用 我发现“LoadBalancerClientConfiguration”类中定义的原始bean在应用程序启动时没有实例化,而是在调用“LoadBalancerClientFactory.getInstance”时实例化,并且构造函数与StandardEnvironment的bean自动连接,而在我的配置中定

我试图通过接口ReactorServiceInstanceLoadBalancer来定义自定义负载平衡器,以替换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);
    }
}
`@Slf4j
公共类CustomLoadBalancer实现ReactorServiceInstanceLoadBalancer{
//…细节省略
}
@配置(proxyBeanMethods=false)
@已启用条件障碍
公共类CustomLoadBalancerClientConfiguration{
@豆子
公共反应器负载平衡器反应器服务安装负载平衡器(环境环境,负载平衡器客户端工厂负载平衡器客户端工厂,服务实例选择服务实例选择){
字符串名称=loadBalancerClientFactory.getName(环境);
返回新的CustomLoadBalancer(serviceInstanceChooser,loadBalancerClientFactory.getLazyProvider(名称,ServiceInstanceListSupplier.class),名称);
}
}

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

感谢您的回答!我以前尝试过LoadBalancerClient和LoadBalancerClient的注释,但仍然不起作用。我的代码中的bean“reactorServiceInstanceLoadBalancer”总是在启动时立即实例化。我知道源代码有一个LoadBalancerClientFactory,它扩展名为dcontextFactory,并为每个客户端创建一个LoadBalancer beanserviceId,但当我编写相同的代码时,它不起作用。所以我想知道它是如何工作的。很难说没有看到更多的代码。您能否创建一个最小的、可复制的示例(),在SpringCloudCommons中创建一个新的GitHub问题并将其链接到那里?我认为最简单的项目,甚至像SpringCloudGateway的基准测试,都可以复制我的问题。这只是spring-cloud-loadbalancer-2.2.4.RELEASE.jar中的源代码,我在调试中找到了它。请参阅:org.springframework.cloud.loadbalancer.annotation.LoadBalancerClientConfiguration#reactorServiceInstanceLoadBalancer.What's work?为什么您的bean只是通过调用方法LoadBalancerClientFactory#getInstance进行实例化,而环境的依赖关系是StandardWebEnvironment的瞬间,而不是我上面代码中的StandardReactiveWebEnvironment的瞬间。我的项目是一个简单的网关,依赖于spring-boot-2.3.2.RELEASE和spring-cloud-Hoxton.SR7,包括spring cloud starter loadbalancer。您已经写过,您无法覆盖配置,但是,我们和许多社区用户在使用loadbalancer时经常这样做,因此代码示例将有助于理解为什么它在您的场景中不起作用。很可能,如链接文档中所述,解决问题的方法是使用
@LoadBalancerClient
注释传递自定义配置,而不是用
@Configuration
标记该类。我想用我的CustomLoadBalancer替换默认的RoundRobinLoadBalancer。