ハモンと戦う - マイクロサービスの合戦場

1. はじめに

最終更新日: 2020 年 5 月 5 日

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

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

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

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

仕組み

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

アリーナには、特定のバトルのすべてのプレーヤーが含まれます。Spring I/O Bridge カンファレンスには独自の会場が用意されます。各プレーヤーは、動き回って他のプレーヤーにハモンを投げるマイクロサービスを表します。

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

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

20628e6bd442bd11.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. 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 にデプロイする

開始するサンプルを決めたら、上の [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 のいずれかのレスポンス文字列が表示されます。

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

アリーナに参加するには、名前、Cloud Run サービス URL、アバター / プロフィール写真用の GitHub ユーザー名(任意)を #battle-jamon チャンネルに送信する必要があります。情報が確認されると、プレーヤーがアリーナに表示されます。

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

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

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

コンテナ イメージが作成されたので、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

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

6. 完了

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

学習を続ける

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

7. よくある質問

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

最終戦はどのように行われますか?

最終決戦前のアリーナの仕組み

勝つにはどうすればよいですか?

ローカルで開発できますか?