У вас включен AdBlock или иной блокировщик рекламы.

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

Спасибо за понимание.

В другой раз
DevGang блог о програмировании
Авторизоваться

Развертывание 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:

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:

...
<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.heroku.sdk</groupId>
                <artifactId>heroku-maven-plugin</artifactId>
                <version>{version}</version>
                <configuration>
                    <appName>heroku-demo-stackabuse</appName>
                    <includeTarget>false</includeTarget>
                    <includes>
                        <include>${project.build.directory}/${project.build.finalName}.jar</include>
                    </includes>
                    <jdkVersion>1.8</jdkVersion>
                    <processTypes>
                        <web>java $JAVA_OPTS -jar
                            ${project.build.directory}/${project.build.finalName}.jar</web>
                    </processTypes>
                </configuration>
            </plugin>
        </plugins>
    </build>
...

Всегда проверяйте последнюю версию плагина здесь.

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

Источник:

#Java
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться