Как изящно закрыть приложение Spring Boot

Java

предисловие

Поскольку онлайн-приложения постепенно создаются с помощью SpringBoot, появляется все больше и больше экземпляров приложений SpringBoot. Когда онлайн-приложение необходимо обновить и развернуть, команда kill часто используется просто и грубо. Такой способ остановки приложения позволит приложению удалить всю обработку. Запрос был удален, и ответ не получился. Таких сбоев ответа следует избегать, особенно при работе с важной бизнес-логикой, так что какой лучший способ плавно закрыть приложение SpringBoot? Тогда давайте рассмотрим это вместе в этой статье. (Эта статья в основном предназначена для приложений, основанных на встроенном контейнере Tomcat Spring Boot в качестве веб-службы)

Образец кода в этой статье можно получить по следующему адресу склада:

Экологическая поддержка:

  • JDK 8
  • SpringBoot 2.1.4
  • Maven 3.6.0

Настройка поведения Tomcat Connector

Предпосылка плавного закрытия приложения Spring Boot заключается в том, чтобы сначала закрыть его встроенный веб-контейнер и больше не обрабатывать входящие внешние запросы. Для того, чтобы текущий Tomcat обрабатывал все входящие запросы, когда приложение получает уведомление о событии завершения работы, нам необходимо реализовать интерфейс TomcatConnectorCustomizer.Исходный код этого интерфейса очень прост.Из комментариев видно, что это интерфейс обратного вызова, реализующий пользовательское поведение Tomcat Connector. :

Здесь, если вы не знакомы с Коннектором, я кратко опишу его: Коннектор - это абстрактный компонент Tomcat. Его функция состоит в том, чтобы принимать внешние запросы, передавать внутренне и возвращать содержимое ответа. Это важный компонент обработки запроса и ответ в Tomcat.Конкретные реализации включают HTTP-коннектор и AJP-коннектор.

Настроив поведение соединителя, мы можем разрешить закрытие пула потоков Tomcat после обработки запроса. Конкретный код реализации выглядит следующим образом:

Переменная TIMEOUT, определенная в приведенном выше коде, представляет собой максимальное время ожидания для отложенного завершения работы пула потоков Tomcat. Как только это время будет превышено, пул потоков будет принудительно закрыт, и все запросы не будут обрабатываться. Мы достигаем элегантности, контролируя время закрытия пула потоков Tomcat Отключить функциональность веб-приложения. Еще стоит отметить, что наш класс CustomShutdown реализует интерфейс ApplicationListener, что означает прослушивание события закрытия контейнера Spring, то есть текущий ApplicationContext выполняет метод close.

##Внедрение Tomcat для добавления обратного вызова Connector

С помощью пользовательского обратного вызова Connector нам нужно добавить процесс загрузки во встроенный контейнер Tomcat, а затем дождаться выполнения. Ну, этот шаг, как этого добиться, вы можете обратиться к следующим кодам:

TomcatServletWebServerFactory здесь — это фабричный класс, в котором Spring Boot реализует встроенный Tomcat.Как и в других веб-контейнерах, существуют также соответствующие фабричные классы, такие как JettyServletWebServerFactory, UndertowServletWebServerFactory. Их общей особенностью является то, что они наследуют один и тот же абстрактный класс AbstractServletWebServerFactory, который предоставляет общедоступную реализацию веб-контейнера по умолчанию, такую ​​как настройки контекста приложения, управление сеансом и т. д.

Если нам нужно определить контейнер Tomcat, встроенный в Spring Boot, мы можем использовать TomcatServletWebServerFactory для настройки определения.Например, ниже приведен пользовательский пример для официальной документации:

Хорошо, вернемся к делу, мы используем здесьaddConnectorCustomizersМетод добавляет настраиваемое поведение соединителя во встроенный Tomcat. Чтобы проверить эффект загрузки, мы можем получить объект webServerFactory из контейнера после запуска программы Spring Boot, а затем наблюдать в его свойстве tomcatConnectorCustomizers, вы можете видеть, что С объектом CustomShutdown.

Открыть конечную точку выключения

На данный момент операция плавного закрытия встроенного контейнера Tomcat завершена.Следующее, что нужно сделать, это как активно закрыть контейнер Spring.Помимо обычной команды Linux Kill, мы можем использовать Spring Boot Actuator для реализации удаленное отключение контейнера Spring. Как это сделать? продолжить чтение

Spring Boot Actuator Spring Boot — это отличная функция, которая предоставляет множество функций, помогающих приложениям Spring Boot, которые мы запускаем, контролировать производственную среду и управлять ею. Мы можем использовать способы HTTP или JMX для управления нашими приложениями, кроме того, он обеспечивает аудит наших приложений, функцию сбора информации о состоянии и метриках, что может помочь нам более полно понять работающее приложение.

Actuator, ['æktʃʊˌeɪtə] китайский переводтормоз, производственный термин, относящийся к механическому устройству, используемому для управления чем-либо.

Spring Boot Actuator также предоставляет функцию управления завершением работы приложения, поэтому нам нужно ввести Spring Boot Actuator для приложения Конкретный способ — добавить соответствующую стартовую зависимость в текущий проект, взяв проект Maven в качестве пример:

Spring Boot Actuator предоставляет конечные точки внешнему миру, что позволяет нам отслеживать приложения и управлять ими, а также внедрятьspring-boot-starter-actuatorПосле этого нам необходимо включить нужную нам Shutdown Endpoint В конфигурационном файле application.properties настройки такие

Первая строка указывает на включенную конечную точку завершения работы, вторая строка указывает, что конечная точка HTTP выставляет все наружу, в дополнение к конечной точке завершения работы по умолчанию включена другая конечная точка.

В дополнение к конечной точке выключения существует более десяти типов конечных точек привода, некоторые из которых являются специфическими операциями, напримерheapdumpЖурналы дампа памяти; некоторые из них отображают информацию, напримерhealthОтображает состояние работоспособности приложения. Для получения всей конкретной информации о конечных точках см.Официальная документация - 53. Конечные точкиодин период.

На этом наша работа по предварительной настройке завершена. После запуска приложения вы можете запросить соответствующий путь через POSThttp://host:port/actuator/shutdownОчень просто реализовать удаленное отключение приложений Spring Boot?

пробный тест

Чтобы смоделировать тест здесь, мы сначала смоделируем контроллер запросов BusinessController, который может обрабатывать службы до 10 с. Конкретная реализация выглядит следующим образом:

использоватьThread.sleepЧтобы заблокировать текущий поток запроса, имитируйте бизнес-обработку и в то же время используйте HTTP для доступа к конечной точке завершения работы, чтобы попытаться закрыть приложение.Вы можете просмотреть журнал консоли, чтобы увидеть, завершит ли приложение обработку запроса перед его закрытием.

Во-первых, используйте команду curl для имитации отправки бизнес-запроса:

Затем в бизнес-обработке отправьте запрос напрямуюactuator/shutdown, попробуйте закрыть приложение, также используйте метод curl:

actuator/shutdownОтвет возвращается сразу после отправки запроса, но приложение не останавливается:

Наконец, посмотрите на последовательность вывода журнала консоли:

Видно, что запрос на закрытие приложения отправляется сразу после отправки запроса на обслуживание, и приложение не будет остановлено сразу, а после обработки запроса приложение начнет выходить после блокировки на 10 с, что обеспечивает что полученный запрос может быть возвращен.Нормальный ответ, а запрос, который поступает после закрытия запроса, не будет обработан.Здесь мы добились операции изящного закрытия программы Spring Boot.

Автоматизировать

Поскольку Spring Boot обеспечивает удобство встроенного веб-контейнера, мы часто упаковываем программу в банку, а затем публикуем ее. Обычно процесс запуска и завершения работы приложения фиксируется и повторяется.Основываясь на принципе «Не повторяйтесь», нам необходимо автоматизировать этот процесс операции и прописать операцию закрытия и включения приложений SpringBoot в сценарии оболочки, чтобы избежать искусственных Ошибки и простота в использовании повышают эффективность работы. Ниже приведен сценарий запуска программы, который я написал для примера программы: (Конкретный сценарий можно просмотреть в примере проекта)

С помощью скрипта мы можем плавно обновить и развернуть программу Spring Boot прямо через командную строку Эффект следующий:

Суммировать

В этой статье в основном рассматривается, как реализовать плавное завершение работы веб-приложений на базе Tomcat, встроенного в Spring Boot. Если другие веб-контейнеры используются аналогичным образом, я надеюсь, что эта статья будет полезна. Если есть ошибки или несоответствия, пожалуйста, критикуйте Исправьте, изучите и общаться вместе.

Ссылаться на