1. Введение
Последнее обновление: 06 мая 2021 г.
Микросервис Rainbow Rumpus
Вы когда-нибудь играли в снежки, передвигаясь и игриво бросая снежки в других? Если нет, попробуйте когда-нибудь! Но теперь вместо того, чтобы рисковать получить физический удар, вы можете создать небольшой, доступный по сети сервис (микросервис), который будет участвовать в эпической битве с другими микросервисами, бросая радугу вместо снежков.
Вам может быть интересно... Но как микросервис «бросает» радугу на другие микросервисы? Микросервис может получать сетевые запросы (обычно через HTTP) и возвращать ответы. Существует «менеджер арены», который отправит вашему микросервису текущее состояние арены, а затем ваш микросервис ответит командой, указывающей, что делать.
Конечно, цель — победить, но по ходу дела вы узнаете о создании и развертывании микросервисов в Google Cloud.
Как это работает
Вы создадите микросервис с использованием любой технологии, которую захотите (или выберете стартовые версии Go, Java, Kotlin, Scala, NodeJS или Python), а затем развернете микросервис в Google Cloud. После развертывания вы сообщите нам URL-адрес вашего микросервиса, а затем мы добавим его на арену.
На арене находятся все игроки данного боя. У Rainbow Rumpus будут свои арены. Каждый игрок представляет собой микросервис, который перемещается и бросает радугу в других игроков.
Примерно раз в секунду наш менеджер арены будет вызывать ваш микросервис, отправляя текущее состояние арены (где находятся игроки), а ваш микросервис будет отвечать командой, что делать. На арене вы можете двигаться вперед, поворачивать налево или направо или бросать радугу. Радуга будет перемещаться на три клетки в направлении взгляда игрока. Если радуга «попадает» в другого игрока, бросающий получает одно очко, а попадающий игрок теряет очко. Размер арены автоматически подстраивается под текущее количество игроков.
Вот как выглядит прошлая арена:
Пример арены 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.
Выберите образец для начала
Существует множество образцов боевых микросервисов, с которых вы можете начать:
Котлин и Spring Boot | ||
Котлин и Микронавт | ||
Котлин и Кваркус | ||
Java и Spring Boot | ||
Ява и Кваркус | ||
Идти | ||
Node.js и Экспресс | ||
Питон и колба |
После того, как вы решите, с какого образца начать, нажмите кнопку «Развертывание в облаке» выше. При этом запустится Cloud Shell (веб-консоль для виртуальной машины в облаке), где исходный код будет клонирован, а затем встроен в развертываемый пакет (образ докер-контейнера), который затем будет загружен в реестр контейнеров 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. Запросить участие на арене.
Чтобы присоединиться к 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
После этого вы увидите дальнейшие инструкции по внесению изменений.
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
. Эта команда использует пакеты сборки для определения типа проекта, его компиляции и создания развертываемого артефакта (образа 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, выполнив следующие действия:
- [В 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
- [В Cloud Shell] Загрузите zip-файл на свой компьютер:
cloudshell download-file cloudbowl-sample.zip
- [На вашем компьютере] Разархивируйте файл, а затем внесите и протестируйте изменения.
- [На вашем компьютере] Установите интерфейс командной строки gcloud.
- [На вашем компьютере] Войдите в Google Cloud:
gcloud auth login
- [На вашем компьютере] Установите для переменных среды
PROJECT_ID
иSAMPLE
те же значения, что и в Cloud Shell. - [На вашем компьютере] Используйте Cloud Build для сборки контейнера (из корневого каталога проекта):
gcloud alpha builds submit . \ --pack=image=gcr.io/$PROJECT_ID/$SAMPLE \ --project=$PROJECT_ID
- [На вашем компьютере] Разверните новый контейнер:
gcloud run deploy $SAMPLE \ --project=$PROJECT_ID \ --platform=managed \ --region=us-central1 \ --image=gcr.io/$PROJECT_ID/$SAMPLE \ --allow-unauthenticated
7. Непрерывная доставка
Настройка СКМ
Настройте GitHub, чтобы вы могли сотрудничать со своей командой над микросервисом:
- Войти на GitHub
- Создать новый репо
- Если вы работаете на локальном компьютере, вы можете использовать интерфейс командной строки git (CLI) или приложение GitHub Desktop GUI (Windows или Mac). Если вы используете Cloud Shell, вам придется использовать git CLI. Чтобы разместить код вашего микросервиса на GitHub, следуйте инструкциям CLI или GitHub Desktop.
Отправьте свой код с помощью git CLI
- Следуйте git через https с инструкциями по личному токену доступа.
- Выберите область действия «репо»
- Настройка 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"
- Установите переменные окружения для организации GitHub и репозитория (
https://github.com/ORG/REPO
)
export GITHUB_ORG=YOUR_GITHUB_ORG export GITHUB_REPO=YOUR_GITHUB_REPO
- Отправьте свой код в новый репозиторий
# 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
- После внесения любых изменений вы можете зафиксировать и отправить их на GitHub:
git add . git status git diff --staged git commit -am "my changes" git push
Публикуйте свой код с помощью рабочего стола GitHub
- Загрузите свой код, следуя инструкциям из предыдущей лабораторной работы «Разработка локально».
- Установите GitHub Desktop , запустите его и войдите в систему.
- Клонируйте только что созданный репозиторий
- Откройте проводник и скопируйте проект в новый репозиторий.
- Зафиксируйте изменения
- Опубликуйте свою основную ветку на GitHub.
Настройка Cloud Запуск непрерывного развертывания
Настроив SCM на GitHub, вы теперь можете настроить непрерывную доставку, чтобы каждый раз, когда новые коммиты отправляются в main
ветку, Cloud Build автоматически собирает и развертывает изменения. Вы также можете добавить непрерывную интеграцию, которая запускает ваши тесты перед развертыванием, но этот шаг оставлен для вас в качестве упражнения, поскольку готовые примеры не содержат никаких тестов.
- В консоли Cloud перейдите в службу Cloud Run.
- Нажмите кнопку «НАСТРОЙКА НЕПРЕРЫВНОГО РАЗВЕРТЫВАНИЯ».
- Аутентифицируйтесь с помощью GitHub и выберите репозиторий вашего микросервиса.
- Выберите репозиторий GitHub и установите ветку:
^main$
- Установите тип сборки для использования пакетов сборки.
- Нажмите «Сохранить», чтобы настроить непрерывное развертывание.
8. Наблюдательность
Вещи ломаются. Наблюдаемость дает нам возможность знать, когда это происходит, и диагностировать, почему. Метрики показывают нам данные о работоспособности и использовании нашего сервиса. Журналы показывают нам информацию, обработанную вручную, полученную от нашего сервиса. Оповещения позволяют нам получать уведомления, когда что-то идет не так. Давайте изучим каждый из них подробнее.
Метрики
- Найдите свой сервис в списке сервисов Cloud Run.
- Нажмите на название вашего сервиса, чтобы перейти на панель его показателей.
- Нажмите меню ⋮ метрики, затем выберите «Просмотреть в обозревателе метрик».
- Теперь вы можете изменять показатели ресурсов, фильтры, группировку и другие параметры. Например, вы можете просмотреть средние задержки для всех служб:
Журналы
Вывод STDOUT из сервисов отправляется в систему Google Cloud Logging. Вы можете получить доступ к базовому представлению журнала на странице администрирования службы Cloud Run, например:
В журналах Cloud Run вы можете фильтровать по серьезности и фильтровать журналы. Для большей гибкости нажмите:
Оповещения
- Создайте URL-адрес проверки работоспособности для вашего сервиса.
- Для Spring Boot просто добавьте следующую зависимость:
org.springframework.boot:spring-boot-starter-actuator
- Создайте или обновите
src/main/resources/application.properties
и отключите проверку дискового пространства:
management.health.diskspace.enabled=false
- Создайте оповещение о доступности , указав свой протокол, имя хоста и путь. Для Spring Boot путь:
/actuator/health
- Проверьте оповещение
- Создать оповещение
9. Поздравления
Поздравляем, вы успешно создали и развернули микросервис, способный конкурировать с другими микросервисами! Удачи!