Приложение Spring Boot как сервис

Приложение Spring Boot как услуга

1. обзор

В этой статье рассматриваются некоторые варианты запуска приложений Spring Boot в качестве службы.

Во-первых, мы собираемся объяснить варианты упаковки веб-приложений и системных служб. В последующих разделах мы рассмотрим различные альтернативы, которые мы имеем при настройке службы для Linux как систем на базе Windows.

Наконец, мы закончим с некоторыми ссылками на дополнительные источники информации.

2. Инструкции по настройке и сборке проекта

2.1. упаковка

Веб-приложения традиционно упаковываются в архивы веб-приложений (WAR) и развертываются на веб-сервере.

Приложения Spring Boot могут быть упакованы как файлы WAR и JAR. Последний встраивает веб-сервер в JAR-файл, что позволяет запускать приложения без необходимости установки и настройки сервера приложений.

2.2. Конфигурация Maven

Начнем с определения конфигурации нашего файлаpom.xml:

jar


    org.springframework.boot
    spring-boot-starter-parent
    1.4.0.RELEASE



    ....



    
        
            org.springframework.boot
            spring-boot-maven-plugin
            
                true
            
        
    

Упаковка должна быть установлена ​​наjar. На момент написания статьи мы использовали последнюю стабильную версию Spring Boot, но любой версии после 1.3 будет достаточно. Вы можете найти дополнительную информацию о доступных версияхhere.

Обратите внимание, что мы установили для параметра<executable> значениеtrue для артефактаspring-boot-maven-plugin. Это гарантирует, что файлMANIFEST.MF добавлен в пакет JAR. Этот манифест содержит записьMain-Class, которая указывает, какой класс определяет основной метод для вашего приложения.

2.3. Создание вашего приложения

Выполните следующую команду в корневом каталоге вашего приложения:

$ mvn clean package

Исполняемый файл JAR теперь доступен в каталогеtarget, и мы можем запустить приложение, выполнив следующую команду в командной строке:

$ java -jar your-app.jar

На этом этапе вам все еще нужно вызвать интерпретатор Java с параметром-jar. Существует множество причин, по которым было бы предпочтительнее запускать ваше приложение, поскольку оно может вызываться как служба.

3. В линуксе

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

Вместо этого мы перейдем кdaemonize нашему процессу. В Linux мы можем выбрать настройку демона либо с помощью традиционного сценарияSystem V init, либо с помощью файла конфигурацииSystemd. Первое традиционно является наиболее известным вариантом, но постепенно заменяется последним.

Вы можете найти более подробную информацию об этой разницеhere.

Для повышения безопасности мы сначала создаем определенного пользователя для запуска службы и соответственно меняем права доступа к исполняемому файлу JAR:

$ sudo useradd example
$ sudo passwd example
$ sudo chown example:example your-app.jar
$ sudo chmod 500 your-app.jar

3.1. System V Init

Исполняемый JAR-файл Spring Boot делает процесс настройки сервиса очень простым:

$ sudo ln -s /path/to/your-app.jar /etc/init.d/your-app

Приведенная выше команда создает символическую ссылку на ваш исполняемый файл JAR. Вы должны использовать полный путь к вашему исполняемому файлу JAR, иначе символическая ссылка не будет работать должным образом. Эта ссылка позволяет запустить приложение в качестве службы:

$ sudo service your-app start

Скрипт поддерживает стандартные служебные командыstart,stop,restart иstatus. Более того:

  • он запускает службы, запущенные под пользователемexample, которого мы только что создали

  • он отслеживает идентификатор процесса приложения в/var/run/your-app/your-app.pid

  • он записывает журналы консоли в/var/log/your-app.log, которые вы можете проверить, если ваше приложение не запускается должным образом

3.2. Systemd

Настройка службыsystemd также очень проста. Сначала мы создаем сценарий с именемyour-app.service, используя следующий пример, и помещаем его в каталог/etc/systemd/system:

[Unit]
Description=A Spring Boot application
After=syslog.target

[Service]
User=example
ExecStart=/path/to/your-app.jar SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

Не забудьте изменить поляDescription,User иExecStart в соответствии с вашим приложением. Вы должны быть в состоянии выполнить вышеупомянутые стандартные сервисные команды также в этот момент.

В отличие от подходаSystem V init, описанного в предыдущем разделе, файл идентификатора процесса и файл журнала консоли должны быть настроены явно с использованием соответствующих полей в сценарии службы. Исчерпывающий список опций можно найтиhere.

3.3. Выскочка

Upstart - это диспетчер служб на основе событий, потенциальная заменаSystem V init, который предлагает больший контроль над поведением различных демонов.

На сайте есть хорошиеsetup instructions, которые должны работать практически для любого дистрибутива Linux. При использовании Ubuntu он, вероятно, уже установлен и настроен (проверьте, есть ли задания с именем, начинающимся с «upstart» в/etc/init).

Мы создаем заданиеyour-app.conf для запуска нашего приложения Spring Boot:

# Place in /home/{user}/.config/upstart

description "Some Spring Boot application"

respawn # attempt service restart if stops abruptly

exec java -jar /path/to/your-app.jar

Теперь запустите «start your-app» и ваш сервис запустится.

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

4. На винде

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

4.1. Windows Service Wrapper

Из-за трудностей с лицензией GPLJava Service Wrapper (см. Следующий подраздел) в сочетании, например, с По лицензии MIT Jenkins был задуман проектWindows Service Wrapper, также известный какwinsw.

Winsw предоставляет программные средства для установки / удаления / запуска / остановки службы. Кроме того, он может использоваться для запуска любого вида исполняемого файла в качестве службы в Windows, тогда как Java Service Wrapper, как следует из его названия, поддерживает только приложения Java.

Сначала вы загружаете двоичные файлыhere. Затем файл конфигурации, который определяет нашу службу Windows,MyApp.xml, должен выглядеть так:


    MyApp
    MyApp
    This runs Spring Boot as a Service.
    
    java
    -Xmx256m -jar "%BASE%\MyApp.jar"
    rotate

Наконец, вы должны переименоватьwinsw.exe вMyApp.exe, чтобы его имя совпадало с файлом конфигурацииMyApp.xml. После этого вы можете установить сервис следующим образом:

$ MyApp.exe install

Точно так же вы можете использоватьuninstall,start,stop и т. Д.

4.2. Java Service Wrapper

Если вы не возражаете против лицензирования проектаJava Service Wrapper по GPL, эта альтернатива может удовлетворить ваши потребности в настройке файла JAR как службы Windows. По сути, Java Service Wrapper также требует, чтобы вы указали в файле конфигурации, в котором указано, как запускать ваш процесс как службу в Windows.

This article очень подробно объясняет, как настроить такое выполнение файла JAR как службы под Windows, поэтому нам не нужно повторять информацию.

5. Дополнительные ссылки

Приложения Spring Boot также можно запускать как службу Windows с использованиемProcrun проектаApache Commons Daemon. Procrun - это набор приложений, которые позволяют пользователям Windows обернуть приложения Java в службы Windows. Такая служба может быть настроена на автоматический запуск при загрузке машины и будет продолжать работать без входа любого пользователя.

Более подробную информацию о запуске приложений Spring Boot под Unix можно найти вhere. Также есть подробные инструкции по изменению систем на основеSystemd unit files for Redhat. в заключение

Наконец,this quick howto описывает, как включить сценарий Bash в ваш JAR-файл, чтобы он сам стал исполняемым файлом!

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

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

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