マイクロサービスレインボー ルンパス

1. はじめに

最終更新日: 2021 年 5 月 6 日

マイクロサービス Rainbow Rumpus

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

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

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

仕組み

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

アリーナには、特定のバトルに参加するすべてのプレーヤーが含まれます。Rainbow Rumpus には独自のアリーナがあります。各プレーヤーは、動き回って他のプレーヤーに虹を投げるマイクロサービスを表します。

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

過去のアリーナは次のように表示されます。

20628e6bd442bd11.png

バトル 1 のアリーナの例

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 にデプロイする方法について説明します。

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

多数のバトル マイクロサービス サンプルから始めることができます。

Kotlin と Spring Boot

ソース

Kotlin と Micronaut

ソース

Kotlin と Quarkus

ソース

Java と Spring Boot

ソース

Java と Quarkus

ソース

Go

ソース

Node.js と Express

ソース

Python と Flask

ソース

開始するサンプルを決めたら、上の [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. アリーナへの参加をリクエストする

レインボー ランパスに参加するには、アリーナに参加する必要があります。rainbowrumpus.dev を開き、マイクロサービス URL を指定するアリーナで [参加] をクリックします。

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=kotlin-micronaut
export SAMPLE=kotlin-quarkus
export SAMPLE=kotlin-springboot
export SAMPLE=java-quarkus
export SAMPLE=java-springboot
export SAMPLE=go
export SAMPLE=nodejs
export SAMPLE=python

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

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

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

f910c9ef7b51c406.png

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

変更を保存したら、README.md ファイルのコマンドを使用して Cloud Shell でアプリケーションを起動します。ただし、その前に Cloud Shell で正しいサンプル ディレクトリに移動してください。

cd cloudbowl-microservice-game/samples/$SAMPLE

アプリケーションが実行されたら、新しい 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 コンテナ イメージ)を作成します。

# Make sure you are in a Cloud Shell tab where you set the PROJECT_ID
# and SAMPLE env vars. Otherwise, set them again.
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 \
          --allow-unauthenticated

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

6. ローカルで開発する(省略可)

次の手順に沿って、独自の IDE を使用してプロジェクトをローカルで操作できます。

  1. [Cloud Shell で] サンプルを圧縮します。
# Make sure the SAMPLE env var is still set. If not, re-set it.
cd ~/cloudbowl-microservice-game/samples
zip -r cloudbowl-sample.zip $SAMPLE
  1. [Cloud Shell で] ZIP ファイルをマシンにダウンロードします。
cloudshell download-file cloudbowl-sample.zip
  1. [自分のマシンで] ファイルを解凍し、変更を加えてテストする
  2. [マシンで] gcloud CLI をインストールする
  3. [マシンで] Google Cloud にログインします。
gcloud auth login
  1. [マシンで] 環境変数 PROJECT_ID と SAMPLE を Cloud Shell と同じ値に設定します。
  2. [マシン上] Cloud Build を使用してコンテナをビルドします(ルート プロジェクト ディレクトリから)。
gcloud alpha builds submit . \
  --pack=image=gcr.io/$PROJECT_ID/$SAMPLE \
  --project=$PROJECT_ID
  1. [マシンで] 新しいコンテナをデプロイします。
gcloud run deploy $SAMPLE \
  --project=$PROJECT_ID \
  --platform=managed \
  --region=us-central1 \
  --image=gcr.io/$PROJECT_ID/$SAMPLE \
  --allow-unauthenticated

7. 継続的デリバリー

SCM を設定する

チームでマイクロサービスを共同作業できるように GitHub を設定します。

  1. GitHub にログインする
  2. 新しいリポジトリを作成する
  3. ローカルマシンで作業している場合は、git コマンドライン インターフェース(CLI)または GitHub Desktop GUI アプリケーション(Windows または Mac)を使用できます。Cloud Shell を使用している場合は、git CLI を使用する必要があります。GitHub でマイクロサービスのコードを取得するには、CLI または GitHub Desktop の手順に沿って操作します。

git CLI を使用してコードを push する

  1. 個人用アクセス トークンを使用した https 経由の git の手順に沿って操作します。
  2. [repo] スコープを選択する
  3. git を設定します。
git config --global credential.helper \
  'cache --timeout=172800'
git config --global push.default current
git config --global user.email "YOUR@EMAIL"
git config --global user.name "YOUR NAME"
  1. GitHub の組織とリポジトリの環境変数を設定する(https://github.com/ORG/REPO)
export GITHUB_ORG=YOUR_GITHUB_ORG
export GITHUB_REPO=YOUR_GITHUB_REPO
  1. コードを新しいリポジトリに push する
# Make sure the SAMPLE env var is still set. If not, re-set it.
cd ~/cloudbowl-microservice-game/samples/$SAMPLE
git init
git add .
git commit -m init
git remote add origin https://github.com/$GITHUB_ORG/$GITHUB_REPO.git
git branch -M main

# This will now ask for your GitHub username & password
# for the password use the personal access token
git push -u origin main
  1. 変更を加えたら、変更を commit して GitHub に push できます。
git add .
git status
git diff --staged
git commit -am "my changes"
git push

GitHub Desktop でコードを push する

  1. 前の「ローカルで開発する」ラボの手順に沿ってコードをダウンロードします。
  2. GitHub Desktop をインストールして起動し、ログインします。
  3. 新しく作成したリポジトリのクローンを作成する

cf7f38c7c86a91cd.png

  1. ファイル エクスプローラを開き、プロジェクトを新しいリポジトリにコピーします。
  2. 変更を commit する

5f3c1552e30ad7c5.png

  1. メインブランチを GitHub に公開する

Cloud Run の継続的デプロイを設定する

GitHub で SCM を設定したら、継続的デリバリーを設定して、新しい commit が main ブランチに push されるたびに、Cloud Build が変更を自動的にビルドしてデプロイするようにします。デプロイ前にテストを実行する継続的インテグレーションを追加することもできますが、すぐに使用できるサンプルにはテストが含まれていないため、このステップは演習として残されています。

  1. Cloud コンソールで、Cloud Run サービスに移動します。
  2. [継続的デプロイを設定] ボタンをクリックします。
  3. GitHub で認証し、マイクロサービスのリポジトリを選択する

a3b5692f178869bc.png

  1. GitHub リポジトリを選択し、ブランチを ^main$ に設定します。

338f1c00f33d2f65.png

  1. Buildpacks を使用するビルドタイプを設定する
  2. [保存] をクリックして、継続的デプロイを設定します。

8. オブザーバビリティ

物事はうまくいかないものです。オブザーバビリティにより、このような事態が発生したタイミングを把握し、その原因を診断できます。指標は、サービスの健全性と使用状況に関するデータを示します。ログには、サービスから出力された手動で計測された情報が表示されます。アラートを使用すると、問題が発生したときに通知を受け取ることができます。それぞれについて詳しく見ていきましょう。

指標

  1. Cloud Run サービスのリストでサービスを見つけます。
  2. サービスの名前をクリックして、指標ダッシュボードに移動します。

8491b8ec6bc5b4db.png

  1. 指標の ⋮ メニューをクリックし、[Metrics Explorer で表示] を選択します。
  2. リソース指標、フィルタ、グループ化などのオプションを変更できるようになりました。たとえば、すべてのサービスの平均サービス レイテンシを表示できます。

f0d666d8f4221d45.png

ログ

サービスからの STDOUT 出力は Google Cloud Logging システムに送信されます。Cloud Run サービスの管理ページから、次のような基本的なログビューにアクセスできます。

40058a82c9299cff.png

Cloud Run ログでは、重大度でフィルタしてログをフィルタできます。柔軟性を高めるには、186fdb0e6d39a6ca.png をクリックします。

アラート

  1. サービスのヘルスチェック URL を作成します。
  2. Spring Boot の場合は、次の依存関係を追加するだけです。
org.springframework.boot:spring-boot-starter-actuator
  1. src/main/resources/application.properties を作成または更新し、ディスク容量のチェックを無効にします。
management.health.diskspace.enabled=false
  1. プロトコル、ホスト名、パスを指定して、稼働時間アラートを作成します。Spring Boot の場合、パスは /actuator/health です。
  2. アラートをテストする

6948d13b263bf573.png

  1. アラートを作成する

9. 完了

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

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