Развертывание Spring Boot приложений на Heroku
При разработке веб-приложения естественным шагом является его подключение к сети и предоставление его конечным пользователям. Чтобы сделать эту задачу проще, для размещения вашего приложения доступно множество облачных платформ - Heroku - одна из них.
Heroku предоставляет платформу в качестве службы для развертывания приложений различных технологических стеков, таких как Node, Java, Python и т.д. Она заботится обо всех сложных аспектах развертывания, инфраструктуры, масштабирования, обновления, безопасности и т.д. И позволяет нам сосредоточиться на логика приложения и предоставление большей ценности нашим конечным пользователям, а не развертывание.
В этой статье мы создадим действительно простое API-приложение Spring Boot REST, которое предоставит конечную точку, и рассмотрим различные способы развертывания приложения в Heroku.
Создание приложения Spring Boot
Инициализация приложения Spring Boot
Как всегда, самый простой способ начать со скелетного проекта Spring Boot - это использовать Spring Initializer:
Выберите предпочитаемый инструмент для сборки, мы будем использовать Maven. Единственная зависимость, в которой мы нуждаемся, - это зависимость от Spring Web.
В качестве альтернативы мы можем создать приложение с помощью Spring Boot CLI:
spring init --dependencies=web heroku-demo
Создать конечную REST точку
Сделав скелет, давайте добавим простую конечную точку REST:
@RestController
@RequestMapping("/api/v1.0")
public class TimeController {
@GetMapping("/time")
@ResponseStatus(HttpStatus.OK)
public String getCurrentTime() {
return Instant.now().toString();
}
}
В случае, если вы не знакомы с аннотацией @RestController
, это удобство аннотация выполнена в виде комбинации из @Controller
и @ResponseBody
.
Эта конечная точка просто возвращает текущее время сервера по запросу. Давайте запустим приложение на нашей локальной машине и проверим, работает ли оно:
mvn spring-boot:run
Или, используя вашу IDE, просто запустите приложение и перейдите по URL-адресу вашего браузера localhost:8080/api/v1.0/time
:
В качестве альтернативы вы можете использовать curl
:
curl -X GET 'http://localhost:8080/api/v1.0/time'
2020-01-04T13:19:30.980Z
Развертывание в Heroku
Подготовив наше приложение, давайте рассмотрим различные способы его развертывания в Heroku.
Использование Heroku CLI с Git
Heroku предлагает собственный CLI, который мы можем использовать для развертывания приложения. Для этого нам нужно установить Heroku CLI и Git.
Прежде чем мы попытаемся развернуть его на Heroku, необходимо, чтобы приложение находилось в репозитории Git, поэтому давайте создадим репозиторий в каталоге нашего проекта:
git init
После того, как репозиторий создан, давайте добавим и зафиксируем файлы:
git add src/ pom.xml
git commit -m "first commit with project base"
Следующий шаг - войти в Heroku с помощью интерфейса командной строки Heroku и создать приложение Heroku:
heroku login
Он запросит адрес электронной почты и пароль для вашей учетной записи Heroku:
Enter your Heroku credentials:
Email: ***********@gmail.com
Password: ***********
Logged in as **********@gmail.com
После того, как мы вошли в систему, давайте создадим приложение:
heroku create
Относительно быстро мы будем привязаны к приложению:
Creating app... done, ⬢ arcane-journey-46830
https://arcane-journey-46830.herokuapp.com/ | https://git.heroku.com/arcane-journey-46830.git
Наконец, мы можем развернуть наш код:
git push heroku master
Heroku обнаружит, что это приложение Java / Maven по наличию файла pom.xml
в хранилище. После нажатия, если вы посмотрите на журналы, вы сможете заметить:
Enumerating objects: 26, done.
Counting objects: 100% (26/26), done.
Delta compression using up to 4 threads
Compressing objects: 100% (21/21), done.
Writing objects: 100% (26/26), 2.96 KiB | 504.00 KiB/s, done.
Total 26 (delta 5), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Java app detected
remote: -----> Installing JDK 1.8... done
remote: -----> Installing Maven 3.6.2... done
remote: -----> Executing Maven
...
И, наконец, развертывание завершено, и нам предлагается URL-адрес, ведущий к нашему приложению:
...
remote: -----> Compressing...
remote: Done: 65.7M
remote: -----> Launching...
remote: Released v3
remote: **https://arcane-journey-46830.herokuapp.com/** deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/arcane-journey-46830.git
* [new branch] master -> master
Давайте снова протестируем приложение, используя curl
:
curl -X GET 'https://arcane-journey-46830.herokuapp.com/api/v1.0/time'
2020-01-04T13:51:31.559Z
Или перейдя в наш браузер по его URL:
Heroku Deploy Plugin
Если мы хотим развернуть наше приложение напрямую, без использования Git-репозитория, мы можем сделать это с помощью плагина heroku-cli-deploy
. Давайте начнем с его установки:
heroku plugins:install heroku-cli-deploy
Как и в предыдущем разделе, мы просим Heroku создать приложение, но на этот раз мы включили аргумент --no-remote
, чтобы не запрашивать репозиторий Git:
heroku creare heroku-demo-stackabuse --no-remote
Обратите внимание, что на этот раз мы упомянули имя приложения - heroku-demo-stackabuse
. Это создаст приложение с заданным именем, а не сгенерирует случайное имя, как в предыдущем разделе.
Мы также должны упомянуть порт, с которым Heroku будет связывать приложение в файле application.properties
:
server.port=${PORT:8080}
Примечание: Это необходимо, поскольку Heroku связывает приложение с портом, передаваемым в качестве переменной среды PORT
, а Spring Boot по умолчанию предоставляет порт 8080
. Здесь мы просим Spring использовать PORT
или 8080
если переменная окружения отсутствует, т.е. мы работаем локально.
Наконец, мы создаем наше приложение с Maven, чтобы создать jar
файл и развернуть его:
mvn clean package
heroku deploy:jar target/heroku-demo.0.0.1-SNAPSHOT.jar --app heroku-demo-stackabuse
Плагин Maven
Возможны сценарии, в которых мы хотели бы выполнить развертывание как часть нашей сборки Maven. Это возможно с помощью плагина Heroku Maven. Давайте разместим конфигурацию плагина в нашем pom.xml
:
...
org.springframework.boot
spring-boot-maven-plugin
com.heroku.sdk
heroku-maven-plugin
{version}
heroku-demo-stackabuse
false
${project.build.directory}/${project.build.finalName}.jar
1.8
java $JAVA_OPTS -jar
${project.build.directory}/${project.build.finalName}.jar
...
Всегда проверяйте последнюю версию плагина здесь.
В качестве последнего шага нам нужно установить переменную окружения - HEROKU_API_KEY
. Этот шаг требуется только в том случае, если у вас не зарегистрирован Heroku CLI для авторизации. Ключ API можно найти в учетной записи Heroku на панели инструментов:
И теперь мы можем использовать heroku:deploy
для развертывания приложения:
mvn clean heroku:deploy
Панель инструментов Heroku с GitHub
С CLI подходами в стороне, есть также действительно удобный подход GUI. Мы можем создать приложение на панели инструментов Heroku, связать его с учетной записью GitHub и развернуть оттуда.
Перейдите к опции «new app»:
Затем подключите свою учетную запись GitHub и найдите свой репозиторий для подключения:
После подключения вы можете развернуть свое приложение, выбрав ветвь для развертывания или непосредственно выбрав основную ветвь. Также вы можете включить автоматическое развертывание на основе коммитов в конкретной ветке:
Проверка журналов развернутых приложений
Проверка журналов развернутого приложения может быть полезна для многих целей. К счастью, к ним действительно легко получить доступ.
Используя CLI, это всего лишь одна команда:
heroku logs --tail
Это позволит увидеть запущенные журналы:
Кроме того, панель инструментов Heroku позволяет нам получать к ним доступ с right-hand More > View Logs
:
Heroku Procfile
PROCFILE можно использовать для настройки приложения конфигурирования или переопределения по умолчанию и команд. Например, при развертывании приложения с помощью плагина Heroku мы добавили информацию о портах в application.properties
.
Это также может быть добавлено в Procfile. Мы бы добавили команды для запуска приложения, такие как:
web: java $JAVA_OPTS -jar target/heroku-demo-0.0.1-SNAPSHOT.jar -Dserver.port=$PORT
Здесь мы добавили команду для запуска приложения с Java и добавили аргумент JVM для переопределения привязки порта Spring Boot по умолчанию.
Удаление приложения из Heroku
В какой-то момент вы можете удалить свое приложение из Heroku по любой причине. Это делается с помощью простой команды:
heroku apps:destroy --confirm arcane-journey-46830
Мы можем запустить команду без флага --confirm
, но в этом случае она предложит ввести имя приложения.
В качестве альтернативы, мы можем удалить приложение из настроек Heroku Dashboard:
Вывод
С ростом популярности облачных вычислений важно знать, как мы можем развертывать и управлять нашим приложением на облачной платформе.
Heroku - это платформа как сервис для развертывания, управления и масштабирования приложений. Он также обеспечивает бесплатное развертывание с бесплатными динамометрами. Это бесплатное развертывание может использоваться для любых демонстрационных или оценочных целей, но определенно не подходит для рабочих приложений реального времени.