Battle One - マイクロサービスの戦場

1. はじめに

最終更新日: 2020 年 8 月 26 日

マイクロサービス バトルアリーナ

動きまわってふざけて他人に雪玉を投げる雪合戦をしたことがありますか?まだの場合はぜひお試しください。しかし今では、物理的に攻撃されるリスクを負うことなく、ネットワーク アクセス可能な小規模なサービス(マイクロサービス)を構築して、他のマイクロサービスとの戦いに加わることができます。このマイクロサービスの戦いは SpringOne でホストしているため、マイクロサービスは雪玉ではなく葉を投げることになります。

よくある疑問点しかし、マイクロサービスがどのようにして他のマイクロサービスのリーフに 移行するにはどうすればよいでしょうかマイクロサービスはネットワーク リクエスト(通常は HTTP 経由)を受信してレスポンスを返します。「アリーナ マネージャー」がいるがマイクロサービスにアリーナの現在の状態を送信し、マイクロサービスから処理内容を指定するコマンドが返されます。

もちろん、目標は成功です。その過程で、Google Cloud でのマイクロサービスの構築とデプロイについて学びます。

仕組み

任意のテクノロジーでマイクロサービスを構築し(または Java、Kotlin、Scala のスターターから選択できます)、Google Cloud にマイクロサービスをデプロイします。デプロイが完了したら、マイクロサービスの URL をフォームに入力してアリーナに追加します。

アリーナには特定のバトルのすべてのプレーヤーが参加します。SpringOne カンファレンスには専用のアリーナがあります。各プレーヤーは、移動して他のプレーヤーの方に葉を投げるマイクロサービスを表します。

1 秒に 1 回、アリーナ マネージャーがマイクロサービスを呼び出して現在のアリーナの状態(プレーヤーがいる場所)を送信し、マイクロサービスが処理内容のコマンドを返します。アリーナでは、前に進んだり、左右を曲がったり、葉を投げたりできます。投げられたリーフは、プレーヤーの向いている方向に 3 マスまで移動します。葉がぶつかったり一方のプレーヤーは得点となり、打ったプレーヤーは失点となります。アリーナのサイズは、現在のプレーヤー数に合わせて自動調整されます。

過去のアリーナは次のようになります。

20628e6bd442bd11.png

Battle One アリーナの例

紛争環境

アリーナでは、複数のプレーヤーが競合するアクションを試みる可能性があります。たとえば、2 人のプレーヤーが同じスペースに移動しようとする場合があります。競合が発生した場合、レスポンス時間が最も短いマイクロサービスが優先されます。

戦いを観戦

実際のマイクロサービスの動作を確認するには、ライブ アリーナをご覧ください

Battle API

Google のアリーナ マネージャーと連携するには、アリーナに参加するための特定の API をマイクロサービスで実装する必要があります。アリーナ マネージャーは、指定された URL に次の 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 にマイクロサービスをデプロイする手順を説明します。Cloud Run は、マイクロサービスやその他のアプリケーションを実行するための Google Cloud サービスです。

2. Google Cloud にログインする

マイクロサービスを Cloud Run にデプロイするには、Google Cloud にログインする必要があります。アカウントにクレジットが適用されますので、クレジット カード情報を入力する必要はありません。通常、G Suite アカウントの代わりに個人アカウント(例: gmail.com)を使用すると問題は少なくなります。G Suite 管理者が、ユーザーが Google Cloud の特定の機能を使用できないことがあるためです。また、これから使用するウェブ コンソールは Chrome や Firefox では問題なく動作しますが、Safari では問題が発生する可能性があります。

3. マイクロサービスをデプロイする

一般公開でアクセスでき、Battle API に準拠している限り、任意のテクノロジーでマイクロサービスを構築してどこにでもデプロイできます。しかし、簡単にするために、サンプル サービスから始めて、Cloud Run にデプロイするお手伝いをします。

サンプルを選ぶ

最初に使用できる Battle マイクロサービスのサンプルは 2 つあります。

Java とSpring Boot

ソース

Cloud Run にデプロイする

Kotlin とSpring Boot

ソース

Cloud Run にデプロイする

使用するサンプルが決まったら、[Deploy on 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」行の後にあるサービスの URL に置き換えます。

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. アリーナへの参加をリクエストする

アリーナに参加するには、名前、Cloud Run サービスの URL、そして必要に応じて GitHub ユーザー名(アバターやプロフィール写真用)を添えて、#3-principal-google-cloud Slack チャネルにメッセージを送信する必要があります。情報の確認が完了すると、プレーヤーがアリーナに表示されます。

5. メーカーと変更をデプロイする

変更を行う前に、GCP プロジェクトと使用したサンプルに関する情報を Cloud Shell で設定する必要があります。まず、GCP プロジェクトを一覧表示します。

gcloud projects list

おそらく、プロジェクトは 1 つだけです。後のコマンドで使用する環境変数を設定するために、最初の列の 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 に push します。これで、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 で] サンプルを ZIP に圧縮します。

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. よくある質問

マイクロサービスがアリーナに表示されないのはなぜですか?