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

1. はじめに

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

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

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

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

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

仕組み

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

アリーナには特定のバトルのすべてのプレーヤーが参加します。Spring I/O Bridge カンファレンスは、それぞれ専用のアリーナを持つ予定です。各プレーヤーはマイクロサービスを表し、そのマイクロサービスは他のプレーヤーに向けて移動し、jamón を投げます。

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

3 人のプレーヤーが構成したアリーナの外観は次のとおりです。

20628e6bd442bd11.png

バトル ハモン アリーナの例

紛争環境

アリーナでは、複数のプレーヤーが競合するアクションを試みる可能性があります。たとえば、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 のユーザー名(アバターやプロフィール写真)を入力して、#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

変更をデプロイする準備ができたら、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. 完了

これで、他のマイクロサービスと競合するマイクロサービスを正常にビルドし、デプロイできました。それでは始めましょう。

もっと詳しく

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

7. よくある質問

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

最終的なバトルの実行はどのようになりますか?

最終戦前のアリーナはどのような仕組みですか?

成約するには?

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