1. はじめに
最終更新日: 2020 年 2 月 12 日
マイクロサービス バトル アリーナ
雪合戦で、動き回りながら他の人に雪玉を投げつけたことはありますか?まだの方は、ぜひお試しください。ただし、今度は物理的に叩かれるリスクを冒すのではなく、他のマイクロサービスとの壮大な戦いに参加する小さなネットワーク アクセス可能なサービス(マイクロサービス)を構築できます。この最初のマイクロサービス バトルはジョージア州アトランタで開催されるため、マイクロサービスは雪玉ではなく桃を投げます。
よくある疑問点マイクロサービスはどのようにして他のマイクロサービスに「桃」を投げつけるのでしょうか?マイクロサービスは、ネットワーク リクエスト(通常は HTTP 経由)を受信してレスポンスを返すことができます。「アリーナ マネージャー」がマイクロサービスにアリーナの現在の状態を送信し、マイクロサービスが実行するコマンドで応答します。
もちろん、目標は勝利ですが、その過程で Google Cloud でマイクロサービスを構築してデプロイする方法を学びます。
仕組み
任意のテクノロジーを使用してマイクロサービスを構築し(Java、Kotlin、Scala のスターターから選択することもできます)、Google Cloud にデプロイします。デプロイが完了したら、フォームに記入してマイクロサービスの URL をお知らせください。その URL をアリーナに追加します。
アリーナには、特定のバトルのすべてのプレーヤーが含まれます。DevNexus カンファレンスでは、1 日に 1 つのアリーナが用意されます。各プレーヤーは、動き回って他のプレーヤーに桃を投げるマイクロサービスを表します。
アリーナ マネージャーは、1 秒に 1 回程度マイクロサービスを呼び出し、現在のアリーナの状態(プレーヤーの位置)を送信します。マイクロサービスは、実行するコマンドで応答します。アリーナでは、前進、左右への回転、桃の投擲が可能です。投げた桃は、プレイヤーが向いている方向に最大 3 マス移動します。桃が別のプレーヤーに当たると、投げたプレーヤーは 1 ポイントを獲得し、当たったプレーヤーは 1 ポイントを失います。アリーナのサイズは、現在のプレーヤー数に合わせて自動調整されます。
3 人の架空のプレーヤーがいるアリーナは次のようになります。

バトル ピーチ アリーナの例
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 | ||
Java と Quarkus | ||
Kotlin と Micronaut | ||
Kotlin と Quarkus | ||
Scala と Play Framework | ||
Go |
開始するサンプルを決めたら、上の [Cloud Run にデプロイ] ボタンをクリックします。これにより、Cloud Shell(クラウド内の仮想マシンへのウェブベースのコンソール)が起動し、ソースがクローンされ、デプロイ可能なパッケージ(Docker コンテナ イメージ)にビルドされます。このパッケージは Google Container Registry にアップロードされ、Cloud Run にデプロイされます。
求められたら、us-central1 リージョンを指定します。
次のスクリーンショットは、マイクロサービスのビルドとデプロイの Cloud Shell 出力です。

マイクロサービスが機能することを確認する
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
変更を行うための手順が表示されます。

サンプル プロジェクトが開いているエディタを含む 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. 完了
お疲れさまでした。これで、他のマイクロサービスと対戦できるマイクロサービスをビルドしてデプロイできました。それでは始めましょう。