Статьи

Развертывание приложений Java и Play Framework в облаке с Джеймсом Уордом

Вчера я посетил презентацию Джеймса Уорда « Развертывание приложений Java и Play Framework в облаке» на Devoxx. Я прибыл немного поздно, но все же успел добраться вовремя, чтобы увидеть много демо и узнать больше о Heroku . Ниже приведены мои заметки из выступления Джеймса.

Когда я приехал, Джеймс делал демо, используя Spring Roo . Он использовал пример приложения Roo’s Petclinic и показал нам, как можно использовать Git для создания локального репозитория нового проекта и установки инструмента командной строки Heroku. Оттуда он запустил следующую команду, чтобы создать новое приложение на Heroku.

heroku create -s cedar

Cedar Stack является то , что поддерживает Java, Scala и Play Framework. Это стек 3-го поколения для Heroku. Приведенная выше команда создала две конечные точки, одну для HTTP и одну для Git. Он выбирает из списка случайно сгенерированных имен, в которых, похоже, есть какой-то юмор. Джеймс закончил с «электрическим мечом-8877» для этой демонстрации.

Оттуда он запустил мастер git push heroku, чтобы развернуть проект в Heroku. К сожалению, это привело к ошибке входа в систему и наступил неловкий момент, когда мы все подумали, что демо-боги злы. Тем не менее, Джеймс смог решить эту проблему с помощью функции обмена Heroku с помощью следующей команды.

heroku sharing:add [email protected]

Для Java-проектов Heroku ищет файл pom.xml в корневом каталоге и запускает сборку Maven для проекта. Все зависимости загружаются в облако, а не помещаются в WAR-файл и требуют загрузки большого WAR-файла. Вам не нужно загружать свой исходный код в Heroku; Джеймс сделал это ради демо, потому что это было быстрее.

После завершения сборки создается файл слагов . Этот файл содержит все, что нужно Heroku для запуска вашего приложения.

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

heroku scale web=2

Он доказал, что это работает, запустив Heroku PS, который показал, что было два запущенных процесса. Он снова показал приложение, но отметил, что добавленная им запись отсутствует. Это связано с тем, что при запуске нового dyno Hibernate снова создал схему и удалил все записи. Чтобы исправить это, Джеймс изменил Hibernate, чтобы обновлять только схему, а не создавать новую. Если вы пользователь Hibernate, вы знаете, что это так же просто, как изменить:

hibernate.hbm2ddl.auto=create

чтобы:

hibernate.hbm2ddl.auto=update

После внесения этого изменения, Джеймс повторно использовал Git

git push heroku master

Файл slug был создан заново, и Heroku развернул новый slug на обеих dyno, автоматически распределив нагрузку между приложениями на двух серверах. Затем Джеймс запустил логи heroku, чтобы просмотреть логи своих динамов и доказать, что запрос к конечной точке HTTP его приложения делал запросы к обоим динамам. Регистрация ведется на основе Logplex, и вы можете прочитать о том, как это работает, в статье Heroku Gets Sweet Logging .

Джеймс упомянул, что у Roo есть плагин Heroku, но после просмотра его выступления и небольшого поиска в Интернете кажется, что это всего лишь установка для джета, как описано в разделе Начало работы с Spring MVC Hibernate на Heroku / Cedar .

Как насчет автомасштабирования? Есть некоторые сторонние инструменты, которые делают это. Инфраструктура управления Heroku имеет API, о которых говорят и эти инструменты. Heroku не встроила автоматическое масштабирование в платформу, потому что они не знают, где находятся узкие места в вашем приложении.

Heroku = Полиглот + PaaS + Облачные компоненты. Он поддерживает Ruby, node.js, Java, Clojure, Play и Scala, и они работают над поддержкой Grails и Gradle. В настоящее время на Heroku работает 534 374 приложения.

Heroku — это платформа облачных приложений, в которой есть 5 различных компонентов.

  1. Мгновенное развертывание
  2. HTTP-маршрутизация / балансировка нагрузки
  3. Эластичный полиглот Runtime
  4. Управление и логирование
  5. Компонент как сервисная экосистема

Для мгновенного развертывания это довольно простой процесс:

  • Вы добавляете файлы в git-репо
  • Вы предоставляете приложение на Heroku (создание геройки)
  • Вы загружаете файлы в Heroku (мастер git push heroku)
  • Heroku запускает сборку и собирает файл «слаг»
  • Heroku начинает «Дино»
  • Героку копирует «слизняк» в «динамо»
  • Heroku запускает веб-приложение

Большинство приложений будут содержать Procfile, который содержит информацию о том, как запустить веб-процесс. Для Spring Roo это имеет:

web: java $JAVA_OPTS -jar target/dependency/jetty-runner.jar --port $PORT target/*.war

Так как же Heroku решает, какой сервер приложений использовать? Это не так. Вы должны поместить свой сервер приложений в файл slug. Самый простой способ сделать это — указать свой сервер приложений в качестве зависимости в вашем pom.xml. В примере Roo Джеймс использует плагин maven-dependency-plugin, чтобы получить зависимость от jetty-runner и скопировать ее в целевой каталог. На Heroku вы берете с собой сервер приложений.

Heroku дает вам 750 бесплатных часов работы в месяц. Для разработчиков очень легко начать и использовать. Когда вы продлеваете время на одну динамо, это составляет 0,05 доллара в час, что составляет около 30 долларов в месяц. Только когда вы хотите масштабировать дальше одного динамометрического счета, где вы получаете плату от Heroku, независимо от того, сколько данных вы передаете. Scalatest работает на Heroku. У него есть одна динамограмма и с этим все в порядке. Билл Веннерс не должен ничего платить за это.

java.herokuapp.com — это сайт, созданный Джеймсом, который позволяет вам клонировать примеры приложений и быстро начать работу с кедровым стеком Heroku.

Для HTTP-маршрутизации Heroku использует систему маршрутизации на основе Erlang для маршрутизации всех HTTP-запросов через ваши dynos. Heroku не поддерживает липкие сессии. Распределенное управление сессиями не работает должным образом, потому что оно плохо масштабируется. Heroku рекомендует использовать веб-архитектуру без сохранения состояния или перевести ваше состояние в нечто вроде memcached . Jetty имеет (в последней версии) возможность автоматически сериализовать ваш сеанс в систему Mongo. Это отлично работает на Heroku. Проблема в том, что если у вас запущено 2 динамометра, каждый запрос может попадать в разные динамо и получать разные состояния сеанса. Отсюда и рекомендация для внешнего механизма хранения, который может синхронизироваться между dynos.

Вы также можете запускать не веб-приложения на Heroku. Вы можете иметь один веб-процесс, но столько не-веб-процессов, сколько хотите.

Heroku имеет встроенную поддержку платформы Play . Чтобы обнаружить приложения Play, найдите файл conf / application.conf . Вам не нужно иметь Procfile в корневом каталоге, потому что Heroku знает, как запустить приложение Play.

В этот момент Джеймс создал новое приложение Play, создал новое приложение Heroku (на этот раз он получил «young-night-7104») и отправил его в Heroku. Он создал простой объект модели, контроллер для добавления новых данных, а затем написал несколько jQuery для отображения новых записей через Ajax и JSON. Он также показал, как настроить приложение для связи с базой данных Heroku PostgreSQL с помощью переменной среды DATABASE_URL. Он объяснил, как вы можете использовать команду настройки heroku для просмотра переменных окружения.

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

Игра на Heroku поддерживает Scala, если вы создаете свое приложение с помощью Scala. Play 2.0 использует Scala, Akka и SBT. Heroku добавил поддержку SBT пару месяцев назад, так что все будет работать нормально.

Heroku также поддерживает Scala, обнаруживая его путем поиска файла build.sbt в корневом каталоге. Heroku поддерживает SBT 0.11.0 и создает задачу «stage». В настоящее время он не поддерживает Lift, потому что Lift использует более старую версию SBT и потому что это очень динамичная структура, которая требует липких сессий. Используйте Play, BlueEyes или Scalatra, если вы хотите Scala на Heroku.

Heroku имеет дополнения для добавления функциональности в ваше приложение, включая Custom DNS, HTTPS, Amazon RDS, NoSQL и многие другие. Они также работают над тем, чтобы сделать свои надстройки и API-интерфейсы управления доступными через Java, так что вы (надеюсь) сможете использовать их из своей IDE в будущем.

Оттуда Джеймс показал нам, как Heroku хранит файлы слагов, так что вы можете делать откаты с откатом heroku. Он также показал, как вы можете использовать:

heroku run "your bash command"

запустить любую команду Bash в облаке.

Резюме
Я присутствовал на выступлении Джеймса, потому что он хороший друг, а также потому, что я использовал Heroku для размещения своих последних приключений с Play, Scala, CoffeeScript и Jade . Я рад, что я присутствовал, потому что я узнал несколько хороших советов и приемов и больше о том, как работает Heroku.

Heroku кажется мне отличным инструментом разработки. По моему опыту, было очень приятно иметь мгновенное развертывание с использованием Git. Фактически, я создал псевдоним «push», чтобы я мог одновременно нажимать на репо и heroku моего проекта.

alias push='git push origin master && git push heroku master'

Я хотел бы видеть больше организаций, которые используют что-то вроде Heroku для разработчиков. Было бы здорово, если бы у каждого была своя песочница, которую могли видеть владельцы бизнеса и менеджеры по продукту. Я не могу не думать, что это было бы здорово для демонстраций, прототипирования и т. Д.

Были и другие разговоры, которые я хотел посетить в то же время, в частности, « Что ждет Scala у Мартина Одерского» ? и WWW: всемирное ожидание? Сравнение производительности веб-фреймворков Java . WWW доклад опубликовал свою презентацию, но я уверен, что было бы интереснее смотреть.

Довольно удивительно, что все переговоры с Devoxx 2011 скоро будут на
Parleys.com .

 

С http://raibledesigns.com/rd/entry/deploying_java_and_play_framework