Эврика определяет статус службы

Контекст

Мы используем Spring Cloud Netflix с Eureka в качестве службы обнаружения и Zuul для проксирования служб и балансировки нагрузки.

Микросервисы реализованы с помощью NodeJS и зарегистрированы в Eureka с помощью модуля NPM eureka-js-client и настраиваемый слой между ними, который обрабатывает конфигурацию и все, что является общим для всех микросервисов.


Проблема

Проблема в том, что Eureka не распознает отказ одной службы. Это проблема, поскольку у нас есть инфраструктура разработки с автоматическим развертыванием, которое каждый раз повторно развертывает и перезапускает микросервисы на разных портах без перезапуска Eureka (и Zuul).

Поэтому через некоторое время у нас есть десять или более экземпляров одного микросервиса, из которых работает только один, но все они распознаются как UP.


Подход к решению

  1. Я попытался установить heartbeatInterval на клиенте меньше, но это не помогает.

  2. Я попытался установить renewalThresholdUpdateIntervalMs на сервере меньше, но это тоже не помогает.

  3. Еще много разочаровывающих, бесполезных попыток собственности…


Вопрос

Как настроить Eureka для исключения экземпляров или установки статуса DOWN для экземпляров, которые не отправляют пульс в разумное время (не 30 минут или около того)?


Фрагменты кода

Сам сервер не содержит упоминаемого кода (всего несколько аннотаций для запуска сервера Eureka с помощью Spring Cloud Starter).

Конфигурация сервера Эврика (я удалил все нерабочие попытки):

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
    }
}

person Fabian Damken    schedule 24.08.2016    source источник


Ответы (1)


через некоторое время у нас есть десять или более экземпляров одного микросервиса, из которых только один работает, но все они распознаются как работающие.

У Эврики есть режим самосохранения. Где, если регистрируется менее 85% тактов экземпляров, он не будет вытеснять какие-либо экземпляры. Вы должны увидеть предупреждение на приборной панели eureka.

person spencergibb    schedule 24.08.2016
comment
Ок, когда включаю режим самосохранения, сервисы выселяются корректно. Можно ли ускорить выселение? В настоящее время удаление сервисов занимает около 2-3 минут. Также: Можно ли отключить предупреждение об отключении режима самосохранения? - person Fabian Damken; 24.08.2016
comment
Вы можете настроить время выселения, не могу сказать вам собственность, по моему телефону. Не могу отключить предупреждение. - person spencergibb; 25.08.2016
comment
Теперь я изменил eureka.leaseInfo.renewalIntervalInSecs на 10 и eureka.leaseInfo.durationInSecs на 20, а интервал сердцебиения - на 5 секунд. Это ускоряет вытеснение службы. - Спасибо за Вашу поддержку! - person Fabian Damken; 25.08.2016