【第4回】Dapr の真骨頂 ビルディングブロックを使ったアプリケーション開発

“これだけ分かれば大丈夫 Dapr 入門シリーズ” 第4回目の本記事では Dapr の真骨頂であるビルディングブロックを利用したアプリケーション開発方法を紹介します。

おさらい

これまでの内容を簡単におさらいするため、Dapr の各種コンポーネントを再度簡単に紹介します。より詳細な内容については、「【第1回】クラウドネイティブアプリの問題を解決する Dapr とは」で確認出来ます。

Dapr

Dapr は以下 4 つの特徴を軸に、クラウドネイティブなアプリケーション開発を支援します。

  1. ビルディングブロック (Building Block)
  2. プラットフォーム・言語フリー (No Limits)
  3. Open API 準拠
  4. Open Source

Kubernetes 環境の場合には Dapr を各アプリケーションのサイドカーコンテナとして起動します。

Image for post

上の図の環境の場合、Dapr Runtime を通して各アプリケーション間およびアプリケーションとステートストア間はやり取りを行います。Dapr を通してこれらのやり取りを行うことで、各アプリケーションでは、サービス間呼び出し時のリトライ処理やステートストア利用時の実装が不要です。これは Dapr が提供するビルディングブロック機能により実現されます。

ビルディングブロックとコンポーネント

Dapr の提供するビルディングブロックは Cloud Native なアプリケーションやマイクロサービス化されたアプリケーションを実装する上でよく利用される処理 (例えば、サービス間呼び出しやメッセージングモデル) を抽象化したものです。それに対してコンポーネントはビルディングブロックを具体的に実装したものになります。例えば、ビルディングブロック: ステートストア / コンポーネント: Redis といった関係です。

Image for post

サンプルアプリの構成と準備

本記事では、Dapr を利用したアプリケーション開発の特徴を実感するため、ステートストアを必要とするアプリケーション開発を例に紹介します。本記事では、ステートストアに Redis を利用します。

サンプルアプリケーションは GitHub から取得することが可能です。また、サンプルアプリケーションは Go 言語で実装されており、以下の機能を持ちます。

  • HTTP GET リクエストを受けた後、Redis からデータを読み込む (Path: /order)
  • HTTP POST リクエストを受けた後、Redis にデータを書き込む (Path: /neworder)

Dapr の特徴をより一層理解しやすくするために、以下の構成で Dapr の特徴を紹介していきます。

  1. Dapr を利用しない場合の実装方法
  2. Dapr を利用した場合の実装方法
  3. Redis 以外のステートストアに乗り換え・追加したい場合の実装方法

サンプルアプリの取得

本記事では、Go 言語を利用したサンプルコードを用意していますが、HTTP リクエストを扱うことの出来る任意のプログラミング言語で Dapr は利用が可能です。サンプルコードは GitHub より取得可能です。

Redis デプロイ

サンプルアプリを実行するには、実装上の仕様で以下の Redis 環境が必要になります。

  • Address: localhost:6379
  • Password: Empty (無し)
  • DB: 0 (デフォルト DB)

dapr init を実行済みの場合、上記の環境を満たす Redis コンテナが既に作成されているため、以下のコマンドを実行する必要はありません。

Dapr を利用しない場合の実装方法

まずは Dapr を利用しない場合の Redis 利用時の実装方法について確認してみます。サンプルアプリケーションは Go 言語で実装しています。

実装確認

アプリケーションの中で HTTP GET リクエストを担っている getOrder ハンドラは以下の通りです。

Redis に保存されているデータ (Key: order) に取得する部分に Go 言語用の Redis Client を利用しています。

アプリケーション全体の実装については、redis/main.go より確認できます。

アプリケーション起動

以下のコマンドを実行し、アプリケーションを起動します。

動作確認

別のターミナルを開き、以下のコマンドを実行し、アプリケーションに HTTP リクエストを送信します。

[{“key”:”order”,”value”:{“data”:{“orderId”:”42"}}}] のようなメッセージが表示されれば成功です。

Dapr を利用する場合の実装方法

次に Dapr を利用した場合の Redis 利用時の実装方法について確認してみます。先ほど同様、サンプルアプリケーションは Go 言語で実装しています。

実装確認

アプリケーションの中で HTTP GET リクエストを担っている getOrder ハンドラは以下の通りです。

先ほどの Go 言語用の Redis Client を利用していた場合と異なり、Redis に保存されているデータ (Key: order) に取得する部分には HTTP リクエストを利用しています。この HTTP エンドポイントは Dapr により提供されるもので、Redis からデータを読み書きする橋渡しをしてくれます。

これにより、利用するソフトウェアやクラウドサービス、言語の SDK の仕様などに依存することなく、ビルディングブロックの共通実装に乗っ取り簡潔にアプリケーションの実装が可能になります。つまり、アプリケーション開発者は調査の手間を省くことができ、またサービスリリース後に起こりうる追加機能の実装やアーキテクチャ変更に伴う更新も最小限に抑えることが出来ます。

アプリケーション全体の実装については、redis-dapr/main.go より確認できます。

アプリケーション起動

以下のコマンドを実行し、アプリケーションを起動します。

上記で利用している dapr コマンドの実行オプションは以下の通りです。

  • dapr run: Dapr を利用したアプリケーションの実行。
  • app-id: Dapr 環境のアプリケーション同士の通信で利用されるアプリケーション ID。サービス間通信を行う際などに利用される ID。
  • app-port: アプリケーションがオープンしているポート番号。このサンプルアプリケーション (Go) では 8080 番ポートでリッスン。
  • port: Dapr がアプリケーションのインタフェースとして待ち構える際のポート番号。サービス間通信を行う際などに利用されるポート番号。この環境では 3500 番ポートでリッスン。Dapr が 3500 番ポートで受け付けたリクエストを実際に裏で待ち構えているアプリケーションの 8080 番ポートへリクエストを中継する形。詳細は「【第2回】Hello World ~ Dapr を Standalone で動かしてみる」で確認出来ます。
  • go run main.go: この部分は各言語の実行コマンドを記述します。Go 言語の場合には、本記述によって main.go にて実装された実行。

動作確認

別のターミナルを開き、以下のコマンドを実行し、アプリケーションに HTTP リクエストを送信します。

{“data”:{“orderId”:”42"}} のようなメッセージが表示されれば成功です。

dapr run コマンドを実行したターミナルに戻り、dapr コマンドで起動したアプリケーションを Ctrl + C で停止します。

ステートストアを変更・追加する場合の実装方法

本記事では、例としてステートストアを Redis から MongoDB に変更する際のやり方を紹介します。アプリケーションのコードを一切変更する事なく実施出来る点に注目です。

MongoDB の用意

以下のコマンドを実行し、MongoDB をデプロイします。

MongoDB 用コンポーネントの確認

Dapr はデフォルトで Redis をステートストアとして利用しますが、様々なクラウドサービスおよびソフトウェアのコンポーネントが用意されているため、簡単に Redis 以外のソフトウェアも利用することが出来ます。以下は MongoDB を利用する際のコンポーネント設定用 YAML ファイルです。

上記の設定ファイルでは必要最小限のパラメータしか記載していませんが、オプションでデータベースやコレクションなどの設定をすることも可能です。

以下のコマンドを実行し、アプリケーションを起動します。

動作確認

別のターミナルを開き、以下のコマンドを実行し、アプリケーションに HTTP リクエストを送信します。

{“data”:{“orderId”:”42"}} のようなメッセージが表示されれば成功です。

dapr run コマンドを実行したターミナルに戻り、dapr コマンドで起動したアプリケーションを Ctrl + C で停止します。

まとめ

“これだけ分かれば大丈夫 Dapr 入門シリーズ” 第4回目の本記事では、Dapr の真骨頂であるビルディングブロックを使ったアプリケーション開発方法を紹介しました。

ビルディングブロックはコミュニティより今後一層拡張が予定されていますので、今回紹介したソフトウェア以外にもクラウドサービスなどで気になるものがあるか是非確認してみてください (コンポーネント管理サイト)。また、別のブログ記事にて Dapr の OSS コミュニティへの貢献方法 (主にコーディング・機能追加周り) について紹介しますので、足りない機能については是非追加してみてください。

次回は Dapr メトリクスやログを収集する様子をサンプルアプリケーションを利用しながら紹介します。

参考

Written by

投稿内容は私個人の意見であり、所属企業を代表するものではありません。

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store