战场一 - 微服务战场

1. 简介

上次更新日期:2020 年 8 月 26 日

微服务战斗竞技场

您是否曾经在打雪仗时四处移动,然后顽皮地向他人投掷雪球?如果不是,那天试试吧!但现在,你不必冒着被物理攻击的风险,而是可以构建一个可访问的小型网络(微服务)服务,与其他微服务展开一场史诗般的战斗。由于我们是在 SpringOne 上主持这场微服务大战,因此我们的微服务将是落叶而不是滚雪球。

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

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

运作方式

您将使用自己需要的任何技术(或者从 Java、Kotlin 或 Scala 入门级)构建微服务,然后在 Google Cloud 上部署微服务。部署后,您需要填写一份表单,告知我们您的微服务的网址,然后我们会将您的微服务添加到该 arena 中。

竞技场包含指定战斗的所有玩家。SpringOne 会议将拥有自己的场地。每个玩家都代表一个移动并向其他玩家抛出叶子的微服务。

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

往届竞技场的外观如下:

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 上。

挑选想要入手的样子

您可以从以下两个战斗微服务示例着手:

Java 与Spring Boot

来源

在 Cloud Run 上部署

Kotlin 和Spring Boot

来源

在 Cloud Run 上部署

决定从哪个示例开始后,请点击“在 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

您应该会看到响应字符串:F、L、R 或 T。

4. 请求加入竞技场

要想加入竞技场,您需要向 #3-sponsor-google-cloud Slack 频道发送消息,在其中提供您的姓名、Cloud Run 服务网址,您也可以选择使用 GitHub 用户名作为头像 / 个人资料照片。在我们验证过信息后,你的玩家就会出现在竞技场中。

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=java-springboot
export SAMPLE=kotlin-springboot

现在,您可以在 Cloud Shell 中修改微服务的来源。如需打开 Cloud Shell 基于网络的编辑器,请运行以下命令:

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

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

f910c9ef7b51c406.png

使用编辑器打开示例项目的 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

准备好部署更改后,请使用 pack 命令在 Cloud Shell 中构建项目。此命令使用 Buildpack 检测项目类型,对其进行编译,并创建可部署的工件(Docker 容器映像)。

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\
          --memory=512Mi\
          --allow-unauthenticated

竞技场现在将采用你的新版本!

6. 在本地开发

您可以使用自己的 IDE 在本地处理项目,具体步骤如下:

  1. [在 Cloud Shell 中] 压缩示例:

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

  1. [在您的机器上] 部署新容器:

gcloud run deploy $SAMPLE --project=$PROJECT_ID --platform=managed --region=us-central1 --image=gcr.io/$PROJECT_ID/$SAMPLE --memory=512Mi --allow-unauthenticated

7. 恭喜

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

继续学习

参考文档

8. 常见问题解答

为什么我的微服务未显示在 arena 中?