1. Введение
Последнее обновление: 12.02.2020
Арена битвы микросервисов
Вы когда-нибудь участвовали в снежной битве, где вы двигаетесь и в шутку бросаете снежки в других? Если нет, попробуйте когда-нибудь! Но теперь, вместо того чтобы рисковать получить физический удар, вы можете создать небольшой сетевой сервис (микросервис), который примет участие в эпической битве против других микросервисов. И поскольку мы проводим эту первую битву микросервисов в Атланте, штат Джорджия, наши микросервисы будут бросать персики вместо снежков.
Возможно, вы задаетесь вопросом... Но как микросервис «бросает» персик другим микросервисам? Микросервис может получать сетевые запросы (обычно по HTTP) и возвращать ответы. Существует «менеджер арены», который отправляет вашему микросервису текущее состояние арены, а затем ваш микросервис отвечает командой, указывающей, что нужно сделать.
Конечно, цель — победа, но попутно вы узнаете о создании и развертывании микросервисов в Google Cloud.
Как это работает
Вы создадите микросервис, используя любую технологию на ваш выбор (или выберете один из стартовых языков — Java, Kotlin или Scala), а затем развернете микросервис в Google Cloud. После развертывания вам нужно будет заполнить форму, указав URL-адрес вашего микросервиса, после чего мы добавим его в Arena.
Арена содержит всех игроков, участвующих в данном сражении. На конференции DevNexus будет отдельная арена на каждый день. Каждый игрок представляет собой микросервис, который перемещается и бросает персики в других игроков.
Примерно раз в секунду наш менеджер арены будет вызывать ваш микросервис, отправляя текущее состояние арены (где находятся игроки), и ваш микросервис ответит командой, что нужно сделать. На арене вы можете двигаться вперед, поворачивать налево или направо, или бросить персик. Брошенный персик пролетит до трех клеток в направлении, в котором смотрит игрок. Если персик «попадет» в другого игрока, бросающий получает одно очко, а попавший теряет одно очко. Размер арены автоматически регулируется в зависимости от текущего количества игроков.
Here is how the arena looks with three made-up players:

Пример арены «Боевой персик»
Затяжные конфликты
На арене возможно, что несколько игроков попытаются выполнить противоречащие друг другу действия. Например, два игрока могут попытаться переместиться в одно и то же пространство. В случае конфликта побеждает микросервис с самым быстрым временем отклика.
Наблюдение за битвой
Чтобы увидеть, как ваш микросервис показывает себя в этой борьбе, загляните на интерактивную арену !
Battle 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. Развертывание микросервиса
Вы можете создать свой микросервис, используя любую технологию, и развернуть его где угодно, если он доступен публично и соответствует API Battle. Для упрощения можно начать с тестового проекта, который просто выбирает случайную команду.
Выберите образец для начала.
Есть три примера микросервисов для боевой системы, с которых вы можете начать:
Java и Spring Boot | ||
Java & Quarkus | ||
Kotlin и Micronaut | ||
Kotlin & Quarkus | ||
Scala и Play Framework | ||
Идти |
После того, как вы определитесь с примером для начала, нажмите кнопку «Развернуть в Cloud Run» выше. Это запустит Cloud Shell (веб-консоль для виртуальной машины в облаке), где исходный код будет клонирован, затем собран в развертываемый пакет (образ контейнера Docker), который затем будет загружен в реестр контейнеров Google и развернут в Cloud Run .
При запросе укажите регион us-central1 .
На скриншоте ниже показан вывод Cloud Shell при сборке и развертывании микросервиса.

Проверьте работоспособность микросервиса.
В 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.
Запрос на включение в Арену
Для участия в турнире необходимо заполнить короткую форму . Самая сложная часть — выбор изображения для профиля. Вы можете использовать изображение с GitHub, LinkedIn или же мы выберем для вас случайный аватар. После рассмотрения вашей заявки ваш игрок появится на турнире .
Внесение и развертывание изменений
Прежде чем вносить изменения, необходимо настроить в 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-micronaut export SAMPLE=scala-play
Теперь вы можете редактировать исходный код своего микросервиса прямо из Cloud Shell. Чтобы открыть веб-редактор Cloud Shell, выполните следующую команду:
cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md
Затем вы увидите дальнейшие инструкции по внесению изменений.

Cloud Shell с редактором и открытым примером проекта.
После сохранения изменений выполните сборку проекта в Cloud Shell с помощью команды pack . Эта команда использует Buildpacks для определения типа проекта, его компиляции и создания развертываемого артефакта (образа контейнера Docker).
pack build gcr.io/$PROJECT_ID/$SAMPLE \ --path cloudbowl-microservice-game/samples/$SAMPLE \ --builder heroku/buildpacks
Теперь, когда образ контейнера создан, используйте команду 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
Теперь арена будет использовать вашу новую версию!
3. Поздравляем!
Поздравляем, вы успешно создали и развернули микросервис, способный конкурировать с другими микросервисами! Удачи!
Что дальше?
- Добавьте распределенную трассировку в ваше приложение Spring Boot.
- Используйте платформу искусственного интеллекта, чтобы сделать ваши микросервисы невероятно интеллектуальными.