Микросервис Rainbow Rumpus

1. Введение

Последнее обновление: 06.05.2021

Микросервисы Rainbow Rumpus

Вы когда-нибудь участвовали в снежной битве, где вы двигаетесь и в шутку бросаете снежки в других? Если нет, попробуйте когда-нибудь! Но теперь, вместо того чтобы рисковать получить физический удар, вы можете создать небольшой сетевой сервис (микросервис), который примет участие в эпической битве против других микросервисов, бросая радуги вместо снежков.

Возможно, вы задаетесь вопросом... Но как микросервис «бросает» радугу в другие микросервисы? Микросервис может получать сетевые запросы (обычно по HTTP) и возвращать ответы. Существует «менеджер арены», который отправляет вашему микросервису текущее состояние арены, а затем ваш микросервис отвечает командой, указывающей, что нужно сделать.

Конечно, цель — победа, но попутно вы узнаете о создании и развертывании микросервисов в Google Cloud.

Как это работает

Вы создадите микросервис, используя любую выбранную вами технологию (или выберете один из стартовых языков: Go, Java, Kotlin, Scala, NodeJS или Python), а затем развернете микросервис в Google Cloud. После развертывания вы сообщите нам URL-адрес вашего микросервиса, и мы добавим его в Arena.

Арена содержит всех игроков, участвующих в данном сражении. У Rainbow Rumpus будут свои собственные арены. Каждый игрок представляет собой микросервис, который перемещается и бросает радуги в других игроков.

Примерно раз в секунду наш менеджер арены будет вызывать ваш микросервис, отправляя текущее состояние арены (где находятся игроки), и ваш микросервис ответит командой, что нужно сделать. На арене вы можете двигаться вперед, поворачивать налево или направо, или бросать радугу. Радуга пролетит до трех клеток в направлении, куда смотрит игрок. Если радуга «попадет» в другого игрока, бросающий получает одно очко, а попавший теряет одно очко. Размер арены автоматически регулируется в зависимости от текущего количества игроков.

Вот как выглядела арена в прошлом:

20628e6bd442bd11.png

Пример арены «Битва Один»

Затяжные конфликты

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

Наблюдение за битвой

Чтобы увидеть, как ваш микросервис показывает себя в этой борьбе, загляните на интерактивную арену !

API битвы

Для работы с нашим менеджером арены вашему микросервису потребуется реализовать специальный API для участия в арене. Менеджер арены будет отправлять текущее состояние арены в виде HTTP POST-запроса на указанный вами URL-адрес в следующей JSON-структуре:

{
  "_links": {
    "self": {
      "href": "https://YOUR_SERVICE_URL"
    }
  },
  "arena": {
    "dims": [4,3], // width, height
    "state": {
      "https://A_PLAYERS_URL": {
        "x": 0, // zero-based x position, where 0 = left
        "y": 0, // zero-based y position, where 0 = top
        "direction": "N", // N = North, W = West, S = South, E = East
        "wasHit": false,
        "score": 0
      }
      ... // also you and the other players
    }
  }
}

Ваш HTTP-ответ должен иметь код состояния 200 (OK), а тело ответа должно содержать ваш следующий ход, закодированный в виде одного заглавного символа одного из следующих вариантов:

F <- move Forward
R <- turn Right
L <- turn Left
T <- Throw

Вот и все! Давайте рассмотрим развертывание микросервиса в Cloud Run , сервисе Google Cloud для запуска микросервисов и других приложений.

2. Войдите в Google Cloud.

Для развертывания вашего микросервиса в Cloud Run вам потребуется войти в Google Cloud. Мы зачислим средства на ваш счет, и вам не нужно будет вводить данные кредитной карты. Обычно проще использовать личную учетную запись (например, gmail.com) вместо учетной записи GSuite, поскольку иногда администраторы GSuite запрещают своим пользователям использовать определенные функции Google Cloud. Кроме того, веб-консоль, которую мы будем использовать, должна отлично работать в Chrome или Firefox, но может иметь проблемы в Safari.

3. Развертывание микросервиса

Вы можете создать свой микросервис, используя любую технологию, и развернуть его где угодно, если он доступен публично и соответствует API Battle. Но чтобы упростить задачу, мы поможем вам начать с примера сервиса и развернуть его в Cloud Run.

Выберите образец для начала.

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

Kotlin и Spring Boot

Источник

Kotlin и Micronaut

Источник

Kotlin & Quarkus

Источник

Java и Spring Boot

Источник

Java & Quarkus

Источник

Идти

Источник

Node.js и Express

Источник

Python и Flask

Источник

После того, как вы определитесь с примером для начала, нажмите кнопку «Развернуть в Cloud Run» выше. Это запустит Cloud Shell (веб-консоль для виртуальной машины в облаке), где исходный код будет клонирован, затем собран в развертываемый пакет (образ контейнера Docker), который затем будет загружен в реестр контейнеров Google и развернут в Cloud Run .

При запросе укажите регион us-central1 .

На скриншоте ниже показан вывод Cloud Shell при сборке и развертывании микросервиса.

d88e40430706a32b.png

Проверьте работоспособность микросервиса.

В Cloud Shell вы можете отправить запрос к своему только что развернутому микросервису, заменив YOUR_SERVICE_URL на URL-адрес вашего сервиса (который в Cloud Shell находится после строки "Ваше приложение теперь работает здесь"):

curl -d '{
  "_links": {
    "self": {
      "href": "https://foo.com"
    }
  },
  "arena": {
    "dims": [4,3],
    "state": {
      "https://foo.com": {
        "x": 0,
        "y": 0,
        "direction": "N",
        "wasHit": false,
        "score": 0
      }
    }
  }
}' -H "Content-Type: application/json" -X POST -w "\n" \
  https://YOUR_SERVICE_URL

В ответ вы должны увидеть строку, содержащую либо F , L , R , либо T

4. Запрос на включение в программу арены.

Чтобы присоединиться к Rainbow Rumpus, вам нужно присоединиться к арене. Откройте rainbowrumpus.dev , нажмите «Присоединиться» на арене, где вы укажете URL вашего микросервиса.

5. Внесение и развертывание изменений

Прежде чем вносить изменения, необходимо настроить в Cloud Shell некоторую информацию о проекте GCP и используемом примере. Сначала перечислите свои проекты GCP:

gcloud projects list

Скорее всего, у вас только один проект. Скопируйте PROJECT_ID из первого столбца и вставьте его в следующую команду (заменив YOUR_PROJECT_ID на фактический идентификатор вашего проекта), чтобы установить переменную среды, которую мы будем использовать в последующих командах:

export PROJECT_ID=YOUR_PROJECT_ID

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

# Copy and paste ONLY ONE of these
export SAMPLE=kotlin-micronaut
export SAMPLE=kotlin-quarkus
export SAMPLE=kotlin-springboot
export SAMPLE=java-quarkus
export SAMPLE=java-springboot
export SAMPLE=go
export SAMPLE=nodejs
export SAMPLE=python

Теперь вы можете редактировать исходный код своего микросервиса прямо из Cloud Shell. Чтобы открыть веб-редактор Cloud Shell, выполните следующую команду:

cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md

Затем вы увидите дальнейшие инструкции по внесению изменений.

f910c9ef7b51c406.png

Cloud Shell с редактором и открытым примером проекта.

После сохранения изменений запустите приложение в Cloud Shell, используя команду из файла README.md , но сначала убедитесь, что вы находитесь в правильном каталоге с примерами в Cloud Shell:

cd cloudbowl-microservice-game/samples/$SAMPLE

После запуска приложения откройте новую вкладку Cloud Shell и протестируйте сервис с помощью curl:

curl -d '{
  "_links": {
    "self": {
      "href": "https://foo.com"
    }
  },
  "arena": {
    "dims": [4,3],
    "state": {
      "https://foo.com": {
        "x": 0,
        "y": 0,
        "direction": "N",
        "wasHit": false,
        "score": 0
      }
    }
  }
}' -H "Content-Type: application/json" -X POST -w "\n" \
  http://localhost:8080

Когда вы будете готовы развернуть изменения, соберите свой проект в Cloud Shell, используя команду pack . Эта команда использует Buildpacks для определения типа проекта, его компиляции и создания развертываемого артефакта (образа контейнера Docker).

# Make sure you are in a Cloud Shell tab where you set the PROJECT_ID
# and SAMPLE env vars. Otherwise, set them again.
pack build gcr.io/$PROJECT_ID/$SAMPLE \
  --path ~/cloudbowl-microservice-game/samples/$SAMPLE \
  --builder gcr.io/buildpacks/builder

Теперь, когда образ контейнера создан, используйте команду docker (в Cloud Shell), чтобы отправить образ контейнера в реестр контейнеров Google, чтобы к нему можно было получить доступ с помощью Cloud Run:

docker push gcr.io/$PROJECT_ID/$SAMPLE

Теперь разверните новую версию в Cloud Run:

gcloud run deploy $SAMPLE \
          --project=$PROJECT_ID \
          --platform=managed \
          --region=us-central1 \
          --image=gcr.io/$PROJECT_ID/$SAMPLE \
          --allow-unauthenticated

Теперь арена будет использовать вашу новую версию!

6. Разработка на местном уровне (необязательно)

Вы можете работать над своим проектом локально, используя собственную IDE, выполнив следующие шаги:

  1. [В Cloud Shell] Заархивируйте образец:
# Make sure the SAMPLE env var is still set. If not, re-set it.
cd ~/cloudbowl-microservice-game/samples
zip -r cloudbowl-sample.zip $SAMPLE
  1. [В Cloud Shell] Загрузите zip-файл на свой компьютер:
cloudshell download-file cloudbowl-sample.zip
  1. [На вашем компьютере] Распакуйте файл, затем внесите изменения и проверьте их.
  2. [На вашем компьютере] Установите интерфейс командной строки gcloud.
  3. [На вашем компьютере] Войдите в Google Cloud:
gcloud auth login
  1. [На вашем компьютере] Установите переменные среды PROJECT_ID и SAMPLE на те же значения, что и в Cloud Shell.
  2. [На вашем компьютере] Используйте Cloud Build для сборки контейнера (из корневого каталога проекта):
gcloud alpha builds submit . \
  --pack=image=gcr.io/$PROJECT_ID/$SAMPLE \
  --project=$PROJECT_ID
  1. [На вашем компьютере] Разверните новый контейнер:
gcloud run deploy $SAMPLE \
  --project=$PROJECT_ID \
  --platform=managed \
  --region=us-central1 \
  --image=gcr.io/$PROJECT_ID/$SAMPLE \
  --allow-unauthenticated

7. Непрерывная доставка

Настройка SCM

Настройте GitHub, чтобы вы могли сотрудничать со своей командой над микросервисом:

  1. Войти в GitHub
  2. Создать новый репозиторий
  3. Если вы работаете на локальном компьютере, вы можете использовать либо интерфейс командной строки Git (CLI), либо графическое приложение GitHub Desktop (Windows или Mac). Если вы используете Cloud Shell, вам придется использовать Git CLI. Чтобы разместить код вашего микросервиса на GitHub, следуйте инструкциям, указанным в CLI или GitHub Desktop.

Отправляйте свой код с помощью Git CLI.

  1. Следуйте инструкциям по использованию Git по протоколу HTTPS с персональным токеном доступа.
  2. Выберите область действия "репозитория".
  3. Настройка Git:
git config --global credential.helper \
  'cache --timeout=172800'
git config --global push.default current
git config --global user.email "YOUR@EMAIL"
git config --global user.name "YOUR NAME"
  1. Настройте переменные окружения для организации и репозитория GitHub ( https://github.com/ORG/REPO ).
export GITHUB_ORG=YOUR_GITHUB_ORG
export GITHUB_REPO=YOUR_GITHUB_REPO
  1. Загрузите свой код в новый репозиторий.
# Make sure the SAMPLE env var is still set. If not, re-set it.
cd ~/cloudbowl-microservice-game/samples/$SAMPLE
git init
git add .
git commit -m init
git remote add origin https://github.com/$GITHUB_ORG/$GITHUB_REPO.git
git branch -M main

# This will now ask for your GitHub username & password
# for the password use the personal access token
git push -u origin main
  1. После внесения изменений вы можете зафиксировать их и отправить в GitHub:
git add .
git status
git diff --staged
git commit -am "my changes"
git push

Размещайте свой код с помощью GitHub Desktop.

  1. Загрузите свой код, следуя инструкциям из предыдущей лабораторной работы "Разработка локально".
  2. Установите GitHub Desktop , запустите его и войдите в систему.
  3. Клонируйте созданный вами репозиторий.

cf7f38c7c86a91cd.png

  1. Откройте проводник файлов и скопируйте свой проект в новый репозиторий.
  2. Подтвердите изменения.

5f3c1552e30ad7c5.png

  1. Опубликуйте свою основную ветку на GitHub.

Настройка непрерывного развертывания в облаке

После настройки системы управления версиями (SCM) на GitHub вы можете настроить непрерывную доставку (Continuous Delivery), чтобы при каждом добавлении новых коммитов в main ветку Cloud Build автоматически собирал и развертывал изменения. Вы также можете добавить непрерывную интеграцию (Continuous Integration), которая запускает ваши тесты перед развертыванием, но этот шаг оставлен для вас в качестве упражнения, поскольку в стандартных примерах тесты отсутствуют.

  1. В консоли Cloud перейдите к своей службе Cloud Run.
  2. Нажмите кнопку "НАСТРОЙКА НЕПРЕРЫВНОГО РАЗВЕРТЫВАНИЯ".
  3. Пройдите аутентификацию через GitHub и выберите репозиторий своего микросервиса.

a3b5692f178869bc.png

  1. Выберите свой репозиторий GitHub и укажите ветку: ^main$

338f1c00f33d2f65.png

  1. Установите тип сборки для использования Buildpacks.
  2. Нажмите «Сохранить», чтобы настроить непрерывную развертку.

8. Наблюдаемость

Всё ломается. Наблюдаемость позволяет нам узнать, когда это происходит, и диагностировать причины. Метрики показывают данные о состоянии и использовании нашего сервиса. Журналы отображают информацию, собираемую вручную сервисом. Оповещения позволяют нам получать уведомления о возникновении проблем. Давайте рассмотрим каждый из этих аспектов подробнее.

Метрики

  1. Найдите свою службу в списке служб Cloud Run.
  2. Нажмите на название вашего сервиса, чтобы перейти на панель показателей.

8491b8ec6bc5b4db.png

  1. Щелкните по меню ⋮ нужного показателя, затем выберите «Просмотреть в обозревателе показателей».
  2. Теперь вы можете изменять метрики ресурсов, фильтры, группировку и другие параметры. Например, вы можете просмотреть среднюю задержку для всех сервисов:

f0d666d8f4221d45.png

Журналы

Вывод STDOUT из сервисов отправляется в систему Google Cloud Logging. Доступ к базовому представлению журнала можно получить на странице администрирования сервиса Cloud Run, например:

40058a82c9299cff.png

В журналах Cloud Run можно фильтровать по уровню серьезности и выполнять фильтрацию самих журналов. Для большей гибкости нажмите: 186fdb0e6d39a6ca.png

Оповещения

  1. Создайте URL-адрес для проверки состояния вашего сервиса.
  2. Для Spring Boot достаточно добавить следующую зависимость:
org.springframework.boot:spring-boot-starter-actuator
  1. Создайте или обновите файл src/main/resources/application.properties и отключите проверку наличия свободного места на диске:
management.health.diskspace.enabled=false
  1. Создайте оповещение о времени безотказной работы , указав протокол, имя хоста и путь. Для Spring Boot путь следующий: /actuator/health
  2. Проверьте оповещение

6948d13b263bf573.png

  1. Создать оповещение

9. Поздравляем!

Поздравляем, вы успешно создали и развернули микросервис, способный конкурировать с другими микросервисами! Удачи!

Справочная документация