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

1. はじめに

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

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

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

よくある質問:では、マイクロサービスが他のマイクロサービスに「虹を投げる」方法を説明します。マイクロサービスは、(通常は HTTP 経由で)ネットワーク リクエストを受信し、レスポンスを返すことができます。「アリーナ マネージャー」がアリーナの現在の状態をマイクロサービスに送信し、マイクロサービスが、実行する操作を指定するコマンドで応答します。

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

仕組み

任意のテクノロジー(Go、Java、Kotlin、Scala、NodeJS、Python のいずれか)でマイクロサービスを構築し、Google Cloud にデプロイします。デプロイしたら、マイクロサービスの URL をお知らせください。Google がアリーナに追加します。

アリーナには、特定の戦闘のすべてのプレーヤーが含まれます。レインボー ランパスには独自のアリーナがあります。各プレーヤーは、移動して他のプレーヤーに虹を投げるマイクロサービスを表します。

アリーナ マネージャーは約 1 秒ごとにマイクロサービスを呼び出し、現在のアリーナの状態(プレーヤーの位置)を送信します。マイクロサービスは、何をすべきかについてのコマンドと応答します。アリーナでは、前進、左折、右折、レインボー投擲を行うことができます。プレイヤーが向いている方向に、虹が最大 3 マス移動します。レインボーボールが他のプレーヤーに「当たった」場合、投げたプレーヤーは 1 ポイントを獲得し、当たったプレーヤーは 1 ポイントを失います。アリーナのサイズは、現在のプレーヤー数に合わせて自動調整されます。

過去のアリーナは次のようになります。

20628e6bd442bd11.png

バトル 1 のアリーナの例

繰り返される競合

アリーナでは、複数のプレーヤーが競合するアクションを実行しようとする可能性があります。たとえば、2 人のプレーヤーが同じ場所に移動しようとする場合があります。競合が発生した場合は、レスポンス時間が最短のマイクロサービスが優先されます。

試合の視聴

マイクロサービスのパフォーマンスを確認するには、ライブ アリーナをご覧ください。

Battle API

アリーナ マネージャーと連携するには、アリーナに参加するための特定の API をマイクロサービスに実装する必要があります。アリーナ マネージャーは、指定された URL に HTTP POST で現在のアリーナの状態を送信します。JSON の構造は次のとおりです。

{
  "_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 にログインする必要があります。クレジットがアカウントに適用されます。クレジット カードの入力は必要ありません。通常、GSuite アカウントではなく個人アカウント(gmail.com など)を使用するほうが問題が少なくなります。これは、GSuite 管理者がユーザーが特定の 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

FLRT のいずれかのレスポンス文字列が表示されます。

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

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

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

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

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

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

独自の IDE を使用してローカルでプロジェクトを操作する手順は次のとおりです。

  1. [Cloud Shell で] サンプルを ZIP 圧縮します。
# 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_IDSAMPLE を 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. Buildpack を使用するように Build Type を設定する
  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. 完了

これで、他のマイクロサービスと戦えるマイクロサービスを構築してデプロイできました。それでは始めましょう。

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