1. 簡介
上次更新時間:2021 年 5 月 6 日
微服務:彩虹配色
您是否曾在雪球大戰中四處移動,然後把雪球扔到他處?如果沒有,不妨今天就試試看!但現在您不用擔心可能會遭到攻擊,而是改為建構可透過網路存取的小型服務 (微服務),在與其他微服務進行激烈的激烈戰鬥中,而不使用雪球。
您可能會想...但微服務是如何「擲回」在其他微服務中使用彩虹?微服務可以接收網路要求 (通常透過 HTTP) 並傳回回應。有「區管理員」將競技場目前的狀態傳送給您的微服務,接著您的微服務就會回應指令,並指出要執行的操作。
當然,目標是取得成功,但您將學習如何在 Google Cloud 中建構及部署微服務。
運作方式
接著,您將使用 Go、Java、Kotlin、Scala、NodeJS 或 Python 啟動條件建構微服務,並在 Google Cloud 中部署微服務。部署完成後,請將微服務的網址告訴我們,我們隨後會將其新增至競技場中。
這場競技場集結了所有參與特定戰鬥的球員。彩虹魯普斯會有自己的競技場。每位玩家都代表一種微服務,遊戲中會移動,並在其他玩家手上丟擲彩虹。
大約一次,我們的運動場經理會呼叫您的微服務,傳送目前運動場狀態 (玩家所在位置),您的微服務就會回應指令,要求執行動作。在競技場中,你可以向左/向右轉,或是投光彩虹。彩虹會朝玩家面對的方向移動最多三個空間。如果彩虹的「強」另一名玩家則獲得 1 分,熱門玩家會失去分數。系統會依據目前玩家人數自動調整球場規模。
過往競技場看起來如下:
範例:一戰競技場
改變的衝突
在競技場中,可能會有多個玩家試圖執行相互衝突的動作。舉例來說,兩位玩家可能會試著移動到相同空間。如果發生衝突,回應時間最快的微服務會勝出。
觀看戰鬥
如要瞭解微服務在大戰中的表現,歡迎造訪即時競技場!
Battle API
如要與我們的競技場經理合作,您的微服務必須導入特定 API 才能加入競技場。運動場管理器會使用以下 JSON 結構,透過 HTTP POST 將目前競技場狀態傳送至您提供的網址:
{
"_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。
先選好試閱內容
有各種戰鬥微服務範例可以先從:
Kotlin 和春季靴 | ||
Kotlin 和Micronaut | ||
Kotlin 和Quarkus | ||
Java 與春季靴 | ||
Java 與Quarkus | ||
Go | ||
Node.js 與快速 | ||
Python 與燒瓶 |
決定要從哪個範例開始部署後,請按一下「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 中的「您的應用程式現已上線」這一行後面):
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. 要求加入競技場
若想加入彩虹 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
準備好部署變更時,請在 Cloud Shell 中使用 pack
指令建構專案。這個指令會使用 Buildpacks 來偵測專案類型、加以編譯,以及建立可部署的構件 (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
建立容器映像檔後,請在 Cloud Shell 中使用 docker 指令將容器映像檔推送至 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 中] 壓縮範例:
# 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 桌面的說明操作。
使用 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 桌面推送程式碼
- 按照先前的「在本機開發」操作說明下載程式碼研究室
- 安裝 GitHub 桌面,啟動並登入
- 複製新建立的存放區
- 開啟檔案總管,並將專案複製到新的存放區
- 修訂變更
- 將主要分支版本發布至 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 記錄檔中,您可以依嚴重性篩選及篩選記錄檔。如需更多彈性,請按一下:
快訊
- 為服務建立 Heathcheck 網址。
- 針對 Spring Boot,只需新增下列依附元件:
org.springframework.boot:spring-boot-starter-actuator
- 建立或更新
src/main/resources/application.properties
並停用磁碟空間檢查:
management.health.diskspace.enabled=false
- 建立運作時間快訊,指定通訊協定、主機名稱和路徑。如果是 Spring Boot,路徑為:
/actuator/health
- 測試快訊
- 建立快訊
9. 恭喜
恭喜,您已成功建構及部署微服務,可以與其他微服務戰鬥!祝您好運!