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

1. はじめに

最終更新日: 2020 年 2 月 12 日

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

雪合戦で、動き回りながら他の人に雪玉を投げつけたことはありますか?まだの方は、ぜひお試しください。ただし、今度は物理的に叩かれるリスクを冒すのではなく、他のマイクロサービスとの壮大な戦いに参加する小さなネットワーク アクセス可能なサービス(マイクロサービス)を構築できます。この最初のマイクロサービス バトルはジョージア州アトランタで開催されるため、マイクロサービスは雪玉ではなく桃を投げます。

よくある疑問点マイクロサービスはどのようにして他のマイクロサービスに「桃」を投げつけるのでしょうか?マイクロサービスは、ネットワーク リクエスト(通常は HTTP 経由)を受信してレスポンスを返すことができます。「アリーナ マネージャー」がマイクロサービスにアリーナの現在の状態を送信し、マイクロサービスが実行するコマンドで応答します。

もちろん、目標は勝利ですが、その過程で Google Cloud でマイクロサービスを構築してデプロイする方法を学びます。

仕組み

任意のテクノロジーを使用してマイクロサービスを構築し(Java、Kotlin、Scala のスターターから選択することもできます)、Google Cloud にデプロイします。デプロイが完了したら、フォームに記入してマイクロサービスの URL をお知らせください。その URL をアリーナに追加します。

アリーナには、特定のバトルのすべてのプレーヤーが含まれます。DevNexus カンファレンスでは、1 日に 1 つのアリーナが用意されます。各プレーヤーは、動き回って他のプレーヤーに桃を投げるマイクロサービスを表します。

アリーナ マネージャーは、1 秒に 1 回程度マイクロサービスを呼び出し、現在のアリーナの状態(プレーヤーの位置)を送信します。マイクロサービスは、実行するコマンドで応答します。アリーナでは、前進、左右への回転、桃の投擲が可能です。投げた桃は、プレイヤーが向いている方向に最大 3 マス移動します。桃が別のプレーヤーに当たると、投げたプレーヤーは 1 ポイントを獲得し、当たったプレーヤーは 1 ポイントを失います。アリーナのサイズは、現在のプレーヤー数に合わせて自動調整されます。

3 人の架空のプレーヤーがいるアリーナは次のようになります。

9e4775d13ff18d4d.png

バトル ピーチ アリーナの例

Revolving Conflicts

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

バトルを観戦する

マイクロサービスが戦場でどのように機能しているかを確認するには、ライブ アリーナをご覧ください

Battle API

アリーナ マネージャーと連携するには、マイクロサービスで特定 API を実装してアリーナに参加する必要があります。アリーナ マネージャーは、次の JSON 構造で、HTTP POST を使用して現在の状態をユーザーが指定した URL に送信します。

{
  "_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)で、次の手を表す 1 文字の大文字(次のいずれか)を含むレスポンス本文でなければなりません。

F <- move Forward
R <- turn Right
L <- turn Left
T <- Throw

これで操作は完了です。マイクロサービスやその他のアプリケーションを実行するための Google Cloud サービスである Cloud Run にマイクロサービスをデプロイする手順について説明します。

2. マイクロサービスのデプロイ

マイクロサービスは、公開されていて Battle API に準拠している限り、任意のテクノロジーで構築して任意の場所にデプロイできます。簡単な例として、ランダムなコマンドを選択するだけのサンプル プロジェクトから始めることができます。

最初に使うサンプルを選ぶ

次の 3 つの battle マイクロサービス サンプルから始めることができます。

Java と Spring Boot

ソース

Cloud Run にデプロイする

Java と Quarkus

ソース

Cloud Run にデプロイする

Kotlin と Micronaut

ソース

Cloud Run にデプロイする

Kotlin と Quarkus

ソース

Cloud Run にデプロイする

Scala と Play Framework

ソース

Cloud Run にデプロイする

Go

ソース

Cloud Run にデプロイする

開始するサンプルを決めたら、上の [Cloud Run にデプロイ] ボタンをクリックします。これにより、Cloud Shell(クラウド内の仮想マシンへのウェブベースのコンソール)が起動し、ソースがクローンされ、デプロイ可能なパッケージ(Docker コンテナ イメージ)にビルドされます。このパッケージは Google Container Registry にアップロードされ、Cloud Run にデプロイされます。

求められたら、us-central1 リージョンを指定します。

次のスクリーンショットは、マイクロサービスのビルドとデプロイの Cloud Shell 出力です。

d88e40430706a32b.png

マイクロサービスが機能することを確認する

Cloud Shell で、新しくデプロイしたマイクロサービスにリクエストを送信できます。YOUR_SERVICE_URL は、サービスの 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

F、L、R、T のいずれかのレスポンス文字列が表示されます。

アリーナへの参加をリクエストする

アリーナに参加するには、簡単なフォームに記入する必要があります。最も難しいのは、プロフィール画像に何を使用するかを決めることです。GitHub の画像、LinkedIn の画像、またはランダムなアバターを使用できます。送信された内容は審査され、審査が完了すると、アリーナにプレーヤーが表示されます。

変更の作成とデプロイ

変更を行う前に、使用した 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-micronaut
export SAMPLE=scala-play

これで、Cloud Shell 内からマイクロサービスのソースを編集できるようになりました。Cloud Shell ウェブベースのエディタを開くには、次のコマンドを実行します。

cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md

変更を行うための手順が表示されます。

f910c9ef7b51c406.png

サンプル プロジェクトが開いているエディタを含む Cloud Shell

変更を保存したら、Cloud Shell で pack コマンドを使用してプロジェクトをビルドします。このコマンドは、Buildpack を使用してプロジェクト タイプを検出し、コンパイルして、デプロイ可能なアーティファクト(Docker コンテナ イメージ)を作成します。

pack build gcr.io/$PROJECT_ID/$SAMPLE \
  --path cloudbowl-microservice-game/samples/$SAMPLE \
  --builder heroku/buildpacks

コンテナ イメージが作成されたので、docker コマンド(Cloud Shell 内)を使用して、コンテナ イメージを 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

これで、アリーナで新しいバージョンが使用されるようになります。

3. 完了

お疲れさまでした。これで、他のマイクロサービスと対戦できるマイクロサービスをビルドしてデプロイできました。それでは始めましょう。

次のステップ

リファレンス ドキュメント