Понимание 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 ответа:
я получил тот же вопрос, что и @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:
режим самосохранения конструкция для того чтобы во избежание плохая сеть сбой подключения. Связь между Эврика экземпляр A и B-это хорошо, но б не удалось обновить аренду в Эврика-сервер в течение короткого периода за счет подключения икоты, в это время Эврика-сервер не может просто выгнать экземпляр B. Если это так, экземпляр не будет вам доступна зарегистрированным обслуживание от Эврика-сервер, несмотря на B доступна. Так что это цель режима самосохранения, и лучше его включить.
- вопрос 2:
минимальный порог 1 записывается в коде.
registerWithEureka
имеет значение false, поэтому регистров экземпляров Eureka не будет, пороговое значение будет равно 1.в производственной среде, как правило, мы развертываем два сервера Eureka и
registerWithEureka
будет установлено значение true. Так что порог будет 2, а Эврика сервер будет продлевать аренду себе дважды в минуту, так чтоRENEWALS ARE LESSER THAN THRESHOLD
не будет проблемой.
- Вопрос 3:
Да, вы право.
eureka.instance.leaseRenewalIntervalInSeconds
определяет, сколько обновлений отправляется на сервер в минуту, но это умножит коэффициентeureka.server.renewalPercentThreshold
упомянуто выше, значение по умолчанию-0.85.
- Вопрос 4:
Да, это нормально, потому что пороговое начальное значение равно 1. Так что если
registerWithEureka
имеет значение false, renews всегда ниже порога.у меня есть два предложения для этого:
- разверните два сервера Eureka и включите
registerWithEureka
.- если вы просто хотите развернуть в среде demo / dev, вы можете установить
eureka.server.renewalPercentThreshold
до 0.49, поэтому, когда вы запускаете только сервер Eureka, порог будет равен 0.
Я создал сообщение в блоге с подробностями Эврика здесь, что заполняет некоторые недостающие детали из Spring doc или блога Netflix. Это результат нескольких дней отладки и копания в исходном коде. Я понимаю, что предпочтительнее копировать-вставлять, а не ссылаться на внешний URL-адрес, но контент слишком велик для ответа SO.