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

1. はじめに

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

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

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

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

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

仕組み

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

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

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

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

9e4775d13ff18d4d.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. マイクロサービスをデプロイする

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

サンプルを選ぶ

開始できる 3 つの Battle マイクロサービス サンプルがあります。

Java とSpring Boot

ソース

Cloud Run にデプロイする

Java とQuarkus

ソース

Cloud Run にデプロイする

Kotlin とMicronaut

ソース

Cloud Run にデプロイする

Kotlin とQuarkus

ソース

Cloud Run にデプロイする

Scala とPlay フレームワーク

ソース

Cloud Run にデプロイする

Go

ソース

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 のいずれかのレスポンス文字列が表示されます。

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

アリーナに参加するには、簡単なフォームに入力する必要があります。最も難しいのは、プロフィール画像を何に使うかを決めることです。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 コマンドを使用してプロジェクトをビルドします。このコマンドは、Buildpacks を使用してプロジェクト タイプを検出してコンパイルし、デプロイ可能なアーティファクト(Docker コンテナ イメージ)を作成します。

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

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

これで、アリーナはあなたの新しいバージョンを使うようになります!

3. 完了

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

次のステップ

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