Zenn
Open4

「Dapr」を試す

kun432kun432

公式サイト

https://dapr.io/

GitHubレポジトリ

https://github.com/dapr/dapr

Dapr

セキュアで信頼性の高いマイクロサービス構築のためのAPI

Daprは、分散アプリケーション構築のためのベストプラクティスとパターンが組み込まれた統合API群です。Daprは、ワークフロー、パブリッシュ/サブスクライブ、状態管理、シークレットストア、外部設定、バインディング、アクター、分散ロック、暗号化など、既製の機能により、開発者の生産性を20〜40%向上させます。組み込みのセキュリティ、信頼性、観測可能性機能により、プロダクションレベルのアプリケーションを実現するための定型コードを書く必要がありません。

Daprは、CNCFプロジェクトとして卒業しており、プラットフォームチームは複雑なセットアップを構成しつつ、アプリケーション開発チームにはシンプルなインターフェイスを提供することで、高いスケーラビリティを持つ分散アプリケーションの構築を容易にします。多くのプラットフォームチームが、APIベースのインフラストラクチャ連携におけるガバナンスとゴールデンパスを提供するためにDaprを採用しています。


referred from https://github.com/dapr/dapr

私たちは、Cloud Native Computing Foundation (CNCF)の卒業プロジェクトです。

ゴール

  • 任意の言語やフレームワークを使用する開発者が分散アプリケーションを作成できるようにする
  • マイクロサービスアプリケーション構築時に開発者が直面する困難な問題を、ベストプラクティスの構成要素を提供することで解決する
  • コミュニティ主導で、オープンかつベンダーニュートラルであること
  • 新たなコントリビューターを獲得する
  • オープンAPIを通じて一貫性と移植性を提供する
  • クラウドとエッジ間でプラットフォームに依存しないこと
  • 拡張性を重視し、ベンダーロックインのないプラグイン可能なコンポーネントを提供する
  • 高性能かつ軽量であることにより、IoTおよびエッジシナリオを実現する
  • 既存コードから段階的に採用できる、ランタイム依存なしのこと

動作の仕組み

Daprは、各計算単位にサイドカー(コンテナまたはプロセス)を注入します。サイドカーはイベントトリガーと連携し、標準HTTPまたはgRPCプロトコルを介して計算単位と通信します。これにより、既存および将来のすべてのプログラミング言語を、フレームワークやライブラリをインポートすることなくサポートできます。

Daprは、標準HTTP動詞またはgRPCインターフェイスを介して、組み込みの状態管理、信頼性の高いメッセージング(少なくとも一度の配信)、トリガーおよびバインディングを提供します。これにより、ステートレス、ステートフル、アクターライクなサービスを同一のプログラミングパラダイムで自由に記述できます。整合性モデル、スレッドモデル、メッセージ配信パターンを自由に選択できます。

Daprは、Kubernetes上でネイティブに動作し、ローカル開発環境のセルフホスト型バイナリ、IoTデバイス、またはクラウドやオンプレミスのあらゆるシステムに注入可能なコンテナとして動作します。

Daprは、Redisなどのプラグイン可能なコンポーネント状態ストアやメッセージバス、およびgRPCを使用して、直接のdapr-to-dapr通信(gRPC利用)や、保証された配信および少なくとも一度のセマンティクスを持つ非同期パブリッシュ/サブスクライブなど、幅広い通信手段を提供します。

なぜDaprなのか?

高性能でスケーラブルかつ信頼性の高い分散アプリケーションの作成は困難です。Daprは、実績あるパターンとプラクティスを提供し、イベント駆動型とアクターのセマンティクスをシンプルで一貫性のあるプログラミングモデルに統合します。フレームワークに縛られることなくすべてのプログラミング言語をサポートし、スレッディング、同時実行制御、パーティショニング、スケーリングなどの低レベルプリミティブに直面する必要がありません。代わりに、馴染みのあるWebフレームワークを使用してシンプルなWebサーバーを実装するだけで済みます。

Daprは、スレッディングや状態整合性モデルにおいて柔軟性を持ち、必要に応じてマルチスレッドを活用し、複数の整合性モデルから選択できます。この柔軟性により、人工的な制約なしに高度なシナリオを実現できます。Daprは、コードを書き換えることなくプラットフォームや基盤の実装をシームレスに移行できるという点でユニークです。

特徴

  • プラグイン可能なプロバイダーおよび少なくとも一度の配信セマンティクスを持つ、イベント駆動型パブリッシュ/サブスクライブシステム
  • プラグイン可能なプロバイダーによる入力および出力バインディング
  • プラグイン可能なデータストアによる状態管理
  • 一貫したサービス間ディスカバリおよび呼び出し
  • オプトインのステートフルモデル:強い/最終的整合性、先行書き込み/後追い書き込みの勝利
  • クロスプラットフォームの仮想アクター
  • セキュアなキーバルトからシークレットを取得するシークレット管理
  • レート制限
  • 組み込みのObservabilityサポート
  • 専用オペレーターとCRDを使用してKubernetes上でネイティブに動作
  • HTTPおよびgRPCを介してすべてのプログラミング言語をサポート
  • Azure、AWS、GCPなどからのマルチクラウド対応のオープンコンポーネント(バインディング、パブリッシュ/サブスクライブ、状態)
  • プロセスまたはコンテナとしてどこでも動作可能
  • 軽量(58MBバイナリ、4MB物理メモリ)
  • サイドカーとして動作し、特別なSDKやライブラリを不要にする
  • 専用CLIにより、開発者に優しい体験と容易なデバッグを提供
  • Java、.NET Core、Go、Javascript、Python、Rust、C++向けのクライアント

リポジトリ

リポジトリ 説明
Dapr 現在ご覧のメインリポジトリ。Daprランタイムコードと概要ドキュメントを含む。
CLI Dapr CLIは、ローカル開発環境またはKubernetesクラスター上にDaprをセットアップし、デバッグサポート、Daprインスタンスの起動および管理を提供する。
Docs Daprのドキュメント。
Quickstarts Daprの主要機能を強調したシンプルなコードサンプル集。
Samples Daprの様々なユースケースに対応する、コミュニティが保守するサンプル集。
Components-contrib 分散アプリケーション構築のための、オープンでコミュニティ主導の再利用可能なコンポーネントを提供するリポジトリ。
Dashboard Dapr用の汎用ダッシュボード。
Go-sdk Go向けDapr SDK。
Java-sdk Java向けDapr SDK。
JS-sdk JavaScript向けDapr SDK。
Python-sdk Python向けDapr SDK。
Dotnet-sdk .NET向けDapr SDK。
Rust-sdk Rust向けDapr SDK。
Cpp-sdk C++向けDapr SDK。
PHP-sdk PHP向けDapr SDK。
kun432kun432

公式ドキュメント

https://docs.dapr.io/

Overviewをまずざっと

概要

分散アプリケーションランタイムの紹介

Daprは、ポータブルでイベント駆動型のランタイムであり、どの開発者でもクラウドやエッジ上で動作する、レジリエントなステートレスおよびステートフルなアプリケーションを容易に構築できるようにし、さまざまな言語や開発フレームワークの多様性を取り入れています。

https://www.youtube.com/watch?v=9o9iDAgYBA8

任意の言語、任意のフレームワーク、どこでも


referred from https://docs.dapr.io/concepts/overview/

現在のクラウド採用の波により、ウェブ+データベースのアプリケーションアーキテクチャ(例えば、従来の3層設計など)は、根本的に分散型であるマイクロサービスアーキテクチャへと移行しつつあります。マイクロサービスアプリケーションを作成するためだけに分散システムの専門家になる必要はありません。

ここでDaprの出番です。Daprは、マイクロサービスアプリケーション構築のためのベストプラクティスを、ビルディングブロックと呼ばれるオープンで独立したAPIに定式化します。Daprのビルディングブロックは:

  • 好みの言語とフレームワークを用いてポータブルなアプリケーションを構築できるようにする
  • 完全に独立している
  • アプリケーション内で使用する数に制限がない

Daprを使用することで、既存のアプリケーションを段階的にマイクロサービスアーキテクチャへ移行し、スケールアウト/スケールイン、レジリエンシー、独立したデプロイといったクラウドネイティブなパターンを採用することができます。

Daprはプラットフォームに依存しないため、アプリケーションを以下の環境で実行できます:

  • ローカル環境で
  • 任意のKubernetesクラスター上で
  • 仮想マシンまたは物理マシン上で
  • Daprが統合するその他のホスティング環境で

これにより、クラウドやエッジ上で動作するマイクロサービスアプリケーションを構築することが可能になります。

クラウドとエッジ向けのマイクロサービスビルディングブロック


referred from https://docs.dapr.io/concepts/overview/

Daprは、標準的な方法でマイクロサービスアプリケーションを構築し、任意の環境にデプロイできる分散システムのビルディングブロックを提供します。

これらの各ビルディングブロックAPIは独立しているため、アプリケーションで任意の数を使用することができます。

ビルディングブロック 説明
サービス間呼び出し レジリエントなサービス間呼び出しは、リトライを含むメソッド呼び出しを、サポートされるホスティング環境内のどこにあっても実行可能にします。
パブリッシュ&サブスクライブ サービス間でイベントを発行しトピックを購読することで、水平スケーラビリティを簡素化し、障害に強いイベント駆動型アーキテクチャを実現します。Daprは少なくとも一度のメッセージ配信保証、メッセージTTL、コンシューマグループなどの高度な機能を提供します。
ワークフロー ワークフローAPIは、他のDaprビルディングブロックと組み合わせることで、複数のマイクロサービスにまたがる長時間持続する永続的なプロセスまたはデータフローを定義できます。
状態管理 キー/バリューペアの保存およびクエリを通じて、ステートレスなサービスと並んで長期間稼働可能なステートフルサービスを容易に作成できます。状態ストアはプラグイン可能で、例としてAWS DynamoDB、Azure Cosmos DB、Azure SQL Server、GCP Firebase、PostgreSQL、Redisなどがあります。
リソースバインディング トリガーを伴うリソースバインディングは、データベース、キュー、ファイルシステムなどの外部ソースとの間でイベントを受信および送信することで、スケールとレジリエンシーをさらに向上させるイベント駆動型アーキテクチャを構築します。
アクター ステートフルおよびステートレスなオブジェクトのパターンであり、メソッドと状態のカプセル化により同時実行が容易になります。Daprは、アクターの活性化/非活性化、状態管理、ライフサイクル管理、タイマーおよびリマインダー機能など、アクターランタイムにおける多くの機能を提供します。
シークレット シークレット管理APIは、パブリッククラウドおよびローカルシークレットストアと統合し、アプリケーションコードで使用するシークレットを取得します。
設定 設定APIは、設定ストアからアプリケーションの設定項目を取得および購読することを可能にします。
分散ロック 分散ロックAPIは、アプリケーションがリソースに対して独占的なアクセス権を獲得できるようにし、アプリケーションによるロックの解除またはリースタイムアウトが発生するまでその権限を維持します。
暗号化 暗号化APIは、キーボールトなどのセキュリティインフラストラクチャの上に抽象化レイヤーを提供し、鍵を露出することなくメッセージの暗号化や復号などの暗号操作を実行するためのAPIを含んでいます。
ジョブ ジョブAPIは、特定の時刻または間隔でジョブをスケジュールできるようにします。
会話 会話APIは、大規模言語モデル(LLM)との相互作用の複雑さを抽象化し、プロンプトキャッシングや個人識別情報(PII)のマスキングなどの機能を提供します。会話コンポーネントを利用することで、異なるLLMと会話するためのプロンプトを提供できます。

クロスカッティングAPI

Daprは、ビルディングブロックと並んで、使用するすべてのビルディングブロックに適用されるクロスカッティングAPIも提供します。

ビルディングブロック 説明
レジリエンシー Daprは、レジリエンシースペックを介してフォールトトレラントなレジリエンシーポリシーを定義および適用する機能を提供します。サポートされるスペックは、タイムアウト、リトライ/バックオフ、サーキットブレーカーなどのレジリエンシーパターンのポリシーを定義します。
オブザーバビリティ Daprは、Daprおよびユーザーアプリケーションのデバッグと監視のためにメトリクス、ログ、トレースを出力します。Daprは分散トレースをサポートし、W3Cトレースコンテキスト標準およびOpen Telemetryを利用して、さまざまな監視ツールに送信できます。
セキュリティ Daprは、DaprコントロールプレーンであるSentryサービスを用いてDaprインスタンス間の通信を転送中に暗号化することをサポートします。独自の証明書を持ち込むことも、Daprに自己署名のルートおよび発行者証明書を自動的に生成・永続化させることも可能です。

サイドカーアーキテクチャ

Daprは、HTTPおよびgRPC APIをサイドカーアーキテクチャとして公開しており、アプリケーションコードにDaprランタイムコードを含める必要はありません。これにより、他のランタイムからDaprとの統合が容易になるとともに、アプリケーションロジックの分離によってサポート性が向上します。


referred from https://docs.dapr.io/concepts/overview/

ホスティング環境

Daprは、以下を含む複数の環境でホスト可能です:

  • ローカル開発および本番用に、Windows/Linux/macOSマシン上でのセルフホスト
  • 本番環境におけるKubernetesまたは物理/仮想マシンのクラスター

セルフホスト型ローカル開発

セルフホストモードでは、Daprは独立したサイドカープロセスとして動作し、サービスコードはHTTPまたはgRPCを介してこれを呼び出します。各実行中のサービスには、状態ストア、パブ/サブ、バインディングコンポーネント、その他のビルディングブロックを使用するように構成されたDaprランタイムプロセス(またはサイドカー)が存在します。

Dapr CLIを使用して、ローカルマシン上でDapr対応アプリケーションを実行できます。下図は、CLIのinitコマンドによって構成されたDaprのローカル開発環境を示しています。ぜひはじめてのサンプルでお試しください。


referred from https://docs.dapr.io/concepts/overview/

Kubernetes

Kubernetesは、以下のいずれかに使用できます:

Kubernetesなどのコンテナホスティング環境では、Daprはアプリケーションコンテナと同じPod内でサイドカーコンテナとして動作します。

Daprのdapr-sidecar-injectorおよびdapr-operatorコントロールプレーンサービスは、以下の統合を提供します:

  • サービスコンテナと同一Pod内にDaprサイドカーコンテナを起動する
  • クラスター内でプロビジョニングされたDaprコンポーネントの更新通知を提供する

dapr-sentryサービスは、Daprサイドカー間の相互TLSを有効にして安全なデータ暗号化を行い、Spiffeを通じたアイデンティティも提供する認証局です。Sentryサービスの詳細については、セキュリティの概要を参照してください。

KubernetesクラスターにDapr対応アプリケーションをデプロイして実行するのは、デプロイメントにいくつかの注釈を追加するだけで簡単です。詳細はKubernetes上のDaprドキュメントをご覧ください。


referred from https://docs.dapr.io/concepts/overview/

物理または仮想マシンのクラスター

Daprのコントロールプレーンサービスは、本番環境において物理または仮想マシンのクラスターに高可用性 (HA) モードでデプロイ可能です。下図では、アクターのPlacementサービスとセキュリティのSentryサービスが3台の異なるVM上で起動され、HAなコントロールプレーンを提供しています。クラスター内で実行されるアプリケーションのDNSによる名前解決を提供するため、DaprはデフォルトでマルチキャストDNSを使用しますが、オプションでHashicorp Consulサービスもサポート可能です。


referred from https://docs.dapr.io/concepts/overview/

開発者向け言語SDKおよびフレームワーク

Daprは、好みの言語でDaprを使い始めるのを容易にするため、さまざまなSDKおよびフレームワークを提供します。

Dapr SDKs

Daprをより自然に利用できるように、言語別SDKが用意されています:

  • Go
  • Java
  • JavaScript
  • .NET
  • PHP
  • Python

これらのSDKは、HTTP/gRPC APIを直接呼び出すのではなく、型付きの言語APIを通じてDaprのビルディングブロックの機能を提供します。これにより、ステートレスおよびステートフルな関数やアクターを好みの言語で記述することができ、これらのSDKはDaprランタイムを共有するため、言語を越えたアクターや機能のサポートが可能となります。

開発者フレームワーク

Daprは、任意の開発者フレームワークから利用できます。以下はDaprと統合されている一部のフレームワークです:

Web

言語 フレームワーク 説明
.NET ASP.NET Core 他のサービスからのパブ/サブイベントに応答するステートフルなルーティングコントローラーを提供します。ASP.NET Core gRPC Servicesも利用可能です。
Java Spring Boot Dapr APIを用いてSpring Bootアプリケーションを構築します。
Python Flask Dapr APIを用いてFlaskアプリケーションを構築します。
JavaScript Express Dapr APIを用いてExpressアプリケーションを構築します。
PHP Apache、Nginx、またはCaddyserverでサービスを提供できます。

統合および拡張機能

各種フレームワークや外部製品とのファーストクラスの統合サポートについては、統合のページをご覧ください。これには以下が含まれます:

  • AzureやAWSなどのパブリッククラウドサービス
  • Visual Studio Code
  • GitHub

運用向けに設計されている

Daprは、運用およびセキュリティ向けに設計されています。Daprのサイドカー、ランタイム、コンポーネント、および構成は、組織のニーズに合わせて容易かつ安全に管理・デプロイ可能です。

ダッシュボード(Dapr CLI経由でインストール)は、実行中のDaprアプリケーションの情報確認、ログ表示などを行うウェブベースのUIを提供します。

Daprは、システムサービスやサイドカーに対する深い可視化のための監視ツールをサポートし、またDaprのオブザーバビリティ機能は、トレースやメトリクスなどを通じてアプリケーションに関する洞察を提供します。

ログインするとコメントできます