微服务 Rainbow Rumpus

1. 简介

上次更新日期:2021 年 5 月 6 日

微服务 Rainbow Rumpus

您是否曾经在打雪仗时四处移动,然后顽皮地向他人投掷雪球?如果不是,那天试试吧!但现在,你不必冒着被人攻击的风险,而可以构建一个可通过网络访问的小型服务(即微服务),并与其他微服务展开一场史诗般的战斗。

您可能想知道...但微服务是如何“抛出”的在其他微服务中呈现彩虹效果?微服务可以接收网络请求(通常通过 HTTP)并返回响应。还有“场地管理员”它会向你的微服务发送 arena 的当前状态,然后你的微服务将用一个命令做出响应,指明要做什么。

当然,目标就是赢得客户,但在此过程中,您将了解如何在 Google Cloud 上构建和部署微服务。

运作方式

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

竞技场包含指定战斗的所有玩家。彩虹朗姆普比赛将拥有自己的竞技场。每个玩家都代表一个四处移动并向其他玩家抛出彩虹的微服务。

我们的竞技场管理员大约每秒会调用一次您的微服务,并发送当前的竞技场状态(玩家所在的位置),您的微服务将做出响应并给出要执行操作的命令。在竞技场中,你可以前进、左转或右转,或者投掷彩虹。彩虹在玩家所面对的方向最多会移动三个位置。如果彩虹“命中”在另一位玩家中,投球手获得一分,击中玩家则会失去一分。竞技场大小会根据当前玩家人数自动调整。

往届竞技场的外观如下:

20628e6bd442bd11

战斗一号竞技场示例

循环冲突

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

观看战斗

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

战斗 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(一种用于运行微服务和其他应用的 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 和Micronaut

来源

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 基于网络的编辑器,请运行以下命令:

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

准备好部署更改后,请使用 pack 命令在 Cloud Shell 中构建项目。此命令使用 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 中] 压缩示例:
# 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. 选择“repo”范围
  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 桌面推送您的代码

  1. 按照上一部分“本地开发”中的说明下载代码实验
  2. 安装 GitHub Desktop、启动 GitHub 并登录
  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. 可观测性

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

指标

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

8491b8ec6bc5b4db

  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. 恭喜

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

参考文档