App Engine — это не инструмент для «ленивых» разработчиков. Это больше, чем просто простой способ развернуть ваше приложение. App Engine охватывает масштабирование, доступность, ведение журналов и многое другое.

Более 4 лет я очень скептически относился к таким решениям, в моих глазах они «ограничивали» вашу архитектурную свободу. Несколько месяцев назад я понял, как ошибался. Позвольте мне показать вам небольшой пример, который мне пришлось масштабировать один раз.

Для лучшего UX, пожалуйста, откройте эту статью на Quarkify.

Маленькая история

Я был вовлечен в небольшой стартап, который работает по всему миру. Допустим, они зарабатывают 10 000 долларов в месяц, минус зарплата разработчиков, минус эксплуатационные расходы, минус небольшие расходы, которые мы оставили с «можем ли мы тратить как можно меньше на серверные расходы?». На следующем рисунке показана начальная архитектура.

Внешнего хранилища и SQL изначально не было, все эти сервисы были в виртуалке, но я решил наглядно показать, что есть в приложении. Все для всех цена была около 6 долларов. Как масштабировалось? Остановите экземпляр, измените масштаб ЦП и памяти, запустите снова. Первой идеей, конечно же, было использование Kubernetes. Вот уже более масштабируемая версия:

Это уже нечто более красивое, но, давайте посчитаем, сколько мы потратим на эту красоту:

  1. Вы используете GKE все время, а это значит, что вы платите за 3 узла, что составляет 157 долларов США в месяц с годовым обязательством.
  2. Балансировщик нагрузки будет стоить 22 доллара за 100 ГБ трафика.
  3. 100 ГБ хранилища обойдутся в $2,60.
  4. Cloud SQL будет стоить 88 долларов в месяц с 3 экземплярами и скидкой 30%.

Итого $271,65 за 1 месяц. Что составляет около $ 3259 в год. Ничего себе, наверное, не лучшее решение для небольшого стартапа. Проблема возникает, когда мы смотрим на использование сервиса по часам. Большая часть трафика поступает из Европы и США в полдень. В эти пики нам нужна полная мощность, а в другое время (особенно с 24:00 до 6:00) нам нужно как можно меньше.

Quarkus в App Engine

В конце статьи вы увидите, сколько мы сэкономили на выборе решения App Engine, но уже сейчас могу сказать, что оно было правильным. У них есть бесплатная квота, которая покроет начальный этап, когда у вас ноль или небольшое количество людей, пользующихся вашим сервисом. И если вы превысите этот лимит, вы заплатите за это разумную цену. Начнем с простого примера.

Настройка ядра приложения

Откройте Google Cloud Console, найдите App Engine с помощью поиска или бокового меню.

Нажмите «Создать приложение»

Затем вы выбираете регион, ближайший к вашим клиентам, масштабирование региона может быть выполнено с помощью различных дополнительных услуг, но они выходят за рамки этой статьи. Затем выберите язык Java и стандартную среду и нажмите «Далее».

Это все на данный момент. Вам нужно иметь gcloud util в вашей локальной среде, если нет, установите его здесь. Затем вам нужно будет позвонить gcloud init, указать свой проект и регион. Это все для настройки, давайте настроим наш проект.

Настроить проект Quarkus

Получите проект, который хотите разместить на App Engine или создайте новый

Мы будем использовать плагин maven для развертывания нашего приложения. У нас есть <build><plugins> объем, поместите следующие жирные строки в ваш pom.xml

<plugin>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>${surefire-plugin.version}</version>
  <configuration>
    <systemProperties>
      <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
    </systemProperties>
  </configuration>
</plugin>
<plugin>
  <groupId>com.google.cloud.tools</groupId>
  <artifactId>appengine-maven-plugin</artifactId>
  <version>2.2.0</version>
  <configuration>
    <projectId>GCP_PROJECT_ID</projectId>
    <version>${appengine.build.number}</version>
    <artifact>${project.build.directory}/${project.build.finalName}-runner.jar</artifact>
  </configuration>
</plugin>
</plugins>

Замените GCP_PROJECT_ID идентификатором вашего проекта. Нам также нужно добавить переменную appengine.build.number в область видимости properties.

<properties>
  ...
  <surefire-plugin.version>2.22.1</surefire-plugin.version>
  <appengine.build.number>0-0-1</appengine.build.number>
</properties>

Вот и все. У нас есть еще два действия. Во-первых, вам нужно перенаправить порт HTTP на любой, который App Engine предоставит в application.properties

quarkus.http.port=${PORT:8080}

App Engine может использовать любой порт для приложения, это делается для целей совместного использования. У вас будет персонализированный URL-адрес с названием проекта, поэтому вам не нужно думать о том, на каком порту работает ваше приложение.

А во-вторых, нам нужен файл YAML, описывающий, как создать ваше приложение. Я положил их в src/main/appengine/app.yaml

runtime: java11
instance_class: F1

Указываем, что используем java11, а также тип экземпляра F1, F1 имеет 256 МБ памяти и 600 МГц ЦП, чего должно быть более чем достаточно для многих целей. Имейте в виду, что это настройки для одиночного развертывания, App Engine будет масштабировать их в зависимости от нагрузки.

Вот и все, давайте наслаждаться нашим развертыванием:

./mvnw clean package appengine:deploy

В выводе вы увидите ссылку, которая заканчивается на *.appspot.com. Это ссылка, которую вы можете использовать для доступа к вашему сервису. Нажмите на нее, и вы увидите наш любимый экран приветствия Quarkus.

Просмотр журналов

Это круто и все такое, но как, спросите вы меня, я могу рассматривать любые проблемы, возникающие с моей службой? И вообще логи. А я вам скажу, что смотреть логи можно как из командной строки, так и из симпатичного логгера на консоли.

Просмотр логов через командную строку

Чтобы просмотреть журналы из командной строки, просто используйте следующую команду.

gcloud app logs tail -s default

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

Просмотр журналов онлайн

Иногда лучше посмотреть конкретный журнал онлайн. Это легко: снова откройте страницу App Engine, перейдите к версиям, щелкните раскрывающийся список Tools рядом с версией приложения, и вы получите Logs.

Оттуда все просто.

Отладка Quarkus из консоли GCP

Какие? Вы можете сделать это? Да, конечно. Вы можете отлаживать свое приложение без перезапуска, повторного развертывания или любой другой магии, которую вы обычно делаете.

На предыдущем экране рядом с Logs у вас есть кнопка Debug, нажмите на нее, откроется окно отладчика. Отладчик — это еще одна служба, которую Google предоставляет, чтобы помочь вам лучше управлять своим приложением и быстрее справляться с любыми проблемами. Вам будет предложено предоставить доступ к вашему исходному коду, это требуется для любого удаленного отладчика, потому что ваш jar содержит только скомпилированный код, который не соответствует построчно исходному коду. Кроме того, предоставьте любой доступ к Github или вашему git-провайдеру.

Теперь вы увидите список всех исходных файлов, которые у вас есть, откройте ExampleResource.java (или любой другой) и поставьте точку останова на операторе return.

Затем выполните эту конечную точку (например, из браузера)

curl https://your-app-id/hello

Как только вы увидите синюю линию, это означает, что вы поймали свой звонок (или чей-то другой, если у вас уже есть пользователи).

Справа вы увидите знакомый вид стека, переменных и условий:

Вы можете указать любые условия, при которых вы хотите, чтобы отладчик зафиксировал их, и как только они будут там, вы сможете увидеть все доступные переменные и трассировку стека, откуда выполняется ваш код. Он не сравнится с отладчиком IDE, но все же достаточно впечатляет и может быть полезен, если вы хотите зафиксировать что-то, что происходит очень-очень редко и конкретными пользователями. Вы можете хранить моментальные снимки захваченных казней, что очень полезно.

В заключении

Благодаря App Engine мне удалось сократить расходы с возможных 200–400 долларов до всего 50, иногда не было никаких расходов в течение нескольких дней, потому что ниже определенной суммы был бесплатный уровень. Была еще одна вещь, которую я изменил, и это замена MySQL на Firestore, что является темой для следующей статьи 😉

App Engine не для любого варианта использования, вы не можете запускать сокеты там (однако есть специальный Stream API, который может это сделать), вы ограничены 30 секундами по умолчанию. Но это может принести пользу многим различным приложениям, особенно за счет экономии большого количества часов простоя, когда App Engine может сбросить количество экземпляров до нуля. Принимая это во внимание, ваше приложение должно быть очень быстрым при запуске, и здесь Quarkus сияет очень ярко.

Думайте также нестандартно, вы не обязаны использовать только App Engine или только Kubernetes. Почему бы не смешать их?

Первоначально опубликовано на https://quarkify.net 1 мая 2020 г.