1. 简介
上次更新时间:2021 年 5 月 6 日
微服务 Rainbow Rumpus
您是否曾经在打雪仗时四处移动,然后顽皮地向他人投掷雪球?如果不是,那天试试吧!不过,现在,您可以构建一个可通过网络访问的小型服务(微服务),让其与其他微服务进行史诗般的对抗,而投掷的是彩虹而不是雪球。
您可能想知道...但是,微服务如何向其他微服务“抛出”彩虹?微服务可以接收网络请求(通常通过 HTTP)并返回响应。有一个“竞技场管理器”会向您的微服务发送竞技场的当前状态,然后您的微服务会通过命令响应,指定要执行的操作。
当然,我们的目标是赢得比赛,但在此过程中,您还将了解如何在 Google Cloud 上构建和部署微服务。
运作方式
您将使用您所需的任何技术(或选择 Go、Java、Kotlin、Scala、NodeJS 或 Python 入门级)构建微服务,然后在 Google Cloud 上部署微服务。部署后,您需要告知我们您的微服务的网址,然后我们会将该微服务添加到 arena。
竞技场包含给定对战中的所有玩家。Rainbow Rumpus 将有自己的竞技场。每个玩家都代表一个四处移动并向其他玩家抛出彩虹的微服务。
大约每秒一次,我们的竞技场管理器会调用您的微服务,发送当前竞技场的状态(玩家所在的位置),您的微服务会响应一个指示要执行的操作的命令。在竞技场中,您可以向前移动、向左或向右转弯,或投掷彩虹。彩虹会朝着玩家所面朝的方向移动,最多移动 3 格。如果彩虹“击中”了其他玩家,则投掷者得一分,被击中的玩家则减一分。竞技场大小会根据当前玩家数量自动调整。
以下是之前竞技场的外观:
战斗一号竞技场示例
周期性冲突
在竞技场中,多名玩家可能会尝试执行冲突的操作。例如,两位玩家可能会尝试移动到同一空间。如果发生冲突,响应时间最短的微服务将胜出。
观看对抗赛
如需了解您的微服务在战斗中的表现,请查看实时竞技场!
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 的输出
验证微服务是否正常运行
在 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. 申请加入竞技场
你需要加入竞技场才能加入 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
随后您会看到有关如何进行更改的详细说明。
使用编辑器打开示例项目的 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 在本地处理项目:
- [在 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
- [在 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 \ --project=$PROJECT_ID
- [在您的机器上] 部署新容器:
gcloud run deploy $SAMPLE \ --project=$PROJECT_ID \ --platform=managed \ --region=us-central1 \ --image=gcr.io/$PROJECT_ID/$SAMPLE \ --allow-unauthenticated
7. 持续交付
设置 SCM
设置 GitHub,以便与团队就微服务开展协作:
- 登录 GitHub
- 创建新代码库
- 如果您正在使用本地计算机,则可以使用 Git 命令行界面 (CLI) 或 GitHub 桌面 GUI 应用(Windows 或 Mac)。如果您使用的是 Cloud Shell,则必须使用 git CLI。如需在 GitHub 上获取微服务的代码,请按照 CLI 或 GitHub Desktop 说明操作。
使用 git CLI 推送代码
- 按照使用个人访问令牌进行 git over 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 Desktop 推送代码
- 按照上一个“在本地开发”实验中的说明下载代码
- 安装 GitHub Desktop,启动该应用并登录
- 克隆新创建的代码库
- 打开文件资源管理器,然后将项目复制到新的代码库中
- 提交更改
- 将主分支发布到 GitHub
设置 Cloud Run 持续部署
通过在 GitHub 上设置 SCM,您现在可以设置持续交付,这样每次将新提交推送到 main
分支时,Cloud Build 都会自动构建和部署更改。您还可以添加在部署前运行测试的持续集成,但由于开箱即用的示例不包含任何测试,因此我们将此步骤留作练习。
- 在 Cloud 控制台中,前往您的 Cloud Run 服务
- 点击“设置持续部署”按钮
- 使用 GitHub 进行身份验证,然后选择微服务的代码库
- 选择您的 GitHub 代码库,并将分支设置为:
^main$
- 将“Build 类型”设置为使用 Buildpack
- 点击“保存”以设置持续部署。
8. 可观测性
剧情破裂。借助可观测性,我们能够了解问题何时发生以及原因。指标会显示服务运行状况和使用情况数据。日志会显示我们服务发出的手动插桩信息。通过提醒,我们可以在出现问题时收到通知。我们来详细了解一下每种方法。
指标
- 在 Cloud Run 服务列表中查找您的服务
- 点击您的服务的名称以访问其指标信息中心
- 点击指标的 ⋮ 菜单,然后选择“在 Metrics Explorer 中查看”
- 现在,您可以更改资源指标、过滤条件、分组和其他选项。例如,您可以查看所有服务的平均服务延迟时间:
日志
服务的 STDOUT 输出会发送到 Google Cloud Logging 系统。您可以从 Cloud Run 服务管理页面访问基本日志视图,例如:
在 Cloud Run 日志中,您可以按严重性过滤并过滤日志。如需获得更大的灵活性,请点击:
提醒
- 为您的服务创建健康检查网址。
- 对于 Spring Boot,只需添加以下依赖项:
org.springframework.boot:spring-boot-starter-actuator
- 创建或更新
src/main/resources/application.properties
并停用磁盘空间检查:
management.health.diskspace.enabled=false
- 创建正常运行时间提醒,指定您的协议、主机名和路径。对于 Spring Boot,路径为:
/actuator/health
- 测试警报
- 创建提醒
9. 恭喜
恭喜,您已成功构建并部署了一个可与其他微服务交互的微服务!祝您好运!