«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 и как мы можем настроить различные параметры, связанные с самосохранением.