Eureka检测服务状态

Eureka detect service status

上下文

我们正在使用 Spring Cloud Netflix,Eureka 作为服务发现,Zuul 用于代理服务和负载平衡。

微服务是使用 NodeJS 实现的,并使用 NPM 模块 eureka-js-client 在 Eureka 注册,其间的自定义层处理所有微服务通用的配置和内容。


问题

问题是 Eureka 无法识别某项服务是否出现故障。这是一个问题,因为我们有一个具有自动部署的开发基础设施,每次都在不同端口上重新部署和重启微服务,而无需重启 Eureka(和 Zuul)。

因此,一段时间后我们有一个微服务的十个或更多实例,其中只有一个在运行,但所有实例都被识别为正在运行 UP


解决方法

  1. 我尝试将客户端上的 heartbeatInterval 设置得较小,但这没有帮助。

  2. 我尝试将服务器上的 renewalThresholdUpdateIntervalMs 设置得更小,但这也无济于事。

  3. 更多令人沮丧、毫无帮助的 属性 尝试……


问题

如何配置 Eureka 驱逐实例或将状态设置为 DOWN 在合理的时间内(不是 30 分钟左右)不发送心跳的实例?


代码片段

服务器本身不包含可提及的代码(只是使用 Spring Cloud Starter 启动 Eureka 服务器的一些注释)。

Eureka服务器的配置(我已经去掉了所有不工作的尝试):

server:
  port: 8761

spring:
  cloud:
    client:
      hostname: localhost

eureka:
  instance:
    address: 127.0.0.1
    hostname: ${spring.cloud.client.hostname}

发送到服务器的客户端配置(使用eureka-js-client):

{
    instance : {
        instanceId : `${CONFIG.instance.address}:${CONFIG.instance.name}:${CONFIG.instance.port}`,
        app : CONFIG.instance.name,
        hostName : CONFIG.instance.host,
        ipAddr : CONFIG.instance.address,
        port : {
            '$' : CONFIG.instance.port,
            '@enabled' : true
        },
        homePageUrl : `http://${CONFIG.instance.host}:${CONFIG.instance.port}/`,
        statusPageUrl : `http://${CONFIG.instance.host}:${CONFIG.instance.port}/info`,
        healthCheckUrl : `http://${CONFIG.instance.host}:${CONFIG.instance.port}/health`,
        vipAddress : CONFIG.instance.name,
        secureVipAddress : CONFIG.instance.name,
        dataCenterInfo : {
            '@class' : 'com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo',
            name : 'MyOwn'
        }
    },
    eureka : {
        host : CONFIG.eureka.host,
        port : CONFIG.eureka.port,
        servicePath : CONFIG.eureka.servicePath || '/eureka/apps/',
        healthCheckInterval : 5000
    }
}

after a while we have ten or more instances of one microservice where only one is up but all are recognized as beeing UP.

Eureka 有一个 'self preservation' 模式。如果少于 85% 的实例心跳正在注册,它不会驱逐任何实例。您应该能够在 eureka 仪表板上看到警告。