1. 簡介
上次更新時間:2021 年 5 月 6 日
微服務彩虹大亂鬥
你是否曾參與雪仗,在移動的同時,向其他人丟雪球?如果還沒用過,不妨找機會試試!但現在您不必擔心會被實體擊中,可以建構一個可透過網路存取的小型服務 (微服務),與其他微服務展開史詩般的戰鬥,投擲彩虹而非雪球。
你可能想知道... 但微服務如何「向」其他微服務「拋出」彩虹?微服務可以接收網路要求 (通常是透過 HTTP),並傳回回應。系統會提供「競技場管理員」,將競技場的目前狀態傳送給微服務,然後微服務會傳回指令,指定要執行的動作。
當然,目標是贏得勝利,但過程中您會瞭解如何在 Google Cloud 上建構及部署微服務。
運作方式
您可以使用任何技術建構微服務 (或從 Go、Java、Kotlin、Scala、NodeJS 或 Python 入門範本中選擇),然後在 Google Cloud 上部署微服務。部署完成後,請將微服務的網址告知我們,我們會將其新增至競技場。
競技場包含特定戰鬥的所有玩家。彩虹大亂鬥將有自己的競技場。每位玩家代表一項微服務,會四處移動並向其他玩家投擲彩虹。
競技場管理員大約每秒會呼叫一次微服務,傳送目前的競技場狀態 (玩家所在位置),而微服務會回覆要執行的指令。在競技場中,您可以前進、向左或向右轉,或是投擲彩虹。彩虹會朝玩家面向的方向移動,最多可移動三格。如果彩虹「擊中」其他玩家,投擲者可得一分,被擊中的玩家則會扣一分。系統會根據目前的玩家人數自動調整競技場大小。
過去的競技場如下所示:

範例:第一場戰鬥的競技場
循環衝突
在競技場中,多位玩家可能會嘗試執行衝突的動作。舉例來說,兩位玩家可能會嘗試移動到同一個空間。如有衝突,回應時間最短的微服務會勝出。
觀看對戰
如要查看微服務在戰鬥中的表現,請前往即時競技場!
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 和 Micronaut | ||
Kotlin 和 Quarkus | ||
Java 和 Spring Boot | ||
Java 和 Quarkus | ||
Go | ||
Node.js 和 Express | ||
Python 和 Flask |
決定要從哪個範例開始後,請點選上方的「Deploy on Cloud Run」(部署至 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. 要求納入競技場
如要加入 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
接著,系統會顯示變更的進一步操作說明。

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 中建構專案。這項指令會使用建構套件偵測專案類型、編譯專案,並建立可部署的構件 (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 Desktop GUI 應用程式 (Windows 或 Mac) 執行作業。如果您使用 Cloud Shell,則必須使用 git CLI。如要在 GitHub 上取得微服務的程式碼,請按照 CLI 或 GitHub Desktop 的操作說明進行。
使用 git CLI 推送程式碼
- 按照這項說明,透過 HTTPS 和個人存取權杖使用 Git
- 選擇「repo」範圍
- 設定 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$

- 將建構類型設為使用 Buildpacks
- 按一下「儲存」設定持續部署。
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. 恭喜
恭喜!您已成功建構及部署微服務,可與其他微服務對戰!祝您好運!