Понимание порога самосохранения и обновления Spring Cloud Eureka Server


83

Я новичок в разработке микросервисов, хотя какое-то время изучаю их, читая как документы Spring, так и Netflix.

Я начал простой проект, доступный на Github . По сути, это сервер Eureka (Archimedes) и три клиентских микросервиса Eureka (один публичный API и два частных). Ознакомьтесь с подробным описанием в файле readme на github.

Дело в том, что, когда все работает, я бы хотел, чтобы в случае уничтожения одного из частных микросервисов сервер Eureka распознал его и удалял его из реестра.

Я нашел этот вопрос в Stackoverflow , и решение проходит с использованием enableSelfPreservation:falseконфигурации Eureka Server. После этого убитая служба исчезнет, ​​как и ожидалось.

Однако я вижу следующее сообщение:

РЕЖИМ САМОСЕРВАЦИИ ВЫКЛЮЧЕН. ЭТО МОЖЕТ НЕ ЗАЩИТИТЬ СРОК СРОКА ИНСТАНЦИИ В СЛУЧАЕ СЕТИ / ДРУГИХ ПРОБЛЕМ.

1. Какова цель самосохранения? В документе указано, что с самосохранением «клиенты могут получать экземпляры, которые больше не существуют» . Итак, когда рекомендуется включать / выключать его?

Кроме того, когда самосохранение включено, вы можете получить выдающееся сообщение в предупреждении консоли Eureka Server:

ЧРЕЗВЫЧАЙНАЯ СИТУАЦИЯ! EUREKA МОЖЕТ БЫТЬ НЕПРАВИЛЬНО ПРЕТЕНЗИВАЕТСЯ ОБ ИСПОЛЬЗОВАНИИ ЭКЗАМЕНОВ, КОГДА ИХ НЕТ ПРОДЛЕНИЕ ДЕЙСТВИТЕЛЬНО МЕНЬШЕ, ЧЕМ ПОРОГ, И ПОТОМУ ЧТО ЭКЗЕМПЛЯРЫ НЕ ИМЕЮТ ИСКЛЮЧЕНИЕ ТОЛЬКО ДЛЯ БЕЗОПАСНОСТИ.

Теперь перейдем к консоли Spring Eureka.

Lease expiration enabled    true/false
Renews threshold    5
Renews (last min)   4

Я столкнулся со странным поведением порогового значения: когда я запускаю только сервер Eureka, порог равен 1.

2. У меня один сервер Eureka, и он настроен registerWithEureka: falseтаким образом, чтобы он не регистрировался на другом сервере. Тогда почему это отображается в счетчике порога?

3. Для каждого клиента, которого я запускаю, пороговое значение увеличивается на +2. Я думаю, это потому, что они отправляют 2 сообщения о продлении в минуту, я прав?

4. Сервер Eureka никогда не отправляет обновления, поэтому последние минимальные обновления всегда ниже порогового значения. Это нормально?

renew threshold 5
rewnews last min: (client1) +2 + (client2) +2 -> 4

Серверный cfg:

server:
  port: ${PORT:8761}

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    enableSelfPreservation: false
#   waitTimeInMsWhenSyncEmpty: 0

Клиент 1 cfg:

spring:
  application:
    name: random-image-microservice

server:
  port: 9999

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
    healthcheck:
      enabled: true

3
Я хочу найти время, чтобы ответить на этот вопрос. Это трудно. Некоторые ответы находятся в коде Netflix, а другие - в конфигурации. Я хочу, чтобы мой ответ был частью документации Spring Cloud, но, скорее всего, он будет после Дня Благодарения, если мои коллеги не ответят до этого.
spencergibb

Это небольшой фон из Netflix: github.com/Netflix/eureka/wiki/…
spencergibb

Вот еще немного предыстории: github.com/spring-cloud/spring-cloud-netflix/issues/373
spencergibb

8
@spencergibb, это приближается к 9 месяцам, а ответа нет .. какие-либо данные?
Ник

1
@spencergibb Прошло уже больше года. Есть ли еще шанс получить четкий ответ в любое время? Какой-то рождественский подарок :)
OcuS 05

Ответы:


63

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

Каждому экземпляру необходимо продлить аренду Eureka Server с частотой один раз в 30 секунд, которую можно определить в eureka.instance.leaseRenewalIntervalInSeconds .

Обновления (последние мин.) : показывает, сколько обновлений было получено от экземпляра Eureka за последнюю минуту.

Порог обновления : количество обновлений, которые сервер Eureka ожидает получить от экземпляра Eureka в минуту.

Например, если registerWithEurekaустановлено значение false , eureka.instance.leaseRenewalIntervalInSecondsустанавливается значение 30 и запускается 2 экземпляра Eureka. Два экземпляра Eureka будут отправлять 4 обновления на сервер Eureka в минуту, минимальный порог для сервера Eureka равен 1 (записан в коде), поэтому порог равен 5 (это число будет умножаться на коэффициентeureka.server.renewalPercentThreshold который будет обсуждаться позже).

РЕЖИМ САМОСОХРАНЕНИЯ : если количество продлений (последняя минута) меньше порога продления , будет активирован режим самосохранения.

Таким образом, в верхнем примере активирован РЕЖИМ САМОСОХРАНЕНИЯ, поскольку порог равен 5, но сервер Eureka может получать только 4 обновления в минуту.

  1. Вопрос 1:

РЕЖИМ САМОСОХРАНЕНИЯ разработан, чтобы избежать сбоя плохого сетевого подключения. Связь между экземплярами Eureka A и B хорошая, но B не может продлить аренду сервера Eureka за короткий период из-за сбоев подключения, в настоящее время сервер Eureka не может просто удалить экземпляр B. Если это так, экземпляр A не получит доступную зарегистрированную услугу с сервера Eureka, несмотря на доступность B. В этом и состоит цель РЕЖИМА САМОСОХРАНЕНИЯ, и его лучше включить.

  1. Вопрос 2:

Минимальный порог 1 прописан в коде. registerWithEurekaустановлено значение false, поэтому регистров экземпляра Eureka не будет, порог будет равен 1.

В производственной среде мы обычно развертываем два сервера Eureka, и для них registerWithEurekaбудет установлено значение true. Таким образом, порог будет 2, и сервер Eureka будет продлевать аренду себе дважды в минуту, так RENEWALS ARE LESSER THAN THRESHOLDчто проблем не будет.

  1. Вопрос 3:

Да ты прав. eureka.instance.leaseRenewalIntervalInSecondsопределяет, сколько обновлений отправляется на сервер в минуту, но умножает eureka.server.renewalPercentThresholdупомянутый выше коэффициент , значение по умолчанию - 0,85.

  1. Вопрос 4:

Да, это нормально, потому что начальное значение порога установлено равным 1. Итак, если registerWithEureka установлено значение false, количество обновлений всегда ниже порога.

У меня есть два предложения по этому поводу:

  1. Разверните два сервера Eureka и включите registerWithEureka .
  2. Если вы просто хотите развернуть в среде demo / dev, вы можете установить eureka.server.renewalPercentThresholdзначение 0,49, поэтому, когда вы запускаете только сервер Eureka, порог будет равен 0.

Привет, Не Син, знаете ли вы, что означает этикетка: «
Срок

Привет, @jabrena, я думаю, это означает, что срок аренды истечет, если экземпляр не продлит аренду на сервер eureka. Это может быть связано с eureka.instance.leaseExpirationDurationInSeconds, значение которого по умолчанию составляет 90 секунд. Если вы установите для этого значения 0 или отрицательное число, метка может измениться на «Lease expiration enabled: False». Вы можете попробовать.
Не Син


Не работает. Threshold = 0, Renews = 0 по-прежнему вызывает предупреждение.
SledgeHammer

Я отключил режим selfPreservationMode, но по-прежнему получаю это сообщение на Eureka - EUREKA МОЖЕТ БЫТЬ НЕПРАВИЛЬНО ЗАЯВЛЯЮЩИМСЯ НА ЭКЗЕМПЛЯРЫ, ЕСЛИ ИХ НЕТ. ПРОДЛЕНИЕ ДЕЙСТВИТЕЛЬНО МЕНЬШЕ, ЧЕМ ПОРОГ, И ПОЭТОМУ ЭКСПЛУАТАЦИИ НЕ ИМЕЮТСЯ СРОКА ДЕЙСТВИЯ, ТОЛЬКО ДЛЯ БЕЗОПАСНОСТИ. Так не должно быть, правда?
DHRUV BANSAL,

31

Я создал сообщение в блоге с подробностями об Eureka здесь , которое восполняет некоторые недостающие детали из Spring doc или блога Netflix. Это результат нескольких дней отладки и изучения исходного кода. Я понимаю, что предпочтительнее копировать и вставлять, а не ссылаться на внешний URL-адрес, но содержимое слишком велико для ответа SO.


2
Спасибо за ссылку на такой уточняющий пост. Рекомендуемое чтение !!
созависимый

2
Привет, @Abhijit Sarkar, статья потрясающая. Я решил многие сомнения в конфигурации.
jabrena

0

Вы можете попробовать установить предел порога продления в свойствах вашего сервера eureka. Если у вас есть от 3 до 4 микросервисов для регистрации на eureka, вы можете установить это следующим образом:

eureka.server.renewalPercentThreshold=0.33
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.