«1. Обзор

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

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

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

2. Самосохранение Eureka

Прежде чем говорить о самосохранении, давайте разберемся, как сервер 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 с этим свойством — значение по умолчанию — 30. из своего реестра — значение по умолчанию — 90. 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.

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

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

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

5. Тестирование самосохранения

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

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

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

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

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

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