微服務:彩虹配色

1. 簡介

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

微服務:彩虹配色

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

您可能會想...但微服務是如何「擲回」在其他微服務中使用彩虹?微服務可以接收網路要求 (通常透過 HTTP) 並傳回回應。有「區管理員」將競技場目前的狀態傳送給您的微服務,接著您的微服務就會回應指令,並指出要執行的操作。

當然,目標是取得成功,但您將學習如何在 Google Cloud 中建構及部署微服務。

運作方式

接著,您將使用 Go、Java、Kotlin、Scala、NodeJS 或 Python 啟動條件建構微服務,並在 Google Cloud 中部署微服務。部署完成後,請將微服務的網址告訴我們,我們隨後會將其新增至競技場中。

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

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

過往競技場看起來如下:

20628e6bd442bd11.png

範例:一戰競技場

改變的衝突

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

觀看戰鬥

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

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 輸出內容

d88e40430706a32b.png

確認微服務是否正常運作

在 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

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

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

然後您就可以看到有關變更的進一步指示。

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

準備好部署變更時,請在 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 執行專案:

  1. [在 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
  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 桌面 GUI 應用程式 (Windows 或 Mac)。如果您使用的是 Cloud Shell,就必須使用 git CLI。如要在 GitHub 上取得微服務的程式碼,請按照 CLI 或 GitHub 桌面的說明操作。

使用 Git CLI 推送程式碼

  1. 按照使用個人存取權杖的 Git over https 操作說明進行
  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. 設定使用 Buildpacks 的建構類型
  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. 為服務建立 Heathcheck 網址。
  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. 恭喜

恭喜,您已成功建構及部署微服務,可以與其他微服務戰鬥!祝您好運!

參考文件