【问题标题】:Load balancer does not contain an instance for the service负载均衡器不包含服务的实例
【发布时间】:2021-08-29 09:27:37
【问题描述】:

我想将 Eureka 客户端与 spring-cloud-starter-loadbalancer 一起使用。但是当我添加配置时,我得到了错误。当我删除 @LoadBalancerClient(name = "mail-service", configuration = LoadBalancerConfiguration.class)LoadBalancerConfiguration 类配置时,它工作正常。我试过这段代码:

    @FeignClient(name = "mail-service")
    @LoadBalancerClient(name = "mail-service", configuration = LoadBalancerConfiguration.class)
    public interface EmailClient {
    
        @RequestMapping(method = RequestMethod.POST, value = "/engine/emails/register")
        void setUserRegistration(CreateUserDTO createUserDTO);
    }


@Configuration
public class LoadBalancerConfiguration {

    @Bean
    public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(ConfigurableApplicationContext context) {
        return ServiceInstanceListSupplier.builder()
                .withBlockingDiscoveryClient()
                .withSameInstancePreference()
                .withHealthChecks()
                .build(context);
    }
}

application.yml:

feign:
    client:
        config:
            default:
                connectTimeout: 5000
                readTimeout: 5000
                loggerLevel: basic
eureka:
    client:
        serviceUrl:
            defaultZone: ${EUREKA_URI:http://localhost:8761/eureka}
        fetchRegistry: true
        healthcheck:
            enabled: true
    instance:
        preferIpAddress: true
        leaseRenewalIntervalInSeconds: 10

POM.xml 依赖项

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>com.netflix.eureka</groupId>
        <artifactId>eureka-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>

当我只有一个目标服务时出现此错误。

[503] during [POST] to [http://mail-service/engine/emails/register] [EmailClient#setUserRegistration(CreateUserDTO)]: [Load balancer does not contain an instance for the service mail-service]

我使用 Release Train 版本:2020.0.3

你知道可能是什么问题吗?

【问题讨论】:

  • 从 LoadBalancerConfiguration 中移除 @Configuration
  • 我删除了它,但我遇到了同样的问题。
  • 我删除了.withHealthChecks(),现在它可以工作了。也许配置丢失或这是一个错误?
  • 很遗憾问题没有解决。如果我以相反的顺序或随机顺序启动 Web 服务,则不会传播有关主机的数据。知道如何解决这个问题吗?

标签: spring spring-cloud netflix-eureka spring-cloud-loadbalancer


【解决方案1】:

任何使用负载均衡器的应用程序都应遵循以下顺序

  1. 启动 Eureka 服务器
  2. 有依赖的Service实例一个一个启动

任何应用程序都依赖于来自服务注册表(即 Eureka)的信息。在应用程序通过 serviceId 向其实例注册之前,Eureka 服务器将无法在负载平衡时选择该实例。

在您共享的代码中,bean ServiceInstanceListSupplier 与运行状况检查(.withHealthChecks())一起在配置类中创建。这导致应用程序失败,因为服务尚未注册。

此外,LoadBalancer 配置不应位于带有@Configuration 注释的类中,而应是通过@LoadBalancerClient 或@LoadBalancerClients 注释传递给配置的类,如here 所述。

您需要实例化的唯一bean是ServiceInstanceListSupplier(如果您添加spring-cloud-starter-loadbalancer,LoadBalancerClientFactory等将由启动器本身实例化)。

因此,您的 LoadBalancer 配置类应如下面的代码所示。 它不应该在 @Configuration 类中

public class LoadBalancerConfiguration {

@Bean
public ServiceInstanceListSupplier instanceSupplier(ConfigurableApplicationContext context) {
    return ServiceInstanceListSupplier.builder()
            .withDiscoveryClient()
            .withHealthChecks()
            .build(context);
}

}

正如link 中所述,实际的@Configuration 类将具有以下注释:@LoadBalancerClients(defaultConfiguration = LoadBalancerConfiguration .class).

然后,如果您在实例中启用 health-checks,它应该可以正常工作。

【讨论】:

    猜你喜欢
    • 2021-04-03
    • 2021-08-18
    • 2018-12-17
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多