1. 簡介
上次更新時間:2020 年 5 月 5 日
微服務戰鬥競技場
你是否曾參與雪仗,在移動的同時,向其他人丟雪球?如果還沒用過,不妨找機會試試!但現在您不必擔心被揍,可以建構小型網路存取服務 (微服務),與其他微服務展開史詩般的戰鬥。由於我們是在 Spring I/O 舉辦這場微服務大戰,因此微服務會投擲西班牙火腿,而不是雪球。
你可能想知道... 但微服務如何「將」哈蒙火腿「丟」給其他微服務?微服務可以接收網路要求 (通常是透過 HTTP),並傳回回應。系統會提供「競技場管理員」,將競技場的目前狀態傳送給微服務,然後微服務會傳回指令,指定要執行的動作。
當然,目標是贏得勝利,但過程中您會瞭解如何在 Google Cloud 上建構及部署微服務。
運作方式
您可以使用任何技術建構微服務 (或從 Java、Kotlin 或 Scala 啟動器中選擇),然後在 Google Cloud 上部署微服務。部署完成後,請填寫表單,告知我們微服務的網址,我們會將其加入競技場。
競技場包含特定戰鬥的所有玩家。Spring I/O Bridge 會議將有專屬場地。每位玩家代表一項微服務,會四處移動並向其他玩家投擲哈蒙。
競技場管理工具大約每秒會呼叫一次微服務,傳送目前的競技場狀態 (玩家所在位置),而微服務會回覆要執行的指令。在競技場中,您可以向前移動、向左或向右轉,或是投擲火腿。投擲的西班牙火腿會朝玩家面向的方向移動最多三格。如果火腿「擊中」其他玩家,投擲者可得一分,被擊中的玩家則會扣一分。系統會根據目前的玩家人數自動調整競技場大小。
以下是競技場的樣子,其中有三位虛構玩家:

Battle Jamón 競技場範例
循環衝突
在競技場中,多位玩家可能會嘗試執行衝突的動作。舉例來說,兩位玩家可能會嘗試移動到同一個空間。如有衝突,回應時間最短的微服務會勝出。
觀看對戰
如要查看微服務在戰鬥中的表現,請前往即時競技場!
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。
選取要開始使用的範例
您可以從以下兩種戰鬥微服務範例著手:
Java 和 Spring Boot | ||
Kotlin 和 Spring Boot |
決定要從哪個範例開始後,請點選上方的「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. 要求納入競技場
如要加入競技場,請傳送訊息至 #battle-jamon 頻道,並附上您的姓名、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
接著,系統會顯示變更的進一步操作說明。

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 中建構專案。這項指令會使用建構套件偵測專案類型、編譯專案,並建立可部署的構件 (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. 恭喜
恭喜!您已成功建構及部署微服務,可與其他微服務對戰!祝您好運!
繼續學習
參考文件
7. 常見問題
為什麼我的微服務沒有顯示在競技場中?
最終戰鬥的運作方式為何?
決戰前競技場的運作方式為何?
如何獲勝?
我可以進行本機開發嗎?