Розуміння порогу самозбереження та поновлення сервера Spring Cloud Eureka Server


83

Я новачок у розробці мікросервісів, хоча я досліджував це вже деякий час, читаючи документи Spring та Netflix.

Я розпочав простий проект, доступний на Github . В основному це сервер Eureka (Архімед) та три клієнтські мікросервіси Eureka (один загальнодоступний API та два приватних). Перевірте readme github для отримання детального опису.

Справа в тому, що коли все працює, я хотів би, щоб, якщо один із приватних мікросервісів був убитий, сервер Eureka зрозумів і видалив його з реєстру.

Я знайшов це питання на Stackoverflow , і рішення проходить за допомогою enableSelfPreservation:falseконфігурації сервера Eureka. Зробивши це через деякий час вбита служба зникає, як очікувалося.

Однак я бачу таке повідомлення:

РЕЖИМ САМОЗБЕРЕЖЕННЯ ВИМКНЕНО. ЦЕ МОЖЕ НЕ ЗАХИСТИТИ ЕКСПЛУАТАЦІЮ, ЩО ВИКОРИСТОВУЄТЬСЯ ВИПАДКУ МЕРЕЖІ / ІНШІ ПРОБЛЕМИ.

1. Яка мета самозбереження? У документі зазначено, що при самозбереженні на "клієнти можуть отримати екземпляри, які вже не існують" . Тож коли доцільно його вмикати / вимикати?

Крім того, коли увімкнено функцію самозбереження, ви можете отримати чудове повідомлення в попередженні консолі сервера Eureka:

НАДЗВИЧАЙНО 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

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

Відповіді:


63

Я отримав те саме запитання, що і @codependent, я багато гуглив і провів експеримент, тут я прийшов, щоб розповісти про те, як працюють сервер та екземпляр Eureka.

Кожному екземпляру потрібно поновлювати оренду на сервері Eureka з частотою один раз на 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:

РЕЖИМ САМОЗБЕРЕЖЕННЯ призначений для запобігання пошкодженню з’єднання з мережею. Зв'язок між екземпляром A і B Eureka хороший, але 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. Якщо ви просто хочете розгорнути в демо / dev середовищі, ви можете встановити eureka.server.renewalPercentThresholdзначення 0,49, тому при запуску одного сервера Eureka поріг буде 0.

Привіт Nie Xing, ти знаєш, що означає Етикетка: "Увімкнено термін оренди:"
jabrena

Привіт @jabrena, я думаю, це означає, що термін дії оренди закінчиться, якщо екземпляр не продовжить оренду на сервері eureka. Це може бути пов’язано з eureka.instance.leaseExpirationDurationInSeconds, значення якого за замовчуванням становить 90 секунд. Якщо встановити для цього значення 0 або від’ємне число, мітка може перетворитися на «Увімкнено термін оренди: помилковий». Ви можете спробувати.
Nie Xing

Ви можете відповісти на це stackoverflow.com/questions/48437752/…
Ankit Bansal

Не працює. Поріг = 0, Поновлення = 0 все одно викликає попередження.
SledgeHammer

Я вимкнув режим selfPreservationMo, але все одно отримую це повідомлення на Eureka - EUREKA МОЖЕ БУТИ НЕПРАВИЛЬНО ЗАЯВЛЕНИХ ВИНАХОДІВ, КОЛИ ЇХ НІ. ОНОВЛЕННЯ МЕНШЕ, ЩО ПРАГ, ТА ШТО ВИКОРИСТАННЯ НЕ СТИКНУЮТЬСЯ ТІЛЬКИ ДЛЯ БЕЗПЕКИ. Це не повинно статися так?
DHRUV BANSAL

31

Я створив запис в блозі з деталями Eureka тут , що заливка в якій - то відсутньої деталі з Спрінг док або 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.