Автор оригинала: Tino Mulanchira Thomas.
1. Обзор
В этом уроке мы узнаем о самосохранении и обновлении Эврики.
Мы начнем с создания сервера 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-самосохранение : Конфигурация для отключения самосохранения – значение по умолчанию true
- eureka.server.expected-client-renewal-interval-seconds : Сервер ожидает сердцебиения клиента с интервалом, настроенным с помощью этого свойства – значение по умолчанию равно 30
- эврика,например.срок действия аренды-в секундах : Указывает время в секундах, в течение которого сервер Eureka ожидает с момента получения последнего сердцебиения от клиента, прежде чем он сможет удалить этот клиент из своего реестра-значение по умолчанию равно 90
- eureka.server.выселение-интервал-таймер-в-мс : Это свойство указывает серверу Eureka запускать задание с такой частотой для выселения клиентов с истекшим сроком действия – значение по умолчанию равно 60 секунды
- eureka.server.renewal-percent-threshold : На основе этого свойства сервер вычисляет ожидаемые частоты сердечных сокращений в минуту от всех зарегистрированных клиентов – значение по умолчанию равно 0,85
- eureka.server.renewal-threshold-update-interval-ms : Это свойство указывает серверу Eureka запускать задание с такой частотой, чтобы вычислить ожидаемое сердцебиение всех зарегистрированных клиентов в эту минуту – значение по умолчанию равно 15 минут
В большинстве случаев достаточно конфигурации по умолчанию. Но для конкретных требований мы можем захотеть изменить эти конфигурации. Необходимо проявлять максимальную осторожность в этих случаях, чтобы избежать неожиданных последствий, таких как неправильный расчет порога обновления или задержка активации режима самосохранения .
4. Регистрация Клиентов
Теперь давайте создадим клиент Eureka и раскрутим шесть экземпляров:
@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 program. Конфигурация eureka.instance.интервал продления аренды в секундах указывает интервал сердцебиений, который клиент отправляет серверу. Значение по умолчанию-30 секунд, что означает, что клиент будет посылать одно сердцебиение каждые 30 секунд.
Давайте не будем запускать эти шесть клиентских экземпляров с номерами портов, начинающимися с 8081 по 8086, и перейдем к http://localhost:8761 чтобы проверить, зарегистрированы ли эти экземпляры на сервере Eureka.
На скриншоте мы видим, что наш сервер Eureka имеет шесть зарегистрированных экземпляров клиентов, а общий порог обновления составляет 11. Расчет порога основан на трех факторах:
- Общее количество зарегистрированных клиентских экземпляров – 6
- Настроенный интервал обновления клиента – 30 секунд
- Настроенный порог процента обновления – 0,85
Учитывая все эти факторы, в нашем случае порог равен 11.
5. Тестирование Самосохранения
Чтобы смоделировать временную сетевую проблему, давайте установим свойство eureka.client.should-unregister-on-shutdown как false на стороне клиента и остановим один из наших экземпляров клиента. Поскольку мы установили флаг should-unregister-on-shutdown как false , клиент не будет вызывать вызов unregister, и сервер предполагает, что это нелюбезное завершение работы .
Теперь давайте подождем 90 секунд, установленных нашим экземпляром eureka.instance.срок аренды-истечение-продолжительность-в-секундах свойство, и снова перейдите к http://localhost:8761 . Выделенный красным жирным шрифтом текст указывает на то, что сервер Eureka теперь находится в режиме самосохранения и прекратил выселение экземпляров.
Теперь давайте проверим раздел зарегистрированные экземпляры, чтобы узнать, доступен ли остановленный экземпляр по-прежнему или нет. Как мы видим, он доступен, но со статусом DOWN :
Единственный способ сервер может выйти из режима самосохранения-либо запустить остановленный экземпляр, либо отключить самосохранение. Если мы повторим те же действия , установив флаг eureka.server.enable-self-saving как false , то сервер Eureka удалит остановленный экземпляр из реестра после истечения срока действия настроенного свойства срока аренды.
6. Заключение
В этом уроке мы узнали, как работает самосохранение Эврики и как мы можем настроить различные параметры, связанные с самосохранением.
Все примеры, которые мы продемонстрировали здесь, можно найти на GitHub .