マイクロサービスを簡単に連携するランタイム「Dapr」の概要

# はじめに

マイクロサービスで開発された機能を、どのようにシステムとして連携するか、その連携を容易にする技術について興味を持ち、色々と調べています。そんな中、マイクロサービスを適用したシステムの構築をサポートするオープンソースのランタイムとして、**Dapr**の注目度が上がってきています。**Daprは、複数言語のアプリケーションに対応し、HTTPやgRPCで接続可能なAPIを提供することにより、サービス同士の連携を容易にします。**
Qiitaでも、Daprに関する記事がいくつかありますが、(お題なので)2022年に発展する技術予測として、改めてこの機会に、Daprの概要について整理してみたいと思います。

# Daprとは

**Dapr(Distributed Application Runtime)**は、マイクロサービスの連携を簡単にするAPIを提供するランタイムです。読み方は、「ダッパー」か「ダーパー」でしょうか(紹介動画を見ると両者の中間に聞こえる)。

Daprは、Microsoftが先導する**オープンソース**のプロジェクトであり、2019年10月にv0.1、2021年2月にv1.0がリリースされました。リリース以来注目度が上がってきており、GitHubのStar数の伸びを見ても、後発ながら注目度の高さが伺えます。そして、2021年の12月にはCNCFのIncubating Projectに指定されました。CNCFによると、Incubating Projectはイノベーター理論で言うアーリーアダプターの段階を過ぎ、アーリーマジョリティに進む途上にあるプロジェクトに指定されるとのことで、これから普及期に入ろうかというライブラリに該当します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2243249/1d3ec467-b250-150e-9813-7b3cc0801daa.png)
※star-history.comにて作成(https://star-history.com/#dapr/dapr&istio/istio&envoyproxy/envoy&Date)

Daprの概要を紹介するにあたって、公式ドキュメントの図を示します。下の図は、Daprが提供する機能などの概要が一つの絵としてうまく表現されています。これから、この図を使いながらDaprの概要について順に説明していきたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2243249/585a9d69-de74-2b73-477a-50b876d82214.png)
※Dapr公式ドキュメントから抜粋(https://docs.dapr.io/concepts/overview/)

# Daprの機能

Daprの機能について説明します。図の中央で、Daprの提供する機能が8つ紹介されています。数多くの機能がありますが、まずは機能の要として**Service-to-service Invocation(サービスの呼び出し)**を押さえるのが良いかと思います。**Daprの主要な機能は、APIを提供することによって異なるサービス同士の連携を容易にすること**で、それ以外の機能は、この派生機能として考えると良いでしょう。

これを踏まえたうえで、Daprの8つの機能について説明したいと思います。

## Service-to-service Invocation

**Daprでアプリケーションを立ち上げると、サービスを呼び出す(invoke)ためのエンドポイントが作成され、APIの利用により他のサービスとの連携を容易に実現できるようになります。**サービスの呼び出しは、**HTTP**または**gRPC**で実現されます。例えば、nodeappサービスのneworderメソッドをHTTPで呼び出したい場合、下のようなコマンドを実行するイメージです。

下の図は、HTTPを利用したサービスの呼び出しイメージです。Daprは、nodeappアプリケーションを起動し、neworderメソッドを呼び出すためのエンドポイントを作成します。クライアントは、作成されたエンドポイントに対してPOSTリクエストを発行することで、サービスを呼び出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2243249/371c6c45-78be-2496-ef60-bcbadf8c8de3.png)
なお、サービスの呼び出しはmTLS認証が行われ、エラー発生時のリトライもサポートしています。

## State Management
Daprはステートフルなサービスに対してもサポートしており、APIを通じてKey-Valueデータとして**状態データを保存**することができます。データのアクセスは、自前で実装するとハマりがちな並行性と一貫性をサポートしており、状態データを管理するロジックを開発する手間を減らせます。
サポートするストレージは、下のページにまとめられています。PostgreSQLやRedisのほか、クラウドデータベースのAmazon DynamoDB、Azure CosmosDBなども対応しているようです。
https://docs.dapr.io/reference/components-reference/supported-state-stores/

## Publish and Subscribe

Daprは、Service-to-service Invocationのほかに、サービス同士をPublish-Subscribeメッセージングで連携するAPI/CLIを提供しています。メッセージングは、HTTPリクエストをAPIとして実行できます。
連携可能なブローカーは、下のページにまとめられています。Apache Kafkaのほか、Amazon SQSやAzure Service Busなどのクラウドサービスとも連携できます。
https://docs.dapr.io/reference/components-reference/supported-pubsub/

## Resource bindings and triggers

Daprは、外部のアプリケーションとの連携も可能です。例えば、MySQLなどのデータベースのほか、Azure Storage Queuesといったクラウドサービスともバインドできます。バインドの設定はYAMLで記述します。
連携可能なアプリケーションは、下のページにまとめられています。多くのアプリケーションがサポートされていますが、まだAlpha版も多いため、今後の開発に期待したいところです(MSが先導しているため、Azure連携の開発が進んでいる模様)。
https://docs.dapr.io/reference/components-reference/supported-bindings/

## Actors

Daprは、Actorパターンという方式で、サービス同士を連携することもサポートしています。詳細については、下のドキュメントを参照してください。
https://docs.dapr.io/developing-applications/building-blocks/actors/actors-overview/

## Observability
Daprを使用することで、**分散トレーシング**や**メトリクスの収集**、**ヘルスチェック**ができます。アプリケーションに加えて、サイドカーとして動作しているDaprについても監視することができます。収集できるメトリクスは、下のページを参照してください。
https://github.com/dapr/dapr/blob/master/docs/development/dapr-metrics.md
また、データ収集のオープンソースである**OpenTelemetry**を使用することで、様々なモニタリングツールと連携することができます。

## Secrets
Daprは、APIキーなどの機密データを格納したストレージと接続し、データにアクセス可能とするAPIを提供します。連携できるストレージは、下のページを参照してください。
https://docs.dapr.io/reference/components-reference/supported-secret-stores/

## Configuration
Daprは、個別のアプリケーションに対して、識別子や接続DBの名前といった設定情報を持たせることができます。設定情報はKey-Valueデータで記述し、専用のAPIで設定します。

# Daprの対応言語

連携したいサービスは、異なる言語で実装されることがありえます。Daprでは、連携可能なサービスの幅を広げるため、**複数の言語に対応したSDK**を公開しています。本記事執筆時点(2022年1月)現在の対応言語は、以下のとおりです。

- .NET
- Python
- Java
- Go
- PHP
- Javascript
- C++
- Rust

# Daprを動かしてみる

DaprのGitHubで、いくつかのクイックスタートが用意されており、これらを動かしながらDaprの機能を覚えていくのが効率的かと思います。特に、Daprの入門として役に立つのが**Hello Worldクイックスタート**で、Daprの機能の要であるService-to-service Invocationについて、実際に動かしながら理解をすすめることができます。
https://github.com/dapr/quickstarts/tree/master/hello-world

Hello WorldクイックスタートのREADMEはとても丁寧に書かれていて、読み進めていけば、特に詰まることなくDaprを動かすことができますが、別の記事でHello Worldを題材にDaprのサービス呼出しの機能について説明できたらと考えています。

# おわりに
本記事では、マイクロサービスの連携を容易にするライブラリDaprを紹介しました。今後、クイックスタートを動かしてみて、詳細な使い方を紹介する記事を書いていければと考えています。

# 参考リンク

- Dapr  
https://dapr.io/
- GitHub: Dapr  
https://github.com/dapr/dapr
- CNCF: Graduated and incubating projects  
https://www.cncf.io/projects/