Как задеплоить spring приложение на сервер
Очень часто возникает задача написать быстро простой сервер для тестирования клиента или развертки простого веб приложение. В Java достаточно сложно создать простую инфраструктуру сервера с начального уровня при применении Spring Framework, по сравнению с такими языками как Python или Ruby. Но прогресс не стоит на месте и новые технологии позволяют написать сервер всего в пару строк. В этой статье мы рассмотрим два фреймворка, которые позволяют это сделать, а именно: Spring Boot и Spark Web Framework.
Хочется заметить, что Spring Boot по сравнению с Spark Web Framework представляет гораздо больше возможностей, так как основан на Spring Framework, но мы будем рассматривать эти фремворки в контексте быстрого и удобного инструмента для написания простых веб приложений.
Spring Boot
Spring Boot был разработан для упрощения рутинной работы при написания инфраструктуры сервера , базирующуюся на Spring Framework.
Вы можете использовать Spring Boot для создания автономных Java-приложений в форме большого JAR файла, который может быть просто запущен с помощью команды java -jar или более традиционных для веб приложений WAR файлов.
Давайте теперь напишем наш небольшой hello-word сервер.
Для этого вам понадобиться: любая среда разработки;JDK 1.8 или более новая версия ; Maven 3.0 и выше.
Сначала нужно настроить наши зависимости и плагины в pom.xml файле следующим образом:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
Создать главный класс hello/SampleController.java в котором будет находиться весь код нашего сервера:
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
public class HelloApplication
@RequestMapping("/hello ")
String hello() return "hello world!";
>
@EnableAutoConfiguration сообщает Spring Boot, чтобы он добавил бины, основанные на том, что лежит в classpath и различные настройки окружения.
@RestController говорит что данный класс также является обработчиком запросов от клиента и в ответ ему возращает какой-либо ресурс, в нашем случаии просто строку.
@RequestMapping обозначает, какой метод будет обрабатывать запрос, переданный на адрес "/hello".
Как правило, мы добавляем еще @EnableWebMvc для приложения Spring MVC, но Spring Boot добавляет его автоматически, когда он видит spring-webmvc в classpath. Эта аннотация обозначает приложение как веб-приложения и активирует необходимые модули, такие как создание DispatcherServlet.
Метод main() использует метод Spring Boot SpringApplication.run() для запуска приложения. Вы заметили, что не было ни одной строки XML? А также деплоймент дескриптора web.xml. Это веб-приложение является 100% написанным на Java, и вы не должны иметь дело с настройкой любой инфраструктуры.
Теперь соберите приложение через команду mvn clean package и запуститеjava -jar <name_of_web-application>. Теперь если вы перейдете по адресу localhost:8080/hello то увидите строчку "hello world!".
Как видите это чрезвычайно легко писать сервер с использованием Spring Boot.
Spark Web Framework
Первое что хочется уяснить, что не стоит путать фреймворк с Apache Spark, который является каркасом для реализации распределенной обработки больших данных.
Фреймворк представляет собой простую и легкую веб-платформу на Java созданная для быстрой разработки. Создание Spark было первоначально вдохновленно веб-фреймворком Sinatra, но цель его создания состоит в том, чтобы не конкурировать с Sinatra, или другими похожими веб-платформами на разных языках. Мотив создания Spark заключается в том, чтобы обеспечить Java альтернативой для разработчиков, которые хотят (или обязаны), разрабатывать свои веб-приложения только на Java. Фреймворк построен на лямбдах которые появились в Java 8, что позволяет делать типичное приложение Spark менее многословным, чем большинство приложений, написанных на других веб-структурах Java.
И так, чтобы написать и запустить приложение нам понадобиться те же JDK и сборщик Maven, что и для Spring Boot. Наш pom.xml будет выглядит следующим образом:
<dependency> <groupId>com.sparkjava</groupId> <artifactId>spark-core</artifactId> <version>2.5.3</version> </dependency> |
Та даам! мы написали сервер! Запустите приложение и перейдите на адрес localhost:4567/hello и вы увидите всеми известную строчку "hello world!"
Заключение
Мы рассмотрели два фреймворка для быстрого создания веб приложения, они показали что и на Java можно создать сервер в пару строк. Spark Web Framework по сравнению с Spring Boot невероятно компактный и если вы уже запустили Spring приложение то, наверное, заметили какое большое количество зависимостей оно подтягивает для своего запуска, тогда как для Spark нужно только 3 зависимости. Мало того Spring еще поднимает в своем контексте невероятное количество бинов (около 200) из которых вы используете только незначительную часть. Так что если вам нужно написать тестовый сервер, который представляет собой просто набор заглушек на какое-то REST API, то лучше использовать Spark. Если же ваше приложение будет бурно развиваться, требовать поддержку взаимодействия с базой данных, обеспечения ролей для пользователей и прочие важные атрибуты современных веб систем, то в этом случае используйте Spring Boot. Данный фреймворк даст вам быстрый старт и возможность легкого расширения.
При разработке веб-приложения естественным шагом является его подключение к сети и предоставление его конечным пользователям. Чтобы сделать эту задачу проще, для размещения вашего приложения доступно множество облачных платформ - Heroku - одна из них.
Heroku предоставляет платформу в качестве службы для развертывания приложений различных технологических стеков, таких как Node, Java, Python и т.д. Она заботится обо всех сложных аспектах развертывания, инфраструктуры, масштабирования, обновления, безопасности и т.д. И позволяет нам сосредоточиться на логика приложения и предоставление большей ценности нашим конечным пользователям, а не развертывание.
В этой статье мы создадим действительно простое API-приложение Spring Boot REST, которое предоставит конечную точку, и рассмотрим различные способы развертывания приложения в Heroku.
Создание приложения Spring Boot
Инициализация приложения Spring Boot
Как всегда, самый простой способ начать со скелетного проекта Spring Boot - это использовать Spring Initializer:
Выберите предпочитаемый инструмент для сборки, мы будем использовать Maven. Единственная зависимость, в которой мы нуждаемся, - это зависимость от Spring Web.
В качестве альтернативы мы можем создать приложение с помощью Spring Boot CLI:
Создать конечную REST точку
Сделав скелет, давайте добавим простую конечную точку REST:
В случае, если вы не знакомы с аннотацией @RestController , это удобство аннотация выполнена в виде комбинации из @Controller и @ResponseBody .
Эта конечная точка просто возвращает текущее время сервера по запросу. Давайте запустим приложение на нашей локальной машине и проверим, работает ли оно:
Или, используя вашу IDE, просто запустите приложение и перейдите по URL-адресу вашего браузера localhost:8080/api/v1.0/time :
В качестве альтернативы вы можете использовать curl :
Развертывание в Heroku
Подготовив наше приложение, давайте рассмотрим различные способы его развертывания в Heroku.
Использование Heroku CLI с Git
Heroku предлагает собственный CLI, который мы можем использовать для развертывания приложения. Для этого нам нужно установить Heroku CLI и Git.
Прежде чем мы попытаемся развернуть его на Heroku, необходимо, чтобы приложение находилось в репозитории Git, поэтому давайте создадим репозиторий в каталоге нашего проекта:
После того, как репозиторий создан, давайте добавим и зафиксируем файлы:
Следующий шаг - войти в Heroku с помощью интерфейса командной строки Heroku и создать приложение Heroku:
Он запросит адрес электронной почты и пароль для вашей учетной записи Heroku:
После того, как мы вошли в систему, давайте создадим приложение:
Относительно быстро мы будем привязаны к приложению:
Наконец, мы можем развернуть наш код:
Heroku обнаружит, что это приложение Java / Maven по наличию файла pom.xml в хранилище. После нажатия, если вы посмотрите на журналы, вы сможете заметить:
И, наконец, развертывание завершено, и нам предлагается URL-адрес, ведущий к нашему приложению:
Давайте снова протестируем приложение, используя curl :
Или перейдя в наш браузер по его URL:
Heroku Deploy Plugin
Если мы хотим развернуть наше приложение напрямую, без использования Git-репозитория, мы можем сделать это с помощью плагина heroku-cli-deploy . Давайте начнем с его установки:
Как и в предыдущем разделе, мы просим Heroku создать приложение, но на этот раз мы включили аргумент --no-remote , чтобы не запрашивать репозиторий Git:
Обратите внимание, что на этот раз мы упомянули имя приложения - heroku-demo-stackabuse . Это создаст приложение с заданным именем, а не сгенерирует случайное имя, как в предыдущем разделе.
Мы также должны упомянуть порт, с которым Heroku будет связывать приложение в файле application.properties :
Примечание: Это необходимо, поскольку Heroku связывает приложение с портом, передаваемым в качестве переменной среды PORT , а Spring Boot по умолчанию предоставляет порт 8080 . Здесь мы просим Spring использовать PORT или 8080 если переменная окружения отсутствует, т.е. мы работаем локально.
Наконец, мы создаем наше приложение с Maven, чтобы создать jar файл и развернуть его:
Плагин Maven
Возможны сценарии, в которых мы хотели бы выполнить развертывание как часть нашей сборки Maven. Это возможно с помощью плагина Heroku Maven. Давайте разместим конфигурацию плагина в нашем pom.xml :
Всегда проверяйте последнюю версию плагина здесь.
И теперь мы можем использовать heroku:deploy для развертывания приложения:
Панель инструментов Heroku с GitHub
С CLI подходами в стороне, есть также действительно удобный подход GUI. Мы можем создать приложение на панели инструментов Heroku, связать его с учетной записью GitHub и развернуть оттуда.
Перейдите к опции «new app»:
Затем подключите свою учетную запись GitHub и найдите свой репозиторий для подключения:
После подключения вы можете развернуть свое приложение, выбрав ветвь для развертывания или непосредственно выбрав основную ветвь. Также вы можете включить автоматическое развертывание на основе коммитов в конкретной ветке:
Проверка журналов развернутых приложений
Проверка журналов развернутого приложения может быть полезна для многих целей. К счастью, к ним действительно легко получить доступ.
Используя CLI, это всего лишь одна команда:
Это позволит увидеть запущенные журналы:
Кроме того, панель инструментов Heroku позволяет нам получать к ним доступ с right-hand More > View Logs :
Heroku Procfile
PROCFILE можно использовать для настройки приложения конфигурирования или переопределения по умолчанию и команд. Например, при развертывании приложения с помощью плагина Heroku мы добавили информацию о портах в application.properties .
Это также может быть добавлено в Procfile. Мы бы добавили команды для запуска приложения, такие как:
Здесь мы добавили команду для запуска приложения с Java и добавили аргумент JVM для переопределения привязки порта Spring Boot по умолчанию.
Удаление приложения из Heroku
В какой-то момент вы можете удалить свое приложение из Heroku по любой причине. Это делается с помощью простой команды:
Мы можем запустить команду без флага --confirm , но в этом случае она предложит ввести имя приложения.
В качестве альтернативы, мы можем удалить приложение из настроек Heroku Dashboard:
Вывод
С ростом популярности облачных вычислений важно знать, как мы можем развертывать и управлять нашим приложением на облачной платформе.
Heroku - это платформа как сервис для развертывания, управления и масштабирования приложений. Он также обеспечивает бесплатное развертывание с бесплатными динамометрами. Это бесплатное развертывание может использоваться для любых демонстрационных или оценочных целей, но определенно не подходит для рабочих приложений реального времени.
Этот урок освещает процесс создания приложения, которое взаимодействует с RESTful web-сервисом.
Что вы создадите
Вы создадите приложение, которое использует Spring RestTemplate для получения информации о компании из Facebook’s Graph API:
Что вам потребуется
- Примерно 15 минут свободного времени
- Любимый текстовый редактор или IDE и выше
- Gradle 1.11+ или Maven 3.0+
- Вы также можете импортировать код этого урока, а также просматривать web-страницы прямо из Spring Tool Suite (STS), собственно как и работать дальше из него.
Как проходить этот урок
Как и большинство уроков по Spring, вы можете начать с нуля и выполнять каждый шаг, либо пропустить базовые шаги, которые вам уже знакомы. В любом случае, вы в конечном итоге получите рабочий код.
Чтобы начать с нуля, перейдите в Настройка проекта.
Когда вы закончите, можете сравнить получившийся результат с образцом в gs-consuming-rest/complete .
Настройка проекта
Для начала вам необходимо настроить базовый скрипт сборки. Вы можете использовать любую систему сборки, которая вам нравится для сборки проетов Spring, но в этом уроке рассмотрим код для работы с Gradle и Maven. Если вы не знакомы ни с одним из них, ознакомьтесь с соответсвующими уроками Сборка Java-проекта с использованием Gradle или Сборка Java-проекта с использованием Maven.
Создание структуры каталогов
В выбранном вами каталоге проекта создайте следующую структуру каталогов; к примеру, командой mkdir -p src/main/java/hello для *nix систем:
Создание файла сборки Gradle
Ниже представлен начальный файл сборки Gradle. Файл pom.xml находится здесь. Если вы используете Spring Tool Suite (STS), то можете импортировать урок прямо из него.
Если вы посмотрите на pom.xml , вы найдете, что указана версия для maven-compiler-plugin. В общем, это не рекомендуется делать. В данном случае он предназначен для решения проблем с нашей CI системы, которая по умолчанию имеет старую(до Java 5) версию этого плагина.Spring Boot gradle plugin предоставляет множество удобных возможностей:
- Он собирает все jar'ы в classpath и собирает единое, исполняемое "über-jar", что делает более удобным выполнение и доставку вашего сервиса
- Он ищет public static void main() метод, как признак исполняемого класса
- Он предоставляет встроенное разрешение зависимостей, с определенными номерами версий для соответсвующих Spring Boot зависимостей. Вы можете переопределить на любые версии, какие захотите, но он будет по умолчанию для Boot выбранным набором версий
Получение REST ресурса
После того, как вы настроили проект, вы можете создать простое приложение, которое будет взаимодействовать с RESTful web-сервисом.
Предположим, что вы хотите найти что-нибудь, что известно Facebook о Pivotal. Зная, что Pivotal имеет страницу на Facebook c ID "pivotalsoftware", вы должны будете выполнить запрос к Facebook’s Graph API по URL:
Если выполните запрос из вашего браузера или curl, то получите JSON документ с примерно такими данными:
Это достаточно просто сделать, но не особо полезно, когда данные получаются через браузер или curl.
Более полезный способ взаимодействия с REST web-сервисом является программный. Для решения этой задачи, Spring предоставляет удобный шаблонный класс RestTemplate . RestTemplate осуществляет взаимодействие с большинством RESTful сервисами однострочным заклинанием. И он может даже привести данные к пользовательским типам.
Для начала, вы создаете класс, который содержит необходимую вам информацию. Если вам нужно знать название Pivotal, номер телефона, URL web-сайта и информацию о pivotalsoftware, то ниже представленный класс как раз то, что вам нужно:
Как видите, это простой Java класс с горсткой полей и соответствующими методами их получения. Он содержит аннотацию @JsonIgnoreProperties библиотеки обработки JSON Jackson, которая показывает, что любые поля, не связанные с полями класса, должны быть проигнорированы.
Создание приложения исполняемым
Теперь вы можете создать Application класс, который использует RestTemplate для получения данных со страницы Pivotal на Facebook и преобразует в Page объект.
Т.к. библиотека обработки JSON Jackson доступна из classpath, RestTemplate будет использовать её(через message converter) для конвертации входящих JSON данных в Page объект. Затем, содержимое Page объекта будет напечатано на консоли.
Сборка исполняемого JAR
Вы можете собрать единый исполняемый JAR-файл, который содержит все необходимые зависимости, классы и ресурсы. Это делает его легким в загрузке, версионировании и развертывании сервиса как приложения на протяжении всего периода разработки, на различных средах и так далее.
Затем вы можете запустить JAR-файл:
Если вы используете Maven, вы можете запустить приложение, используя mvn spring-boot:run , либо вы можете собрать приложение с mvn clean package и запустить JAR примерно так:
Процедура, описанная выше, создает исполняемый JAR. Вы также можете вместо него собрать классический WAR-файл.Запуск сервиса
Если вы используете Gradle, вы можете запустить ваш сервис из командной строки:
Если вы используете Maven, то можете запустить ваш сервис таким образом: mvn clean package && java -jar target/gs-consuming-rest-0.1.0.jar .Как вариант, вы можете запустить ваш сервис напрямую из Gradle примерно так:
Вы должны увидеть следующее:
Поздравляем! Вы только что разработали простой REST-клиент, используя Spring.
Java - развертывание Spring Boot и настройка сервиса
Spring Boot по умолчанию интегрируется с веб-контейнером, а метод запуска запускается записью основной функции, как обычная Java-программа. Встроенный контейнер Tomcat или контейнер Jetty определяется конфигурацией (по умолчанию Tomcat). Конечно, вы также можете упаковать проект в пакет war и поместить его в отдельный веб-контейнер (Tomcat, weblogic и т. Д.). Конечно, перед этим вы должны внести простые изменения в вход в программу.
Мы используем Maven или Gradle для конструирования проекта, что сделает зависимости проекта, управление пакетом jar и развертывание пакета очень удобным.
1. Конфигурация встроенного сервера
После того, как Spring Boot создаст контейнер, он изменяет конфигурацию соответствующего сервера через файл конфигурации.
Сначала взгляните на следующий рисунок, который касается элементов конфигурации сервера:
Только некоторые из часто используемых конфигураций отмечены фиолетовым цветом. Часть, окруженную красной рамкой, можно понять, посмотрев на классификацию названий.
Краткое описание нескольких часто используемых конфигураций сервера:
Tomcat
Tomcat - контейнер по умолчанию для Spring Boot. Ниже приведены несколько распространенных конфигураций:
Jetty
Если вы хотите выбрать Jetty, это также очень просто: исключить зависимость tomcat в pom и добавить зависимость контейнера Jetty следующим образом:
тюк
Метод упаковки:
CMD входит в каталог проекта и использует для упаковки команду mvn clean package. Возьмем мой проект в качестве примера:
- Вы можете добавить параметр -Dmaven.test.skip = true, чтобы пропустить тест.
Упакованные файлы хранятся в целевом каталоге проекта, например: spring-boot-sample-0.0.1-SNAPSHOT.jar
Если pom настроен на использование пакета war, это spring-boot-sample-0.0.1-SNAPSHOT.war
Во-вторых, развернуть в контейнер JavaEE
- Измените класс запуска, унаследуйте SpringBootServletInitializer и переопределите метод настройки.
- Измените банку в файле POM для войны
- Изменить пом, исключить плагин Tomcat
- Упакуйте и разверните в контейнер
После упаковки с помощью команды mvn clean package он развертывается в веб-контейнере как обычный проект J2EE.
В-третьих, используйте профиль, чтобы отличить среду
Загрузку Spring можно настроить в «файле конфигурации», «классе кода Java», «конфигурации журнала», чтобы различать результаты выполнения в разных средах.
1. Файл конфигурации
Файлы конфигурации application.yml и application.properties отличаются
Взять в качестве примера application.properties, выделить среду по имени файла application- .properties
application.properties
- application-stg.properties
- При запуске программы укажите конкретную конфигурацию, добавив --spring.profiles.active =
Например, мы выполняем java -jar demo.jar –spring.profiles.active = dev. Как будет применяться содержимое трех указанных файлов?
Spring Boot сначала загрузит файл конфигурации по умолчанию, а затем использует конфигурацию в указанном профиле для переопределения конфигурации по умолчанию.
app.name существует только в файле конфигурации по умолчанию application.properties, потому что такая же конфигурация не существует в указанной среде, поэтому это значение не будет перезаписано.
server.port по умолчанию равен 8080, но после того, как мы укажем среду, она будет перезаписана. Если указано окружение stg, server.port равен 8082
spring.profiles.active определяет среду разработки по умолчанию. Если мы укажем -spring.profiles.active = stg во время выполнения, будет применена среда stg. Окончательное значение server.port равно 8082
2. Аннотация аннотации в классе Java
Следующие 2 разных класса реализуют один и тот же интерфейс, а аннотация @Profile указывает конкретную среду
3. logback-spring.xml также поддерживает узлы для поддержки дифференциации
Опять же, не используйте logback.xml для имени файла, используйте logback-spring.xml
В-четвертых, укажите внешний файл конфигурации
Некоторые системы, такие как некоторые базы данных или другие сторонние учетные записи и другая информация, из-за проблем безопасности, их конфигурация не будет настроена заранее в проекте, представленном разработчикам.
В этом случае, когда мы запускаем программу, мы можем указать внешний файл конфигурации через параметры.
Взяв в качестве примера demo.jar, метод выглядит следующим образом:
- Имя файла свободно определяется и не имеет фиксированных требований.
В-пятых, создайте сценарий sh для приложения Linux
Следующие скрипты предназначены только для справки, пожалуйста, настройте в соответствии с вашими потребностями
start.sh
В-шестых, используйте сервис Linux для запуска, остановки, перезапуска
1. Сначала настройте плагин в pom.xml
Обратите особое внимание <executable>true</executable>
2. Затем используйте его как обычно mvn clean package -Dmaven.test.skip=true Соберите проект в пакет jar
3. Загрузите пакет JAR на сервер, предполагая, что путь развертывания /var/apps/myapp.jar Используйте команду, чтобы установить мягкое соединение с /etc/init.d Каталог, команда:
- среди /etc/init.d/myapp Последний myapp может быть другим именем, это имя сервиса, мы будем использовать его позже запуск службы [имя службы] Для начала (объяснено ниже).
4. Чтобы предоставить исполняемый файл прав доступа к файлу jar, введите команду:
- 5. Далее вы можете использовать то, с чем мы знакомы service myapp start|stop|restart|status Давайте запустим и остановим приложение.
После выполнения команды вы получите отзыв типа Started | Stopped [PID].
Путь к файлу PID по умолчанию: /var/run/appname/appname.pid
Путь к файлу журнала службы по умолчанию: /var/log/appname.log (можно изменить с помощью следующего .conf LOG_FOLDER )
6. Используйте пользовательский файл .conf для изменения конфигурации по умолчанию следующим образом:
Создайте файл .conf по тому же пути к пакету jar, имя которого должно совпадать с именем .jar, например myapp.conf (если упакованный файл jar - myapp-1.0.0. jar Тогда файл conf здесь также должен быть myapp-1.0.0.conf), и его содержимое может быть следующим:
- Примечание: каталог папки, соответствующий LOG_FOLDER, должен существовать. Если каталог не существует, служба не будет создавать каталог с тех пор.
Великолепная разделительная линия
Если вы CentOS 7 или Red Hat 7 или выше, вы также можете использовать следующий метод для решения этой проблемы: зачем использовать этот метод (пожалуйста, сделайте свое собственное исследование), результаты представлены непосредственно здесь, ха-ха
Отредактируйте файл службы vim /usr/lib/systemd/system/myapp.service
После использования Linux 7 для запуска новой службы, связанные команды
Читайте также: