负载均衡器不包含该服务的实例

2023-12-24

我想使用 Eureka 客户端spring-cloud-starter-loadbalancer。但是当我添加配置时出现错误。当我删除时@LoadBalancerClient(name = "mail-service", configuration = LoadBalancerConfiguration.class) and 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);
    }
}

应用程序.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]

我使用发布火车版本:2020.0.3

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


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

  1. 启动尤里卡服务器
  2. 逐个启动具有依赖关系的Service实例

任何应用程序都依赖于服务注册表(即 Eureka)中的信息。直到应用程序通过其实例注册服务ID,Eureka 服务器在负载均衡时将无法选择该实例。

在您共享的代码中,bean服务实例列表供应商与健康检查一起在配置类中创建(.withHealthChecks())。这导致应用程序失败,因为服务尚未注册。

另外,LoadBalancer 配置不应该位于 @Configuration 注解的类中,它应该是通过 @LoadBalancerClient 或 @LoadBalancerClients 注释传递配置的类,如上所述here https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#custom-loadbalancer-configuration.

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

因此,您的 LoadBalancer 配置类应类似于以下代码。它不应该在@配置 class:

public class LoadBalancerConfiguration {

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

}

正如本节中所解释的link https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#custom-loadbalancer-configuration,实际的 @Configuration 类,将具有以下注释:@LoadBalancerClients(defaultConfiguration = LoadBalancerConfiguration .class).

然后,如果您启用健康检查在这种情况下,它应该可以毫无问题地工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

负载均衡器不包含该服务的实例 的相关文章

随机推荐