Перейти к основному содержимому

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

· 6 мин. чтения

1. Обзор

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

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

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

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

2.1. Упаковка

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

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

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

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

<packaging>jar</packaging>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
</parent>

<dependencies>
....
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
</plugins>
</build>

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

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

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

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

$ mvn clean package

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

$ java -jar your-app.jar

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

3. В Linux

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

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

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

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

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

3.1. Инициализация системы V

Исполняемый JAR-файл Spring Boot упрощает процесс настройки службы:

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

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

$ sudo service your-app start

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

  • он запускает службы, работающие под только что созданным пользователем foreach
  • он отслеживает идентификатор процесса приложения в /var/run/your-app/your-app.pid
  • он записывает журналы консоли в /var/log/your-app.log , которые вы можете проверить на случай, если ваше приложение не запустится должным образом.

3.2. Системд

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

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

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

[Install]
WantedBy=multi-user.target

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

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

3.3. Выскочка

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

На сайте есть хорошие инструкции по установке , которые подойдут практически для любого дистрибутива 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 предлагает множество вариантов настройки работы, большинство из них вы можете найти здесь .

4. В Windows

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

4.1. Оболочка службы Windows

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

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

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

<service>
<id>MyApp</id>
<name>MyApp</name>
<description>This runs Spring Boot as a Service.</description>
<env name="MYAPP_HOME" value="%BASE%"/>
<executable>java</executable>
<arguments>-Xmx256m -jar "%BASE%\MyApp.jar"</arguments>
<logmode>rotate</logmode>
</service>

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

$ MyApp.exe install

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

4.2. Оболочка службы Java

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

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

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

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

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

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

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

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

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