1. 简介
上次更新时间:2020 年 8 月 26 日
微服务竞技场
您是否曾参加过雪球大战,在其中四处移动,并向他人投掷雪球?如果还没有,不妨找个时间试试!但现在,您无需担心被实体击打,只需构建一个可通过网络访问的小型服务(微服务),即可参与与其他微服务之间的史诗级战斗。由于我们将在 SpringOne 上举办这场微服务大战,因此我们的微服务将投掷树叶而不是雪球。
您可能想知道…但微服务如何向其他微服务“投掷”叶子呢?微服务可以接收网络请求(通常通过 HTTP)并返回响应。有一个“竞技场管理器”会向您的微服务发送竞技场的当前状态,然后您的微服务会以命令的形式做出响应,指定要执行的操作。
当然,目标是获胜,但在此过程中,您将了解如何在 Google Cloud 上构建和部署微服务。
运作方式
您将使用任意技术构建微服务(或从 Java、Kotlin 或 Scala 启动器中选择),然后将微服务部署到 Google Cloud 上。部署完成后,您需要填写一个表单,告知我们微服务的网址,然后我们会将其添加到竞技场中。
竞技场包含给定战斗中的所有玩家。SpringOne 大会将有自己的竞技场。每个玩家代表一个四处移动并向其他玩家投掷树叶的微服务。
我们的竞技场管理器大约每秒会调用一次您的微服务,发送当前的竞技场状态(玩家所在的位置),您的微服务会返回一个命令,指示该做什么。在竞技场中,您可以向前移动、向左或向右转,或者投掷树叶。投掷的叶子将沿玩家面向的方向移动最多 3 个格。如果叶片“击中”另一名玩家,投掷者得 1 分,被击中的玩家失 1 分。系统会根据当前玩家数量自动调整竞技场大小。
以下是过往竞技场的示例:

示例对战 1 竞技场
循环冲突
在竞技场中,可能会有多位玩家尝试执行冲突的操作。例如,两名玩家可能会尝试移动到同一格。如果发生冲突,响应时间最短的微服务胜出。
观看比赛
如需了解您的微服务在战斗中的表现,请查看实时竞技场!
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(一种用于运行微服务和其他应用的 Google Cloud 服务)上部署微服务。
2. 登录 Google Cloud
如需在 Cloud Run 上部署微服务,您需要登录 Google Cloud。我们会向您的账号发放赠金,您无需输入信用卡信息。使用个人账号(例如 gmail.com)通常比使用 GSuite 账号的问题更少,因为有时 GSuite 管理员会阻止其用户使用某些 Google Cloud 功能。此外,我们将使用的 Web 控制台应能与 Chrome 或 Firefox 完美搭配使用,但在 Safari 中可能会出现问题。
3. 部署微服务
您可以使用任何技术构建微服务,并将其部署在任何位置,只要该微服务可公开访问且符合 Battle API 即可。不过,为了方便起见,我们将帮助您从示例服务开始,并将其部署到 Cloud Run 上。
选择要从哪个选段开始
您可以从以下两个对战微服务示例开始:
Java 和 Spring Boot | ||
Kotlin 和 Spring Boot |
确定要从哪个示例开始后,点击上方的“在 Cloud Run 上部署”按钮。此命令将启动 Cloud Shell(一个基于网络的云端虚拟机控制台),源代码将在其中克隆,然后构建为可部署的软件包(一个 Docker 容器映像),该软件包随后会上传到 Google Container Registry,然后部署到 Cloud Run。
当系统询问时,指定 us-central1 区域。
以下屏幕截图显示了微服务构建和部署的 Cloud Shell 输出

验证微服务是否正常运行
在 Cloud Shell 中,您可以向新部署的微服务发出请求,将 YOUR_SERVICE_URL 替换为您的服务的网址(该网址位于 Cloud Shell 中“Your application is now live here”这一行之后):
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 中修改微服务的源代码。如需打开基于 Web 的 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 命令构建项目。此命令使用 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 在本地处理项目:
- [在 Cloud Shell 中] 将示例压缩为 ZIP 文件:
cd ~/cloudbowl-microservice-game/samples; zip -r cloudbowl-sample.zip $SAMPLE
- [在 Cloud Shell 中] 将 ZIP 文件下载到您的计算机:
cloudshell download-file cloudbowl-sample.zip
- [在您的机器上] 解压缩文件,然后进行更改并对其进行测试
- [在您的机器上] 安装 gcloud CLI
- [在您的机器上] 登录 Google Cloud:
gcloud auth login
- [在您的机器上] 将环境变量
PROJECT_ID和SAMPLE设置为与 Cloud Shell 中相同的值。 - [在您的机器上] 使用 Cloud Build 构建容器(从根项目目录中):
gcloud alpha builds submit . --pack=image=gcr.io/$PROJECT_ID/$SAMPLE
- [在您的机器上] 部署新容器:
gcloud run deploy $SAMPLE --project=$PROJECT_ID --platform=managed --region=us-central1 --image=gcr.io/$PROJECT_ID/$SAMPLE --memory=512Mi --allow-unauthenticated
7. 恭喜
恭喜!您已成功构建并部署了一个可以与其他微服务对战的微服务!祝您好运!
继续学习
参考文档
8. 常见问题解答
为什么我的微服务未显示在竞技场中?