Понимание Spring Сохранение и возобновление облачного сервера Cloud Eureka
Я новичок в разработке микросервисов, хотя я некоторое время изучал его, читая как документы Spring, так и Netflix.
Я начал простой проект доступный в Github. Это в основном сервер Eureka (Archimedes) и три клиентских микросервиса Eureka (один открытый API и два частных). Проверьте подробное описание github readme.
Дело в том, что когда все работает, я хотел бы, чтобы, если один из частных микросервисов был убит, сервер Eureka реализует и удаляет его из реестра.
I qaru.site/info/117709/..., и решение проходит с помощью enableSelfPreservation:false
в конфигурации Eureka Server. Выполняя это через некоторое время, убитая служба исчезает, как ожидалось.
Однако я вижу следующее сообщение:
РЕЖИМ САМОГО СОХРАНЕНИЯ ВЫКЛЮЧЕН. ЭТО МОЖЕТ НЕ ЗАЩИТИТЬ ИНСТАНС EXPIRY В СЛУЧАЕ СЕТИ/ДРУГИХ ПРОБЛЕМ.
1. Какова цель самосохранения? В документе doc указано, что при самосохранении на "клиенты могут получить экземпляры, которые больше не существуют". Итак, когда это целесообразно, чтобы включить/выключить?
Кроме того, когда самосохранение включено, вы можете получить сообщение об ошибке в предупреждении консоли Eureka Server:
EMERGENCY! EUREKA МОЖЕТ БЫТЬ НЕПРАВИЛЬНЫМИ ПРЕТЕНЗИЯМИ. ОНИ НЕ. ОБНОВЛЕНИЯ - МЕНЬШЕ, ЧЕМ ПОРОГ И ЛЮБОВЬ ИНСТАНЦИИ НЕ ДОЛЖНЫ БЫТЬ БЕЗОПАСНЫМИ.
Теперь, продолжая работу с Spring Eureka Console.
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
Ответы
Ответ 1
У меня был тот же вопрос, что и @codependent, я много гугл и сделал некоторый эксперимент, здесь я пришел, чтобы внести некоторые сведения о том, как работает сервер и экземпляр Eureka.
Каждый экземпляр должен возобновить аренду до Eureka Server с частотой одного раза в 30 секунд, что можно определить в eureka.instance.leaseRenewalIntervalInSeconds
.
Renews (последний мин.): показывает, сколько обновлений получено от экземпляра Eureka в последнюю минуту
Порог обновления: обновляется, что сервер Eureka ожидает от экземпляра Eureka в минуту.
Например, если для параметра registerWithEureka
установлено значение false, eureka.instance.leaseRenewalIntervalInSeconds
установлено значение 30 и запускается 2 экземпляра Eureka. Два экземпляра Eureka отправят 4 обновления на сервер Eureka за минуту, минимальный порог сервера Eureka - 1 (написан в коде), поэтому пороговое значение 5 > (это число будет умножаться на коэффициент eureka.server.renewalPercentThreshold
, который будет рассмотрен ниже).
РЕЖИМ САМОВОГО СОХРАНЕНИЯ: если Обновить (последний мин.) меньше Порог возобновления, будет активирован режим самосохранения.
Итак, в верхнем примере активирован РЕЖИМ СОХРАНЕНИЯ SELF, поскольку порог равен 5, но сервер Eureka может получать только 4 обновления/мин.
РЕЖИМ СОБСТВЕННОГО СОХРАНЕНИЯ - это дизайн, чтобы избежать плохого сбоя сетевого подключения. Связь между экземплярами Eureka A и B хороша, но B не смог возобновить аренду на сервере Eureka за короткий период из-за сбоев в подключении, на данный момент сервер Eureka не может просто просто запустить экземпляр B. Если это так, экземпляр A не получит доступный зарегистрированный сервис от сервера Eureka, несмотря на то, что B доступен. Таким образом, это цель режима SELF PRESERVATION, и лучше включить его.
- Вопрос 2:
Минимальный порог 1 записан в коде. registerWithEureka
установлено в false, поэтому не будет экземпляров экземпляров Eureka, пороговое значение будет равно 1.
В рабочей среде, как правило, мы развертываем два сервера Eureka, а registerWithEureka
- true. Таким образом, пороговое значение будет равно 2, и сервер Eureka возобновит аренду себе дважды/минуту, поэтому RENEWALS ARE LESSER THAN THRESHOLD
не будет проблемой.
- Вопрос 3:
Да, вы правы. eureka.instance.leaseRenewalIntervalInSeconds
определяет, сколько обновлений будет отправлено серверу в минуту, но оно умножит множитель eureka.server.renewalPercentThreshold
, упомянутый выше, значение по умолчанию - 0,85.
- Вопрос 4:
Да, это нормально, потому что пороговое начальное значение установлено равным 1. Поэтому, если для параметра registerWithEureka
установлено значение false, обновления всегда ниже порогового значения.
У меня есть два предложения для этого:
- Разверните два сервера Eureka и включите
registerWithEureka
.
- Если вы просто хотите развернуть в среде demo/dev, вы можете установить
eureka.server.renewalPercentThreshold
на 0,49, поэтому при запуске только сервера Eureka порог будет равен 0.
Ответ 2
Я создал запись в блоге с деталями Eureka здесь, что заполняет некоторые отсутствующие детали из Спринг док или Netflix блог. Это результат нескольких дней отладки и копания в исходном коде. Я понимаю, что предпочтительнее копировать-вставлять, чем ссылаться на внешний URL-адрес, но содержание слишком велико для SO-ответа.
Ответ 3
Вы можете попытаться установить предел порога продления в свойствах вашего сервера eureka. Если у вас есть от 3 до 4 микросервисов для регистрации на eureka, то вы можете установить его на это:
eureka.server.renewalPercentThreshold=0.33