Google Cloud

Перед началом работы с руководством создайте учетную запись и убедитесь, что у вас есть доступ к консоли Google Cloud. Мы будем использовать Google App Engine для развертывания приложения.

В качестве базы данных будет использоваться PostgreSQL.

Установка SDK

Установите Cloud SDK. См. документацию.

Установите компонент app-engine-java:

gcloud components install app-engine-java

Настройка проекта Google Cloud

Чтобы запустить приложение в Google Cloud, создайте Project. Внутри проекта вам нужно создать Application, которое будет запускать развернутый JAR-файл, и Database, которая будет использоваться приложением. Для этого мы будем использовать интерфейс командной строки Google Cloud SDK, но также можно использовать веб-консоль Google Cloud.

Первый шаг – это создание проекта. Введите следующую команду в терминале:

gcloud init

После выполнения этой команды вам будет задан вопрос о конфигурации init. Инициализируйте с новой конфигурацией, используя свою учетную запись, и создайте новый проект. В этом примере будет использоваться имя jmix-application.

This account has no projects.

Would you like to create one? (Y/n)?  Y

Enter a Project ID. Note that a Project ID CANNOT be changed later.
Project IDs must be 6-30 characters (lowercase ASCII, digits, or
hyphens) in length and start with a lowercase letter. *jmix-application*

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

Для этого найдите ID своей платежной учетной записи:

gcloud alpha billing accounts list

Вы должны увидеть результат, похожий на этот:

ACCOUNT_ID            NAME                OPEN  MASTER_ACCOUNT_ID
019961-BB112F-B3C8E6  My Billing Account  True

Свяжите свой проект с ID учетной записи, выполнив команду с этим ID в качестве параметра:

gcloud alpha billing projects link jmix-application --billing-account=019961-BB112F-B3C8E6

Далее необходимо настроить проект по умолчанию для Google Cloud SDK и включить следующие облачные API, которые нужны нам для развертывания приложения:

  • SQL Admin API

  • Cloud Build API

  • Cloud Debugger API

gcloud config set project jmix-application
gcloud services enable sqladmin.googleapis.com
gcloud services enable cloudbuild.googleapis.com
gcloud services enable clouddebugger.googleapis.com

Следующий шаг: создайте приложение Google App Engine внутри проекта. Это приложение будет отвечать за запуск загруженного JAR-файла. Чтобы создать приложение, выполните следующую команду в консоли:

gcloud app create

В списке географических местоположений выберите одно из них для развертывания вашего приложения. В этом примере мы будем использовать europe-west2.

После того как приложение создано, мы можем настроить базу данных. Имя БД будет sampledb. Она будет создана внутри экземпляра PostgreSQL с именем sample. Экземпляр будет размещен в том же регионе и зоне, что и приложение – europe-west2.

Для типа базы данных PostgreSQL нужно указать параметры сервера. Вы можете найти все возможные параметры (процессор и память) на этой странице.

Чтобы создать экземпляр базы данных PostgreSQL, выполните следующую команду:

gcloud sql instances create sample --database-version=POSTGRES_12 --tier=db-custom-1-3840 --region=europe-west2

Создайте базу данных для приложения и измените пароль пользователя по умолчанию, используя следующие команды:

gcloud sql databases create sampledb --instance=sample
gcloud sql users set-password postgres --instance=sample --prompt-for-password

Наша база данных запущена. Чтобы продолжить, запишите следующую информацию:

  • Имя БД (in this example sampledb).

  • Имя пользователя БД (по умолчанию это postgres).

  • Пароль БД (который вы назначили при создании базы данных)

  • Специфичное для Cloud имя подключения экземпляра.

Получите имя подключения экземпляра в формате project-id:zone-id:instance-id, выполнив следующую команду:

gcloud sql instances describe sample

Найдите свойство connectionName в выходных данных. В нашем случае оно будет выглядеть как jmix-application:europe-west2:sample.

Облачная среда настроена и готова.

Подготовка приложения

Определение подключения к БД

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

Для переключения между различными конфигурациями мы будем использовать Профили среды выполнения. В нашем случае имя профиля будет gae.

Создадим файл application-gae.properties в соответствии с правилами именования, описанными в документации Spring Boot.

В этом файле нужно указать свойства подключения к БД и специфичный для Cloud путь к контексту диагностики приложения Spring Boot.

Для нашего приложения файл может выглядеть следующим образом:

gae.conn.name = jmix-application:europe-west2:sample
gae.database = sampledb

main.datasource.username = postgres
main.datasource.password = <password that you specified>
main.datasource.url = jdbc:postgresql://google/${gae.database}?useSSL=false&cloudSqlInstance=${gae.conn.name}&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=${main.datasource.username}&password=${main.datasource.password}

management.contextPath = /_ah

Специфичные для Cloud настройки

Чтобы запустить приложение в Google Cloud AppEngine, необходимо создать файл конфигурации среды выполнения с именем app.yaml. Создайте этот файл в своем исходном коде, путь: src/main/appengine/app.yaml.

В этом файле нужно указать среду выполнения приложения, переменные окружения и параметры масштабирования. Вы можете найти более подробную информацию о файле конфигурации в документации Google Cloud.

Для нашего случая укажем минимальный набор параметров:

  • Java 17 как среда выполнения.

  • Имя активного профиля Spring runtime (gae).

  • Путь к временному каталогу.

  • Отсутствие масштабирования.

Файл будет выглядеть следующим образом:

runtime: java11
env_variables:
  SPRING_PROFILES_ACTIVE: "gae"
  JMIX_CORE_WORKDIR: "/tmp/.jmix/work"
manual_scaling:
  instances: 1

Приложение настроено, теперь нам нужно изменить сценарий сборки, чтобы включить развертывание приложения с помощью Google Cloud SDK.

Задача развертывания

Во-первых, нам нужно добавить плагин Google Cloud для импорта его задач Gradle. Сделайте это, указав в начале скрипта сборки следующее:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.google.cloud.tools:appengine-gradle-plugin:2.4.1'
    }
}

Затем нам нужно применить этот плагин вместе с плагином Spring Boot. Добавьте следующую строку в качестве дополнения к приложению плагина Spring Boot:

apply plugin: 'com.google.cloud.tools.appengine'

В разделе зависимости добавьте облачный коннектор:

implementation('com.google.cloud.sql:postgres-socket-factory:1.2.0') {
    exclude group: 'com.google.guava', module: 'guava'
}

Наконец, добавьте определение задачи развертывания в конец файла сборки и укажите в нем ID проекта:

appengine {  // App Engine tasks configuration
    deploy {   // deploy configuration
        projectId = 'jmix-application'
        version = '1'
    }
    stage {
        artifact = "${buildDir}/libs/${project.name}-${project.version}.jar"
    }
}

Теперь приложение готово к развертыванию.

Развертывание приложения

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

./gradlew appengineDeploy

Gradle будет использовать Google Cloud SDK и загрузит JAR-файл приложения в облачную среду выполнения.

Вы увидите консольный вывод, похожий на этот:

Beginning deployment of service [default]...
Created .gcloudignore file. See `gcloud topic gcloudignore` for details.
#============================================================#
#= Uploading 1 file to Google Cloud Storage                 =#
#============================================================#
File upload done.
Updating service [default].............................done.
Setting traffic split for service [default]..................................done.
Deployed service [default] to [https://jmix-application.nw.r.appspot.com]

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