1. Введение
Последнее обновление: 05.05.2020
Арена битвы микросервисов
Вы когда-нибудь участвовали в снежной битве, где вы двигаетесь и в шутку бросаете снежки в других? Если нет, попробуйте когда-нибудь! Но теперь, вместо того чтобы рисковать получить физический удар, вы можете создать небольшой сетевой сервис (микросервис), который примет участие в эпической битве против других микросервисов. И поскольку мы проводим эту битву микросервисов на Spring I/O, наши микросервисы будут бросать хамон вместо снежков.
Возможно, вы задаетесь вопросом... Но как микросервис «бросает» хамон другим микросервисам? Микросервис может получать сетевые запросы (обычно по HTTP) и возвращать ответы. Существует «менеджер арены», который отправляет вашему микросервису текущее состояние арены, а затем ваш микросервис отвечает командой, указывающей, что нужно сделать.
Конечно, цель — победа, но попутно вы узнаете о создании и развертывании микросервисов в Google Cloud.
Как это работает
Вы создадите микросервис, используя любую технологию на ваш выбор (или выберете один из стартовых языков — Java, Kotlin или Scala), а затем развернете микросервис в Google Cloud. После развертывания вам нужно будет заполнить форму, указав URL-адрес вашего микросервиса, после чего мы добавим его в Arena.
Арена содержит всех участников конкретной битвы. У конференции Spring I/O Bridge будет своя собственная арена. Каждый игрок представляет собой микросервис, который перемещается и бросает хамон в других игроков.
Примерно раз в секунду наш менеджер арены будет вызывать ваш микросервис, отправляя текущее состояние арены (где находятся игроки), и ваш микросервис ответит командой, что нужно сделать. На арене вы можете двигаться вперед, поворачивать налево или направо, или бросать хамон. Брошенный хамон пролетит до трех клеток в направлении, в котором смотрит игрок. Если хамон «попадет» в другого игрока, бросающий получает одно очко, а попавший теряет одно очко. Размер арены автоматически регулируется в зависимости от текущего количества игроков.
Вот как выглядит арена с тремя вымышленными игроками:

Пример арены для битвы с хамоном.
Затяжные конфликты
На арене возможно, что несколько игроков попытаются выполнить противоречащие друг другу действия. Например, два игрока могут попытаться переместиться в одно и то же пространство. В случае конфликта побеждает микросервис с самым быстрым временем отклика.
Наблюдение за битвой
Чтобы увидеть, как ваш микросервис показывает себя в этой борьбе, загляните на интерактивную арену !
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.
Выберите образец для начала.
Есть два примера микросервисов для боевой системы, с которых вы можете начать:
Java и Spring Boot | ||
Kotlin и Spring Boot |
После того, как вы определитесь с примером для начала, нажмите кнопку «Развернуть в 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.
4. Запрос на включение в программу арены.
Для участия в арене необходимо отправить сообщение в канал #battle-jamon, указав своё имя, 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
Затем вы увидите дальнейшие инструкции по внесению изменений.

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 . Эта команда использует Buildpacks для определения типа проекта, его компиляции и создания развертываемого артефакта (образа контейнера 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. Поздравляем!
Поздравляем, вы успешно создали и развернули микросервис, способный конкурировать с другими микросервисами! Удачи!
Продолжайте обучение
Справочная документация
7. Часто задаваемые вопросы
Почему мой микросервис не отображается в списке доступных сервисов?
Как проходит финальная битва?
Как функционирует арена перед финальной битвой?
Как мне победить?
Могу ли я заниматься разработкой на местном уровне?