微服務:彩虹配色

1. 簡介

上次更新時間:2021 年 5 月 6 日

微服務:彩虹配色

您是否曾在雪球大戰中四處移動,然後把雪球扔到他處?如果沒有,不妨今天就試試看!但現在您不用擔心可能會遭到攻擊,而是改為建構可透過網路存取的小型服務 (微服務),在史詩級戰鬥中與其他微服務展開激烈的戰鬥,而不像雪球那樣。

您可能會想知道...但微服務如何「拋出」彩虹給其他微服務?微服務可以接收網路要求 (通常透過 HTTP),並傳回回應。有一個「競技場管理員」會將競技場的目前狀態傳送給您的微服務,然後您的微服務會回應指令,指定要執行的動作。

當然,目標是贏得比賽,但在過程中,您將瞭解如何在 Google Cloud 上建構及部署微服務。

運作方式

您可以使用任何所需技術 (或選擇 Go、Java、Kotlin、Scala、NodeJS 或 Python 啟動器) 建構微服務,然後在 Google Cloud 上部署微服務。部署完成後,請告訴我們微服務的網址,我們會將該網址加入 Arena。

這場競技場集結了所有參與特定戰鬥的球員。彩虹魯普斯會有自己的競技場。每位玩家都代表一種微服務,遊戲中會移動,並在其他玩家手上丟擲彩虹。

大約一次,我們的運動場經理會呼叫您的微服務,傳送目前運動場狀態 (玩家所在位置),您的微服務就會回應指令,要求執行動作。在競技場中,你可以向左/向右轉,或是投光彩虹。彩虹會朝玩家面對的方向移動最多三個空間。如果彩虹「擊中」其他玩家,投擲者可得一分,而遭擊的玩家則會失去一分。系統會依據目前玩家人數自動調整球場規模。

過往競技場看起來如下:

20628e6bd442bd11.png

範例:一戰競技場

循環衝突

在競技場中,可能會有多個玩家試圖執行相互衝突的動作。舉例來說,兩位玩家可能會嘗試移動到同一個空間。如果發生衝突,回應時間最快的微服務會勝出。

觀看戰鬥

如要瞭解微服務在大戰中的表現,歡迎造訪即時競技場

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) 通常比使用 G Suite 帳戶更少問題,因為 G Suite 管理員有時會禁止使用者使用特定 Google Cloud 功能。此外,我們所使用的網路控制台應該也能在 Chrome 或 Firefox 中正常運作,但在 Safari 中卻可能發生問題。

3. 部署微服務

您可以使用任何技術建構微服務,並部署至任何可公開存取且符合 Battle API 的微服務。不過,為了讓您更輕鬆上手,我們會協助您從範例服務開始,並將其部署至 Cloud Run。

選擇要開始使用的樣本

有各種戰鬥微服務範例可以先從:

Kotlin 和春季靴

資料來源

Kotlin 和密克羅尼西亞

資料來源

Kotlin 和 Quarkus

資料來源

Java 和 Spring Boot

資料來源

Java 和 Quarkus

資料來源

Go

資料來源

Node.js 和 Express

資料來源

Python 與燒瓶

資料來源

決定要從哪個範例開始部署後,請按一下「Deploy on Cloud Run」(在 Cloud Run 部署)按鈕。系統會啟動 Cloud Shell (雲端虛擬機器的網路控制台),在該控制台複製原始碼,然後建構成可部署的套件 (Docker 容器映像檔),再上傳至 Google Container Registry,最後在 Cloud Run 上部署。

當系統詢問時,請指定 us-central1 區域。

下圖顯示微服務建構和部署作業的 Cloud Shell 輸出內容

d88e40430706a32b.png

驗證微服務是否運作正常

您可以在 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

您應該會看到 FLRT 的回應字串。

4. 要求納入 Arena

若想加入彩虹 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

接著,您會看到進一步的操作說明,瞭解如何進行變更。

f910c9ef7b51c406.png

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 中建構專案。這個指令會使用 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

容器映像檔已建立完成,請使用 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 執行專案:

  1. [在 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
  1. [在 Cloud Shell 中] 將 ZIP 檔案下載至您的電腦:
cloudshell download-file cloudbowl-sample.zip
  1. [在您的電腦上] 解壓縮檔案,然後進行變更並測試
  2. [在您的機器中] 安裝 gcloud CLI
  3. [在您的電腦上] 登入 Google Cloud:
gcloud auth login
  1. [在電腦上] 將環境變數 PROJECT_IDSAMPLE 設為與 Cloud Shell 相同的值。
  2. [在您的機器上] 使用 Cloud Build 從根目錄 (專案根目錄) 建構容器:
gcloud alpha builds submit . \
  --pack=image=gcr.io/$PROJECT_ID/$SAMPLE \
  --project=$PROJECT_ID
  1. [在您的電腦上] 部署新容器:
gcloud run deploy $SAMPLE \
  --project=$PROJECT_ID \
  --platform=managed \
  --region=us-central1 \
  --image=gcr.io/$PROJECT_ID/$SAMPLE \
  --allow-unauthenticated

7. 持續推送軟體更新

設定 SCM

設定 GitHub,以便在微服務與團隊成員協作:

  1. 登入 GitHub
  2. 建立新的存放區
  3. 如果您在本機電腦上工作,可以使用 Git 指令列介面 (CLI) 或 GitHub Desktop GUI 應用程式 (Windows 或 Mac)。如果您使用的是 Cloud Shell,就必須使用 git CLI。如要在 GitHub 上取得微服務的程式碼,請按照 CLI 或 GitHub 桌面的說明操作。

使用 Git CLI 推送程式碼

  1. 按照透過個人存取權杖使用 HTTPS 的 git 操作說明
  2. 選擇「存放區」範圍
  3. 設定 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"
  1. 為 GitHub 組織和存放區設定環境變數 (https://github.com/ORG/REPO)
export GITHUB_ORG=YOUR_GITHUB_ORG
export GITHUB_REPO=YOUR_GITHUB_REPO
  1. 將程式碼推送至新存放區
# 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
  1. 完成所有變更後,您可以提交變更並推送至 GitHub:
git add .
git status
git diff --staged
git commit -am "my changes"
git push

使用 GitHub 桌面應用程式推送程式碼

  1. 按照先前「在本機開發」實驗室中的操作說明,下載程式碼
  2. 安裝 GitHub 桌面,啟動並登入
  3. 複製新建的存放區

cf7f38c7c86a91cd.png

  1. 開啟檔案總管,並將專案複製到新的存放區
  2. 修訂變更

5f3c1552e30ad7c5.png

  1. 將主分支發布至 GitHub

設定 Cloud Run 持續部署

在 GitHub 上設定 SCM 後,您現在可以設定持續推送軟體更新,這樣每當新的修訂版本推送至 main 分支時,Cloud Build 就會自動建構及部署變更。您也可以新增持續整合,在部署前先執行測試,但該步驟已留做練習,因為內建的範例不含任何測試。

  1. 在 Cloud 控制台中,前往 Cloud Run 服務
  2. 按一下「設定持續部署」按鈕
  3. 透過 GitHub 進行驗證,並選取微服務的存放區

a3b5692f178869bc.png

  1. 選取 GitHub 存放區,並將分支版本設為:^main$

338f1c00f33d2f65.png

  1. 設定要使用的 Buildpack 建構類型
  2. 按一下「儲存」即可設定持續部署。

8. 觀測能力

事情是難忘的事。透過可觀察性,我們可以瞭解問題何時發生,並診斷原因。指標會顯示我們服務的健康和使用情形資料。記錄檔會顯示手動檢測服務產生的資訊。有了快訊,我們就能在發生問題時收到通知。以下將進一步說明

指標

  1. Cloud Run 服務清單中找出您的服務
  2. 按一下服務名稱,即可前往該服務的指標資訊主頁

8491b8ec6bc5b4db.png

  1. 按一下指標的「⋮」選單,然後選取「在 Metrics Explorer 中查看」
  2. 您現在可以變更資源指標、篩選器、分組和其他選項。舉例來說,您可以查看所有服務的平均服務延遲時間

f0d666d8f4221d45.png

記錄

服務的 STDOUT 輸出內容會傳送至 Google Cloud Logging 系統。您可以透過 Cloud Run 服務管理頁面存取基本記錄檔檢視畫面,例如:

40058a82c9299cff.png

在 Cloud Run 記錄中,您可以依嚴重性篩選記錄,如需更多彈性,請按一下:186fdb0e6d39a6ca.png

快訊

  1. 為服務建立健康檢查網址。
  2. 針對 Spring Boot,只需新增下列依附元件:
org.springframework.boot:spring-boot-starter-actuator
  1. 建立或更新 src/main/resources/application.properties,並停用磁碟空間檢查:
management.health.diskspace.enabled=false
  1. 建立運作時間快訊,指定協定、主機名稱和路徑。對於 Spring Boot,路徑為:/actuator/health
  2. 測試快訊

6948d13b263bf573.png

  1. 建立快訊

9. 恭喜

恭喜!您已成功建構及部署可與其他微服務競爭的微服務!祝您好運!

參考文件