Контекст
Мы используем Spring Cloud Netflix с Eureka в качестве службы обнаружения и Zuul для проксирования служб и балансировки нагрузки.
Микросервисы реализованы с помощью NodeJS и зарегистрированы в Eureka с помощью модуля NPM eureka-js-client и настраиваемый слой между ними, который обрабатывает конфигурацию и все, что является общим для всех микросервисов.
Проблема
Проблема в том, что Eureka не распознает отказ одной службы. Это проблема, поскольку у нас есть инфраструктура разработки с автоматическим развертыванием, которое каждый раз повторно развертывает и перезапускает микросервисы на разных портах без перезапуска Eureka (и Zuul).
Поэтому через некоторое время у нас есть десять или более экземпляров одного микросервиса, из которых работает только один, но все они распознаются как UP
.
Подход к решению
Я попытался установить
heartbeatInterval
на клиенте меньше, но это не помогает.Я попытался установить
renewalThresholdUpdateIntervalMs
на сервере меньше, но это тоже не помогает.Еще много разочаровывающих, бесполезных попыток собственности…
Вопрос
Как настроить 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
}
}