Перейти к основному содержимому

Руководство по самосохранению и обновлению Эврики

· 5 мин. чтения

1. Обзор

В этом уроке мы узнаем о самосохранении и обновлении Eureka .

Мы начнем с создания сервера Eureka вместе с несколькими экземплярами клиента Eureka.

Затем мы зарегистрируем этих клиентов на нашем сервере Eureka, чтобы показать, как работает самосохранение.

2. Эврика самосохранения

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

Во время запуска клиенты инициируют вызов REST с сервером Eureka для самостоятельной регистрации в реестре экземпляров сервера. Когда после использования происходит корректное завершение работы, клиенты инициируют другой вызов REST, чтобы сервер мог стереть все данные, относящиеся к вызывающей стороне.

Чтобы справиться с неизящным завершением работы клиента, сервер ожидает тактовые импульсы от клиента через определенные промежутки времени. Это называется обновлением . Если сервер перестанет получать контрольные сообщения в течение заданного времени, он начнет вытеснять устаревшие экземпляры.

Механизм, который останавливает вытеснение экземпляров, когда пульс ниже ожидаемого порога , называется самосохранением . Это может произойти в случае плохого сетевого раздела, когда экземпляры все еще работают, но временно недоступны, или в случае внезапного завершения работы клиента.

И когда сервер активирует режим самосохранения, он удерживает вытеснение экземпляра до тех пор, пока скорость обновления снова не превысит ожидаемый порог.

Давайте посмотрим на это в действии.

3. Создание сервера

Давайте сначала создадим сервер Eureka, аннотировав наш основной класс Spring Boot с помощью @EnableEurekaServer :

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}

Но теперь давайте добавим основные конфигурации для запуска сервера:

eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
eureka.instance.hostname=localhost

Поскольку мы не хотим, чтобы наш сервер Eureka регистрировался сам, мы установили для свойства eureka.client.registerWithEureka значение false . Здесь свойство eureka.instance.hostname=localhost особенно важно, поскольку мы запускаем его на локальной машине. В противном случае мы можем закончить тем, что создадим недоступную реплику на сервере Eureka, что испортит подсчет сердцебиения клиента.

Теперь давайте посмотрим на всю конфигурацию и ее актуальность в контексте самосохранения в следующем разделе.

3.1. Конфигурации самосохранения

По умолчанию серверы Eureka работают с включенным самосохранением.

Однако для нашего понимания давайте рассмотрим каждую из этих конфигураций на стороне сервера.

  • eureka.server.enable-self-preservation : Конфигурация для отключения самосохранения — значение по умолчанию — true .
  • eureka.server.expected-client-renewal-interval-seconds : сервер ожидает тактов клиента с интервалом, настроенным с помощью этого свойства — значение по умолчанию равно 30 .
  • eureka.instance.lease-expiration-duration-in-seconds : указывает время в секундах, которое сервер Eureka ожидает с момента получения последнего пульса от клиента, прежде чем он сможет удалить этот клиент из своего реестра — значение по умолчанию — 90 .
  • eureka.server.eviction-interval-timer-in-ms : это свойство указывает серверу Eureka запускать задание на этой частоте, чтобы вытеснить клиентов с истекшим сроком действия — значение по умолчанию — 60 секунд .
  • eureka.server.renewal-percent-threshold : на основе этого свойства сервер рассчитывает ожидаемое число ударов сердца в минуту от всех зарегистрированных клиентов — значение по умолчанию — 0,85 .
  • eureka.server.renewal-threshold-update-interval-ms : это свойство указывает серверу Eureka запустить задание на этой частоте, чтобы рассчитать ожидаемые пульсации от всех зарегистрированных клиентов в эту минуту — значение по умолчанию — 15 минут .

В большинстве случаев достаточно конфигурации по умолчанию. Но для конкретных требований мы можем захотеть изменить эти конфигурации. В таких случаях необходимо проявлять максимальную осторожность, чтобы избежать непредвиденных последствий, таких как неправильный расчет порога продления или отложенная активация режима самосохранения .

4. Регистрация клиентов

Теперь давайте создадим Eureka Client и запустим шесть экземпляров:

@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {

public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}

Вот конфигурации клиента:

spring.application.name=Eurekaclient
server.port=${PORT:0}
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka
eureka.instance.preferIpAddress=true
eureka.instance.lease-renewal-interval-in-seconds=30

Эта конфигурация позволяет нам запускать несколько экземпляров одного и того же клиента с программным аргументом PORT . Конфигурация eureka.instance.lease-renewal-interval-in-seconds указывает интервал тактов, которые клиент отправляет на сервер. Значение по умолчанию — 30 секунд, что означает, что клиент будет отправлять один пульс каждые 30 секунд.

Давайте теперь запустим эти шесть клиентских экземпляров с номерами портов, начинающимися с 8081 по 8086, и перейдем к http://localhost:8761 , чтобы проверить, зарегистрированы ли эти экземпляры на сервере Eureka.

./d6717d8fbee43ba7bfbc8b23d2c5c22c.png

На снимке экрана видно, что на нашем сервере Eureka зарегистрировано шесть экземпляров клиентов, а общий порог продления составляет 11. Расчет порога основан на трех факторах:

  • Общее количество зарегистрированных клиентских экземпляров – 6
  • Настроенный интервал обновления клиента – 30 секунд
  • Настроенный порог процента продления — 0,85.

Учитывая все эти факторы, в нашем случае порог равен 11.

5. Проверка самосохранения

Чтобы смоделировать временную сетевую проблему, давайте установим свойство eureka.client.should-unregister-on-shutdown как false на стороне клиента и остановим один из наших экземпляров клиента. Поскольку мы установили для флага should-unregister-on-shutdown значение false , клиент не будет вызывать вызов отмены регистрации, и сервер предполагает, что это неизящное завершение работы .

Теперь давайте подождем 90 секунд, заданных нашим свойством eureka.instance.lease-expiration-duration-in-seconds , и снова перейдем к http://localhost:8761 . Текст, выделенный красным жирным шрифтом, указывает на то, что сервер Eureka теперь находится в режиме самосохранения и прекратил вытеснение экземпляров.

Теперь давайте проверим раздел зарегистрированных экземпляров, чтобы узнать, доступен ли остановленный экземпляр. Как мы видим, он доступен, но со статусом DOWN :

./c70b32509a5a4aff6e3c3560838133f6.png

Единственный способ , которым сервер может выйти из режима самосохранения, — это либо запуск остановленного экземпляра, либо отключение самого самосохранения. Если мы повторим те же шаги, установив для флага eureka.server.enable-self-preservation значение false , то сервер Eureka удалит остановленный экземпляр из реестра после настроенного свойства продолжительности срока действия аренды.

6. Заключение

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

Все примеры, которые мы здесь продемонстрировали, можно найти на GitHub .