Я новичок в разработке микросервисов, хотя какое-то время изучаю их, читая как документы 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
источник
Ответы:
У меня был тот же вопрос, что и у @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 обновления в минуту.
РЕЖИМ САМОСОХРАНЕНИЯ разработан, чтобы избежать сбоя плохого сетевого подключения. Связь между экземплярами Eureka A и B хорошая, но B не может продлить аренду сервера Eureka за короткий период из-за сбоев подключения, в настоящее время сервер Eureka не может просто удалить экземпляр B. Если это так, экземпляр A не получит доступную зарегистрированную услугу с сервера Eureka, несмотря на доступность B. В этом и состоит цель РЕЖИМА САМОСОХРАНЕНИЯ, и его лучше включить.
Минимальный порог 1 прописан в коде.
registerWithEureka
установлено значение false, поэтому регистров экземпляра Eureka не будет, порог будет равен 1.В производственной среде мы обычно развертываем два сервера Eureka, и для них
registerWithEureka
будет установлено значение true. Таким образом, порог будет 2, и сервер Eureka будет продлевать аренду себе дважды в минуту, такRENEWALS ARE LESSER THAN THRESHOLD
что проблем не будет.Да ты прав.
eureka.instance.leaseRenewalIntervalInSeconds
определяет, сколько обновлений отправляется на сервер в минуту, но умножаетeureka.server.renewalPercentThreshold
упомянутый выше коэффициент , значение по умолчанию - 0,85.Да, это нормально, потому что начальное значение порога установлено равным 1. Итак, если
registerWithEureka
установлено значение false, количество обновлений всегда ниже порога.У меня есть два предложения по этому поводу:
registerWithEureka
.eureka.server.renewalPercentThreshold
значение 0,49, поэтому, когда вы запускаете только сервер Eureka, порог будет равен 0.источник
Я создал сообщение в блоге с подробностями об Eureka здесь , которое восполняет некоторые недостающие детали из Spring doc или блога Netflix. Это результат нескольких дней отладки и изучения исходного кода. Я понимаю, что предпочтительнее копировать и вставлять, а не ссылаться на внешний URL-адрес, но содержимое слишком велико для ответа SO.
источник
Вы можете попробовать установить предел порога продления в свойствах вашего сервера eureka. Если у вас есть от 3 до 4 микросервисов для регистрации на eureka, вы можете установить это следующим образом:
eureka.server.renewalPercentThreshold=0.33
источник