负载均衡器不包含该服务的实例
Load balancer does not contain an instance for the service
我想通过 spring-cloud-starter-loadbalancer
使用 Eureka 客户端。但是当我添加配置时,我得到了错误。当我删除 @LoadBalancerClient(name = "mail-service", configuration = LoadBalancerConfiguration.class)
和 LoadBalancerConfiguration
class 配置时,它工作正常。我试过这段代码:
@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
你知道可能是什么问题吗?
任何使用负载均衡器的应用程序都应遵循以下顺序
- 启动尤里卡服务器
- 一个一个启动有依赖的Service实例
任何应用程序都依赖于来自服务注册表(即 Eureka)的信息。在应用程序通过 serviceId 注册到它的实例之前,Eureka 服务器将无法在负载平衡时选择该实例。
在您分享的代码中,bean ServiceInstanceListSupplier 在配置 class 中与健康检查一起创建(.withHealthChecks() )。这导致应用程序失败,因为尚未注册服务。
此外,LoadBalancer 配置不应在 @Configuration 注释的 class 中,它应该是通过 @LoadBalancerClient 或 @LoadBalancerClients 注释为配置传递的 class,如所述here.
您唯一需要实例化的 bean 是 ServiceInstanceListSupplier(如果您添加 spring-cloud-starter-loadbalancer,LoadBalancerClientFactory 等将由启动器本身实例化)。
所以您的 LoadBalancer 配置 class 应该类似于下面的代码。
不应该在@Configuration class:
public class LoadBalancerConfiguration {
@Bean
public ServiceInstanceListSupplier instanceSupplier(ConfigurableApplicationContext context) {
return ServiceInstanceListSupplier.builder()
.withDiscoveryClient()
.withHealthChecks()
.build(context);
}
}
如本 link 中所述,实际的 @Configuration class 将具有以下注释:@LoadBalancerClients(defaultConfiguration = LoadBalancerConfiguration .class).
然后,如果您在实例中启用 health-checks,它应该可以正常工作。
我想通过 spring-cloud-starter-loadbalancer
使用 Eureka 客户端。但是当我添加配置时,我得到了错误。当我删除 @LoadBalancerClient(name = "mail-service", configuration = LoadBalancerConfiguration.class)
和 LoadBalancerConfiguration
class 配置时,它工作正常。我试过这段代码:
@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
你知道可能是什么问题吗?
任何使用负载均衡器的应用程序都应遵循以下顺序
- 启动尤里卡服务器
- 一个一个启动有依赖的Service实例
任何应用程序都依赖于来自服务注册表(即 Eureka)的信息。在应用程序通过 serviceId 注册到它的实例之前,Eureka 服务器将无法在负载平衡时选择该实例。
在您分享的代码中,bean ServiceInstanceListSupplier 在配置 class 中与健康检查一起创建(.withHealthChecks() )。这导致应用程序失败,因为尚未注册服务。
此外,LoadBalancer 配置不应在 @Configuration 注释的 class 中,它应该是通过 @LoadBalancerClient 或 @LoadBalancerClients 注释为配置传递的 class,如所述here.
您唯一需要实例化的 bean 是 ServiceInstanceListSupplier(如果您添加 spring-cloud-starter-loadbalancer,LoadBalancerClientFactory 等将由启动器本身实例化)。
所以您的 LoadBalancer 配置 class 应该类似于下面的代码。 不应该在@Configuration class:
public class LoadBalancerConfiguration {
@Bean
public ServiceInstanceListSupplier instanceSupplier(ConfigurableApplicationContext context) {
return ServiceInstanceListSupplier.builder()
.withDiscoveryClient()
.withHealthChecks()
.build(context);
}
}
如本 link 中所述,实际的 @Configuration class 将具有以下注释:@LoadBalancerClients(defaultConfiguration = LoadBalancerConfiguration .class).
然后,如果您在实例中启用 health-checks,它应该可以正常工作。