Первая битва — поле битвы микросервисов

1. Введение

Последнее обновление: 26 августа 2020 г.

Боевая арена микросервисов

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

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

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

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

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

На арене находятся все игроки данного боя. У конференции SpringOne будет своя арена. Каждый игрок представляет собой микросервис, который перемещается и бросает листья в других игроков.

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

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

20628e6bd442bd11.png

Пример арены Battle One

Вращающиеся конфликты

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

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

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

Боевой 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 (ОК) и тело ответа, содержащее ваш следующий шаг, закодированное одним символом верхнего регистра:

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

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

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

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

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

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

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

Есть два примера боевых микросервисов, с которых вы можете начать:

Java и Spring Boot

Источник

Развертывание в облаке

Котлин и Spring Boot

Источник

Развертывание в облаке

После того, как вы решите, с какого образца начать, нажмите кнопку «Развертывание в облаке» выше. При этом запустится Cloud Shell (веб-консоль для виртуальной машины в облаке), где исходный код будет клонирован, а затем встроен в развертываемый пакет (образ докер-контейнера), который затем будет загружен в реестр контейнеров 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. Запросить участие на арене.

Чтобы принять участие в арене, вам необходимо отправить сообщение на канал Slack #3-sponsor-google-cloud с указанием вашего имени, URL-адреса службы Cloud Run и, при необходимости, вашего имени пользователя GitHub для его аватара или фотографии профиля. Как только мы проверим информацию, ваш игрок появится на арене .

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=java-springboot
export SAMPLE=kotlin-springboot

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

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

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

f910c9ef7b51c406.png

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

После сохранения изменений запустите приложение в Cloud Shell:

cd cloudbowl-microservice-game/samples/$SAMPLE
./mvnw spring-boot:run

После запуска приложения откройте новую вкладку 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 . Эта команда использует пакеты сборки для определения типа проекта, его компиляции и создания развертываемого артефакта (образа Docker-контейнера).

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\
          --memory=512Mi\
          --allow-unauthenticated

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

6. Развивайтесь локально

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

  1. [В Cloud Shell] Заархивируйте образец:

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

  1. [На вашем компьютере] Разверните новый контейнер:

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

7. Поздравления

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

Продолжить обучение

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

8. Часто задаваемые вопросы

Почему мой микросервис не отображается на арене?