К основному контенту

REST сервис как Linux служба

В этом посте я собираюсь рассказать как превратить REST сервис, написанный на Java, в Linux службу, устанавливаемую пакетным менеджером.

Итак, первым делом забудьте о тяжеловесных серверах приложений вроде JBoss AS или Oracle WebLogic. Выбираем какой-нибудь легковесный встраиваемый сервер. Это может быть Jetty, Grizzly или даже Simple. Логи предпочтительнее писать в syslog. И Log4j и Logback позволяют это сделать. Для написания сервиса я выбираю Dropwizard (готовая связка Jetty + Jersey + Logback + Metrics), но это совсем необязательно. При сборке нужно положить зависимости в отдельную внешнюю папку или запаковать внутрь jar рядом c вашим кодом (maven-assembly-plugin или maven-shade-plugin в помощь). Для простоты демонстрации я выбрал второй вариант.

Теперь всё готово для превращения. Для запуска службы будем использовать systemd - современную систему инициализации и менеджер служб для Linux. Нам понадобится простой shell скрипт и service файл. Выглядеть это будет примерно так:

При инсталляции нужно правильно разложить файлы по папкам, не забыть сделать скрипт исполняемым, добавить службу в автозапуск командой systemctl enable testrest.service, проверить наличие systemd и rsyslog. Это слишком много для установки вручную. Так пускай за нас эту работу выполняет пакетный менеджер. Для этого необходимо создать пакет. Ниже показано как это сделать с помощью rpm-maven-plugin


Содержимое postinstall:
Вот и всё, что нужно сделать. Подробнее про systemd читайте здесь, а про rpm-maven-plugin здесь.


Комментарии

Популярные сообщения из этого блога

Одно приложение, несколько баз данных

Рецепт от Spring Boot Некоторое время назад мне довелось писать агрегатор информации, разбросанной по нескольким базам данных с разными схемами. Для реализации был выбран Spring Boot. Ну, потому что модный и судя по примерам существенно упрощает жизнь за счет умной автоконфигурации. В этой статье я опишу, что же необходимо сконфигурировать и как, в случае, если вы отошли от стандартного сценария. Первым делом, необходимо прописать настройки доступа к каждой из баз. Например, вот так: Следующим шагом создадим отдельный класс конфигурации (для удобства), в котором определим dataSources: Обратите внимание, как просто получить настройки с помощью @ConfigurationProperties. Правда, пришлось ввести вспомогательный класс BaseDataSourceProperties — наследник DataSourceProperties, в котором область видимости метода getDriverClassName расширена до public. И осталось совсем немного — сконфигурировать JPA-репозитории. Насчет немного я, конечно, пошутил :) В этой части предстоит больше ...

Обработка изображений с ImageMagick

ImageMagick ( http://www.imagemagick.org ) — набор утилит для создания, редактирования, конвертирования и просмотра растровых изображений. Графический режим необходим только для просмотра. Для остальных действий над изображениями достаточно консоли. То есть налицо два отличия от привычных редакторов растровых изображений (вроде GIMP или Krita): использование набора утилит вместо одной программы для операций над изображениями не требуется GUI. Очевидно, что таким инструментом вряд ли будут пользоваться художники, фотографы или дизайнеры. Чтобы разобраться для кого предназначен этот набор, предлагаю ознакомиться с предоставляемыми возможностями. Что умеет ImageMagick? Чтобы ответить на поставленный вопрос я перечислю входящие в набор утилиты, напишу какой функционал предоставляет каждая из них и, конечно же, приведу примеры использования. identify — информационная утилита, воспользовавшись которой можно узнать формат изображения и множество других его свойств (например, высоту,...

Изучение Qt маленькими порциями. Разбираем ваше первое приложение

Прошлый раз вы установили QtCreator, а затем сгенерировали ваше первое приложение. Всё сработало и у вас теперь есть собственное пустое окно QMainWindow на экране. Всё хорошо, но что же действительно было сделано? Давайте пройдёмся по сгенерированному коду, чтобы стало понятно, что же случилось на самом деле. Приложение состоит из одного класса и функции main, необходимой для запуска. Давайте посмотрим на эту функцию main.cpp #include <QtGui/QApplication> #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } В этой функции создаётся экземпляр класса QApplication . Каждому приложению Qt нужен один и только один экземпляр класса QApplication. Он представляет собой само приложение и содержит главный цикл обработки событий. Вы можете спросить, что такое цикл обработки событий? Это просто цикл, ожидающий наступления события. Например, нажатие клавишы, перемещение мышки, сетевые пакеты, событ...