.NET Aspire って何？ - 概要

この記事は .NET Aspire に関する一連の記事の一部です。

- .NET Aspire って何？ - 概要
- [.NET Aspire を使ってみる](https://qiita.com/takashiuesaka/items/8794f99b0bf3ce3c3106)
- [.NET Aspire を デプロイする](https://qiita.com/takashiuesaka/items/3da744d0511f29270299)
- [.NET Aspire で Prometheus, Jaeger, Grafana を使う](https://qiita.com/takashiuesaka/items/4811e62aa52e39ed834c)
- [Next.js + ASP.NET Core を .NET Aspire で構成する（with YARP）](https://qiita.com/takashiuesaka/items/e167852af299a7b00939)
- [.NET Aspire でデータベースを扱う - PostgreSQL編](https://qiita.com/takashiuesaka/items/137cb1450c3d9fbc8d1e)
- [.NET Aspire でデータベースを扱う - SQL Server編](https://qiita.com/takashiuesaka/items/6d5ec4d4994649c5dca5)
- [.NET Aspire のダッシュボードを単独で使う](https://qiita.com/takashiuesaka/items/338ae64ca2033e078f7f)

.NET Aspire + Dapr についてはこちらをご覧ください。メインは Dapr についてですが、.NET Aspire を使用する場合についても記載があります。

- [Dapr って何？ - 概要編](https://qiita.com/takashiuesaka/items/ecb8d232d00f0a6591a5)
- [Dapr を使ってみる - 入門編](https://qiita.com/takashiuesaka/items/bdae30de41b0daab881f)
- [Dapr を使ってみる - State management 編](https://qiita.com/takashiuesaka/items/713499c531095d5687c2)

# .NET Aspire とは

.NET Conf 2023で発表された .NET Aspire [(https://learn.microsoft.com/en-us/dotnet/aspire/)](https://learn.microsoft.com/en-us/dotnet/aspire/) は、一言で言えば分散アプリケーションの開発を便利にするためのツールとして開発されました。でも、中身を知ると決して分散アプリケーションにしか使用できないものではない、ということがわかってきます。全ての.NET開発者にとって関係があるものと言えるでしょう。

そして .NET Aspire は 2023/11 の .NET Conf 2023 で Preview 版がリリースされてからの半年間の間に Prevew 2から Preview 7まで順次リリースされ、2024/5の Microsoft Build 2024 で正式に GA しました。

https://devblogs.microsoft.com/dotnet/dotnet-aspire-general-availability/

Preview 中に機能拡張が繰り返されましたが、柱となる基本的な機能はそのまま GA しました。
その基本的な機能は大きく3つに考えるとわかりやすいでしょう。

1. 分散アプリケーションのローカル開発環境対応
1. OpenTelemetryによる監視設定のテンプレートコードとダッシュボードの提供
1. 回復力・復元力（Resiliency）設定の実装

まずはそれぞれについてざっと見ていきましょう。

## 1. 分散アプリケーションのローカル開発環境対応

分散アプリケーションをローカルで開発する環境を整えるのはなかなか大変です。開発時には依存する .NET プロジェクトやコンテナ、時には実行ファイルを先に稼働して、さらにService Discovery可能な状態にする必要があります。

.NET Aspireでは分散アプリケーションの全ての依存関係をコードまたは設定ファイルで実装しすることで、ローカル環境で簡易的な（http/gRPCを使用する場合の） Service Discovery を可能にしています。これによって環境の差異を吸収してくれます。

また .NET Aspire は **Dapr** [(https://dapr.io/)](https://dapr.io/) に対応しています。 Dapr はインフラストラクチャを抽象化することでアプリケーションとインフラストラクチャの疎結合を実現します。 .NET Aspire を使うことで Dapr の立ち上げが自動になるため、開発に集中できるようになります。 

[Use Dapr with .NET Aspire](https://learn.microsoft.com/en-us/dotnet/aspire/frameworks/dapr?tabs=dotnet-cli)

:::note info
Dapr を使うアプリケーションを開発するためにはローカル実行時用の Dapr 環境を作り、実行に合わせて稼働させなければならず、使い勝手に課題がありました。
Microsoft はこの課題を解決するために **Project Tye** [(https://github.com/dotnet/tye)](https://github.com/dotnet/tye) という実験的なツールをリリースしていました。 しかし、 Project Tye 自身もまたセットアップや使い勝手に問題があるというジレンマがありました。 .NET Aspire は Project Tye で得た知見をベースに新たに開発され、Project Tyeが抱えていた課題を解消しています。そのため今回の .NET Aspire の発表により、 Project Tye は Archive プロジェクトとなり今後更新されることはありません。
:::

さらに .NET Aspire は **Microsoft Orleans** [(https://learn.microsoft.com/ja-JP/dotnet/orleans/overview)](https://learn.microsoft.com/ja-JP/dotnet/orleans/overview)　にも対応しました。Microsoft Orleans はアクターモデルに基づいた分散アプリケーション作成のためのフレームワークです。.NET Aspire を使用すると Orleans リソースを構成するための便利なメソッドが用意されているため、環境構築がとても楽になります。

[Use Orleans with .NET Aspire](https://learn.microsoft.com/en-us/dotnet/aspire/frameworks/orleans?tabs=dotnet-cli)

## 2. OpenTelemetryによる監視設定のテンプレートコードとダッシュボードの提供

.NET 8ではアプリケーションの監視に OpenTelemetery [(https://opentelemetry.io/)](https://opentelemetry.io/)を使用する機能が強化されました。OpenTelemetry ではログ・メトリクス・トレースに３種類にデータを分類しており、それぞれについてセットアップが必要です。当然、全ての分散アプリケーションに対して基本的に同じセットアップを行う必要がありますし、またセットアップ時にはどのメトリクスを取得するのかを決めなければなりません。

.NET Aspire は煩雑な OpenTelemetry のセットアップに必要な Nuget ライブラリを全て読み込み、ログ・メトリクス・トレースをセットアップするコードをテンプレートとして提供します。コードは次のように修正可能な形で提供されますので、プロジェクトの都合に合わせて追加・編集・削除できます。

```csharp:Extensions.csの該当箇所のみ抜粋
        builder.Logging.AddOpenTelemetry(logging =>
        {
            logging.IncludeFormattedMessage = true;
            logging.IncludeScopes = true;
        });

        builder.Services.AddOpenTelemetry()
            .WithMetrics(metrics =>
            {
                metrics.AddAspNetCoreInstrumentation()
                    .AddHttpClientInstrumentation()
                    .AddRuntimeInstrumentation();
            })
            .WithTracing(tracing =>
            {
                tracing.AddAspNetCoreInstrumentation()
                    // Uncomment the following line to enable gRPC instrumentation (requires the OpenTelemetry.Instrumentation.GrpcNetClient package)
                    //.AddGrpcClientInstrumentation()
                    .AddHttpClientInstrumentation();
            });

        builder.AddOpenTelemetryExporters();
```

また、.NET Aspire は個々のアプリケーションが出力したログ・メトリクス・トレースを確認するためのダッシュボードを分散アプリケーションのポータルとして自動的に起動します。

.NET Aspire Dashboard
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222127/6150c6e7-436b-65de-463d-64878c93f7c0.png)


沢山のアプリケーションが稼働する分散アプリケーションではエラーの原因特定が難しいものですが、ダッシュボードを活用することで原因を特定しやすくなります。

~~ダッシュボードは Preview 2 の時点では独立して使用する方法を公式にサポートしていませんが、それを可能とするべく検討が進められています。[(Decouple the dashboard from the Aspire.Hosting during development #1003)](https://github.com/dotnet/aspire/issues/1003)~~

2024/3 リリースの Preview 4 ではダッシュボードを単独で使用するためのイメージが公開されました。
[Standalone Aspire dashboard sample app](https://learn.microsoft.com/en-us/samples/dotnet/aspire-samples/aspire-standalone-dashboard/)

解説記事を書きましたので、是非ご覧ください。

- [.NET Aspire のダッシュボードを単独で使う](https://qiita.com/takashiuesaka/items/338ae64ca2033e078f7f)

また、GA 時に .NET Aspire ダッシュボードは Azure Container Apps に正式にデプロイできるようになりました。あくまでもリアルタイムに状況を確認するためのものとしての使用であり、フル機能のAPMとしての使用はできませんが、役に立つ場面は多いでしょう。

https://learn.microsoft.com/ja-jp/azure/container-apps/aspire-dashboard?pivots=azd

## 3. 回復力・復元力（Resiliency）の実装

.NET で Resiliency を実装する場合 Polly [(https://www.pollydocs.org/)](https://www.pollydocs.org/) を採用する場合がほとんどでしょう。 Pollyは Microsoft 内部でも積極的に活用されていて、2023/9にリリースされた v8 には Microsoft から多くのコントリビュートがあったことが明かされています。 

ASP.NET Core は Resiliency を素早く実装するための拡張メソッドを用意しており、それは Polly を全面的に採用しています。そしてその拡張メソッド内部では Retry の回数や Timeout の秒数などの設定値として Microsoft が推奨する値を使用するようになっています。

ASP.NET Core の Resiliency の導入は .NET Aspire のテンプレートコードに含まれています。つまり、.NET Aspireを導入した時点で既定で Resiliency がONになっています。もちろん設定値は修正することが可能になっています。

```csharp:Extensions.csの該当箇所のみ抜粋
builder.Services.ConfigureHttpClientDefaults(http =>
{
    // 既定の設定
    http.AddStandardResilienceHandler(configure =>
    {
        // カスタマイズ
        configure.Retry.BackoffType = Polly.DelayBackoffType.Constant;
        configure.Retry.Delay = TimeSpan.FromSeconds(3);
    });

    // Turn on service discovery by default
    http.AddServiceDiscovery();
});
```

## その他の特徴

### フレームワークではありません

.NET Aspire は 開発時に複数のプロジェクト間や他サービスの依存を開発時に解決してくれますが、個々のプロジェクト内部で.NET Aspire を使うための実装をする必要はありません。テレメトリデータの収集や回復力を実現する既存のライブラリをまとめてテンプレートとなるコードを提供しているため、そのコードを呼び出す実装を最低1行だけ既存のプロジェクトに追加する必要がありますが、それも不要なのであれば既存のコードに一切手を入れる必要がありません。なので ASP.NET Core や Blazor などのようなフレームワークとは異なり.NET Aspire を使用しなければ〜〜ができない、ということは基本的にはありません。.NET Aspire 独自の機能として複数のプロジェクト、コンテナ、実行ファイルを同時起動が可能、かつダッシュボードを提供していますが、これらは実装に影響を与えるものではありません。

### 独自ロジックを提供するライブラリではありません

.NET Aspire のテンプレートコードは既存ライブラリに対する実装、または既存ライブラリをラップしたクラスへの実装となります。.NET Aspire だけが持つ独自のロジックはありません。あくまで既存ライブラリを使いやすくしただけのものです。

### いつでも導入可能です

2024/5 の GA 時点(ver8.0.0)では .NET Aspire に関するプロジェクトテンプレートが5つ表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222127/aeb5ffdc-e409-aec0-622e-68aaccb9af8b.png)

しかし、 .NET Aspire を使用するにあたりプロジェクトテンプレートの使用は必須ではありません。新規にシステムを構築する場合だけでなく、既存のシステムにも簡単に導入可能です。

### .NET Aspire コンポーネント

.NET Aspire はセットアップを簡易化することで開発者がコードの実装に集中できるようにすることを目指しています。そのため、特定のリソースをセットアップするための仕掛けを用意しています。それを.NET Aspire コンポーネントと呼びます。

例えば Redis を使用した出力キャッシュを導入しよう、というシナリオの場合は .NET Aspire コンポーネントの1つである Aspire.StackExchange.Redis.OutputCaching をプロジェクトに追加するだけで必要なライブラリは全て追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222127/0ffec780-7cb5-dbf0-0fe7-03bb68eab3b2.png)

ここでいう必要なライブラリにはログ・メトリクス・トレースや Resiliency を実現するための Redis 用のライブラリが含まれているため、とても便利です。

コンポーネントは Preview 開始以降追加され続けています。コンポーネントの対象は Microsoft 製品に限りません。Apache Kafka や Oracle の EFCore、Vectorデータベースの Qdrant 用コンポーネントなどがリリースされています。開発で必要なコンポーネントがリリースされていないかをまずはチェックすると良いでしょう。

### 独自リソースタイプの作成が可能

.NET Aspire はコンテナ、実行可能ファイル、.NETプロジェクトの3つが基本的なリソースタイプとして用意されていますが、これをベースに Node.js アプリケーションや Redis、PostgreSQL、MySQL、SQL Server、Oracle、MongoDB、RabbitMQ、NATS などの多くのサービスとアプリケーションと統合するための拡張機能があります。
さらに.NET Aspire用の独自のリソースを作成し、拡張機能として組み込めるようにすることもできますし、NuGetパッケージでの公開も可能です。独自リソース用のテストプロジェクトも用意されています。
これによって高い独立性を保ちつつ、組織内部でのコードの共有化を .NET Aspire をベースに推し進めることが可能です。

[Create custom resource types for .NET Aspire](https://learn.microsoft.com/ja-jp/dotnet/aspire/extensibility/custom-resources?tabs=windows)

## まとめ

.NET Aspire とは分散アプリケーションの開発を便利にするためのツールです。しかし　OpenTelemetry や Resiliency の実装については単一のアプリケーションでも利用したくなるほど便利ですし、実際特定の部分だけを利用することが可能です。.NET Aspire はうまく使いたいツールです。