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


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

Я начал простой проект доступно на Github. Это в основном сервера Эврика (Архимед) и три Юрика микрослужб клиента (один общедоступный API и два частных). Проверьте readme github для получения подробного описания.

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

Я нашел этот вопрос на StackOverflow, и решение проходит с помощью enableSelfPreservation:false в конфигурации сервера Eureka. Делая это через некоторое время убитый сервис исчезает, как и ожидалось.

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

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

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

кроме того, когда самосохранение включено, вы можете получить выдающееся сообщение в консоли сервера 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
2 60

2 ответа:

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

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

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

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

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

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

таким образом, в верхнем примере активируется режим самосохранения, потому что порог равен 5, но сервер Eureka может получать только 4 обновления/мин.

  1. Вопрос 1:

режим самосохранения конструкция для того чтобы во избежание плохая сеть сбой подключения. Связь между Эврика экземпляр A и B-это хорошо, но б не удалось обновить аренду в Эврика-сервер в течение короткого периода за счет подключения икоты, в это время Эврика-сервер не может просто выгнать экземпляр B. Если это так, экземпляр не будет вам доступна зарегистрированным обслуживание от Эврика-сервер, несмотря на B доступна. Так что это цель режима самосохранения, и лучше его включить.

  1. вопрос 2:

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

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

  1. Вопрос 3:

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

  1. Вопрос 4:

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

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

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

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