戰鬥一 - 微服務戰場

1. 簡介

上次更新時間:2020 年 8 月 26 日

微服務戰鬥競技場

您是否曾在雪球大戰中四處移動,然後把雪球扔到他處?如果沒有,不妨今天就試試看!但現在您不用擔心可能遭到實體攻擊,而是可以建構可透過網路存取的小型服務 (「微服務」),在激烈的戰鬥中與其他微服務一同奮戰。由於我們是在 SpringOne 舉辦這項微服務戰鬥,微服務會丟出葉子,而不是雪球。

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

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

運作方式

您將使用自己想要的任何技術建構微服務 (或選擇 Java、Kotlin 或 Scala 入門),然後在 Google Cloud 中部署微服務。部署完成後,您可以填寫表單來告訴我們微服務的網址,我們會將該網址新增至競技場中。

這場競技場集結了所有參與特定戰鬥的球員。SpringOne 會議將有專屬的競技場。每個玩家都代表一個微服務,內容會移動,也會從其他玩家丟棄。

大約一次,我們的運動場經理會呼叫您的微服務,傳送目前運動場狀態 (玩家所在位置),您的微服務就會回應指令,要求執行動作。在競技場中,你可以往前移動、向左/右轉,或是丟葉。丟的葉子會朝玩家面對的方向移動最多三個空間。如果節能綠葉的「命中」另一名玩家則獲得 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。

先選好試閱內容

您可以從以下兩個戰鬥微服務範例開始:

Java 與春季靴

資料來源

在 Cloud Run 部署

Kotlin 和春季靴

資料來源

在 Cloud Run 部署

決定要從哪個範例開始部署後,請按一下「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

畫面上應該會顯示 F、L、R 或 T 的回應字串。

4. 要求加入競技場

如要加入競技場,您必須向 #3-sponsor-google-cloud Slack 頻道傳送訊息,並附上您的姓名、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

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

f910c9ef7b51c406.png

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

準備好部署變更時,請在 Cloud Shell 中使用 pack 指令建構專案。這個指令會使用 Buildpacks 來偵測專案類型、加以編譯,以及建立可部署的構件 (docker 容器映像檔)。

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\
          --memory=512Mi\
          --allow-unauthenticated

競技場就會使用你的新版本!

6. 在本機開發

您可以按照下列步驟,在本機使用自己的 IDE 執行專案:

  1. [在 Cloud Shell 中] 壓縮範例:

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

  1. [在您的機器上] 部署新容器:

gcloud run deploy $SAMPLE --project=$PROJECT_ID --platform=managed --region=us-central1 --image=gcr.io/$PROJECT_ID/$SAMPLE --memory=512Mi --allow-unauthenticated

7. 恭喜

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

繼續學習

參考文件

8. 常見問題

為什麼我的微服務未顯示在競技場中?