微服务 Rainbow Rumpus

1. 简介

上次更新时间:2021 年 5 月 6 日

微服务 Rainbow Rumpus

您是否曾经在打雪仗时四处移动,然后顽皮地向他人投掷雪球?如果不是,那天试试吧!不过,现在,您可以构建一个可通过网络访问的小型服务(微服务),让其与其他微服务进行史诗般的对抗,而投掷的是彩虹而不是雪球。

您可能想知道...但是,微服务如何向其他微服务“抛出”彩虹?微服务可以接收网络请求(通常通过 HTTP)并返回响应。有一个“竞技场管理器”会向您的微服务发送竞技场的当前状态,然后您的微服务会通过命令响应,指定要执行的操作。

当然,我们的目标是赢得比赛,但在此过程中,您还将了解如何在 Google Cloud 上构建和部署微服务。

运作方式

您将使用您所需的任何技术(或选择 Go、Java、Kotlin、Scala、NodeJS 或 Python 入门级)构建微服务,然后在 Google Cloud 上部署微服务。部署后,您需要告知我们您的微服务的网址,然后我们会将该微服务添加到 arena。

竞技场包含给定对战中的所有玩家。Rainbow Rumpus 将有自己的竞技场。每个玩家都代表一个四处移动并向其他玩家抛出彩虹的微服务。

大约每秒一次,我们的竞技场管理器会调用您的微服务,发送当前竞技场的状态(玩家所在的位置),您的微服务会响应一个指示要执行的操作的命令。在竞技场中,您可以向前移动、向左或向右转弯,或投掷彩虹。彩虹会朝着玩家所面朝的方向移动,最多移动 3 格。如果彩虹“击中”了其他玩家,则投掷者得一分,被击中的玩家则减一分。竞技场大小会根据当前玩家数量自动调整。

以下是之前竞技场的外观:

20628e6bd442bd11.png

战斗一号竞技场示例

周期性冲突

在竞技场中,多名玩家可能会尝试执行冲突的操作。例如,两位玩家可能会尝试移动到同一空间。如果发生冲突,响应时间最短的微服务将胜出。

观看对抗赛

如需了解您的微服务在战斗中的表现,请查看实时竞技场

Battle API

为了与我们的场景经理合作,您的微服务需要实现特定的 API 才能参与场景。竞技场管理器将以 HTTP POST 的形式将当前竞技场状态发送到您提供给我们的网址,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 上部署微服务。Cloud Run 是一项用于运行微服务和其他应用的 Google Cloud 服务。

2. 登录 Google Cloud

为了能够在 Cloud Run 上部署微服务,您需要登录 Google Cloud。我们会向您的账号应用赠送金额,您无需输入信用卡信息。使用个人账号(例如 gmail.com)比使用 G Suite 账号通常更容易出现问题,因为 G Suite 管理员有时会阻止用户使用某些 Google Cloud 功能。此外,我们要使用的网络控制台在 Chrome 或 Firefox 中应该能正常运行,但在 Safari 中可能会出现问题。

3. 部署微服务

您可以使用任何技术构建微服务,并将其部署到任何位置,只要该微服务可公开访问且符合 Battle API 即可。但为方便起见,我们将帮助您从示例服务着手,并将其部署到 Cloud Run 上。

选择要开始使用的示例

您可以从以下许多战斗微服务示例着手:

Kotlin 和 Spring Boot

来源

Kotlin 和微型航天器

来源

Kotlin 和Quarkus

来源

Java 与Spring Boot

来源

Java 与Quarkus

来源

Go

来源

Node.js 和速成

来源

Python 和烧瓶

来源

确定要先使用哪个示例后,点击上方的“在 Cloud Run 上部署”按钮。这将启动 Cloud Shell(一个用于访问云端虚拟机的 Web 控制台),其中会克隆源代码,然后将其构建为可部署的软件包(Docker 容器映像),然后将该软件包上传到 Google Container Registry,最后在 Cloud Run 上部署。

当系统询问时,请指定 us-central1 区域。

下面的屏幕截图显示了构建和部署微服务时 Cloud Shell 的输出

d88e40430706a32b.png

验证微服务是否正常运行

在 Cloud Shell 中,您可以向新部署的微服务发出请求,将 YOUR_SERVICE_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

您应该会看到 FLRT 的响应字符串。

4. 申请加入竞技场

你需要加入竞技场才能加入 Rainbow Rumpus。打开 rainbowrumpus.dev,然后点击竞技场中的“加入”,在其中提供您的微服务网址。

5. 进行更改并进行部署

您需要先在 Cloud Shell 中设置一些有关 GCP 项目和所用示例的信息,然后才能进行更改。首先列出您的 GCP 项目:

gcloud projects list

您可能只有一个项目。复制第一列中的 PROJECT_ID,并将其粘贴到以下命令中(将 YOUR_PROJECT_ID 替换为您的实际项目 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 基于 Web 的编辑器,请运行以下命令:

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

随后您会看到有关如何进行更改的详细说明。

f910c9ef7b51c406.png

使用编辑器打开示例项目的 Cloud Shell

保存更改后,使用 README.md 文件中的命令在 Cloud Shell 中启动应用,但首先请确保您在 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 命令构建项目。此命令使用 Buildpack 检测项目类型、对其进行编译,并创建可部署工件(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 Container Registry,以便 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 中] 将示例文件压缩为 ZIP 文件:
# 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 CLI
  3. [在您的计算机上] 登录 Google Cloud:
gcloud auth login
  1. [在您的机器上] 将环境变量 PROJECT_IDSAMPLE 设置为与 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 桌面 GUI 应用(Windows 或 Mac)。如果您使用的是 Cloud Shell,则必须使用 git CLI。如需在 GitHub 上获取微服务的代码,请按照 CLI 或 GitHub Desktop 说明操作。

使用 git CLI 推送代码

  1. 按照使用个人访问令牌进行 git over 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

  1. 将主分支发布到 GitHub

设置 Cloud Run 持续部署

通过在 GitHub 上设置 SCM,您现在可以设置持续交付,这样每次将新提交推送到 main 分支时,Cloud Build 都会自动构建和部署更改。您还可以添加在部署前运行测试的持续集成,但由于开箱即用的示例不包含任何测试,因此我们将此步骤留作练习。

  1. 在 Cloud 控制台中,前往您的 Cloud Run 服务
  2. 点击“设置持续部署”按钮
  3. 使用 GitHub 进行身份验证,然后选择微服务的代码库

a3b5692f178869bc.png

  1. 选择您的 GitHub 代码库,并将分支设置为:^main$

338f1c00f33d2f65

  1. 将“Build 类型”设置为使用 Buildpack
  2. 点击“保存”以设置持续部署。

8. 可观测性

剧情破裂。借助可观测性,我们能够了解问题何时发生以及原因。指标会显示服务运行状况和使用情况数据。日志会显示我们服务发出的手动插桩信息。通过提醒,我们可以在出现问题时收到通知。我们来详细了解一下每种方法。

指标

  1. Cloud Run 服务列表中查找您的服务
  2. 点击您的服务的名称以访问其指标信息中心

8491b8ec6bc5b4db.png

  1. 点击指标的 菜单,然后选择“在 Metrics Explorer 中查看”
  2. 现在,您可以更改资源指标、过滤条件、分组和其他选项。例如,您可以查看所有服务的平均服务延迟时间

f0d666d8f4221d45.png

日志

服务的 STDOUT 输出会发送到 Google Cloud Logging 系统。您可以从 Cloud Run 服务管理页面访问基本日志视图,例如:

40058a82c9299cff.png

在 Cloud Run 日志中,您可以按严重性过滤并过滤日志。如需获得更大的灵活性,请点击:186fdb0e6d39a6ca.png

提醒

  1. 为您的服务创建健康检查网址。
  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

  1. 创建提醒

9. 恭喜

恭喜,您已成功构建并部署了一个可与其他微服务交互的微服务!祝您好运!

参考文档