この記事は .NET Aspire に関する一連の記事の一部です。
- .NET Aspire って何? - 概要
- .NET Aspire を使ってみる
- .NET Aspire を デプロイする
- .NET Aspire で Prometheus, Jaeger, Grafana を使う
- Next.js + ASP.NET Core を .NET Aspire で構成する(with YARP)
- .NET Aspire でデータベースを扱う - PostgreSQL編
- .NET Aspire でデータベースを扱う - SQL Server編
- .NET Aspire のダッシュボードを単独で使う
.NET Aspire + Dapr についてはこちらをご覧ください。メインは Dapr についてですが、.NET Aspire を使用する場合についても記載があります。
.NET Aspire とは
.NET Conf 2023で発表された .NET Aspire (https://learn.microsoft.com/en-us/dotnet/aspire/) は、一言で言えば分散アプリケーションの開発を便利にするためのツールとして開発されました。でも、中身を知ると決して分散アプリケーションにしか使用できないものではない、ということがわかってきます。全ての.NET開発者にとって関係があるものと言えるでしょう。
.NET Aspire は 2023/12に Preview 2 がリリース 2024/2に Preview 3 がリリース 2024/3 に Preview 4がリリース 2024/4 に Preview 5がリリースされた現段階で次の3つの機能持っていると考えることができます。
- 分散アプリケーションのローカル開発環境対応
- OpenTelemetryによる監視設定のテンプレートコードとダッシュボードの提供
- 回復力・復元力(Resiliency)設定の実装
まずはそれぞれについてざっと見ていきましょう。
1. 分散アプリケーションのローカル開発環境対応
分散アプリケーションをローカルで開発する環境を整えるのはなかなか大変です。開発時には依存する .NET プロジェクトやコンテナ、時には実行ファイルを先に稼働して、さらにService Discovery可能な状態にする必要があります。
.NET Aspireでは分散アプリケーションの全ての依存関係をコードまたは設定ファイルで実装しすることで、ローカル環境で簡易的な(http/gRPCを使用する場合の) Service Discovery を可能にしています。これによって環境の差異を吸収してくれます。
また .NET Aspire は Dapr (https://dapr.io/) に対応しています。 Dapr はインフラストラクチャを抽象化することでアプリケーションとインフラストラクチャの疎結合を実現します。 Dapr は大変便利で良いものですが、 Dapr を使うアプリケーションを開発するためにはローカル実行時用の Dapr 環境を作り、実行に合わせて稼働させなければならず、使い勝手に課題があります。
Microsoft はこの課題を解決するために Project Tye (https://github.com/dotnet/tye) という実験的なツールをリリースしていました。 しかし、 Project Tye 自身もまたセットアップや使い勝手に問題があるというジレンマがありました。 .NET Aspire は Project Tye で得た知見をベースに新たに開発され、Project Tyeが抱えていた課題を解消しています。そのため今回の .NET Aspire の発表により、 Project Tye は Archive プロジェクトとなり今後更新されることはありません。
2. OpenTelemetryによる監視設定のテンプレートコードとダッシュボードの提供
.NET 8ではアプリケーションの監視に OpenTelemetery (https://opentelemetry.io/)を使用する機能が強化されました。OpenTelemetry ではログ・メトリクス・トレースに3種類にデータを分類しており、それぞれについてセットアップが必要です。当然、全ての分散アプリケーションに対して基本的に同じセットアップを行う必要がありますし、またセットアップ時にはどのメトリクスを取得するのかを決めなければなりません。
.NET Aspire は煩雑な OpenTelemetry のセットアップに必要な Nuget ライブラリを全て読み込み、ログ・メトリクス・トレースをセットアップするコードをテンプレートとして提供します。コードは次のように修正可能な形で提供されますので、プロジェクトの都合に合わせて追加・編集・削除できます。
builder.Logging.AddOpenTelemetry(logging =>
{
logging.IncludeFormattedMessage = true;
logging.IncludeScopes = true;
});
builder.Services.AddOpenTelemetry()
.WithMetrics(metrics =>
{
metrics.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddRuntimeInstrumentation();
})
.WithTracing(tracing =>
{
if (builder.Environment.IsDevelopment())
{
// We want to view all traces in development
tracing.SetSampler(new AlwaysOnSampler());
}
tracing.AddAspNetCoreInstrumentation()
// Uncomment the following line to enable gRPC instrumentation (requires the OpenTelemetry.Instrumentation.GrpcNetClient package)
//.AddGrpcClientInstrumentation()
.AddHttpClientInstrumentation();
});
また、.NET Aspire は個々のアプリケーションが出力したログ・メトリクス・トレースを確認するためのダッシュボードを分散アプリケーションのポータルとして自動的に起動します。
沢山のアプリケーションが稼働する分散アプリケーションではエラーの原因特定が難しいものですが、ダッシュボードを活用することで原因を特定しやすくなります。
ダッシュボードは Preview 2 の時点では独立して使用する方法を公式にサポートしていませんが、それを可能とするべく検討が進められています。(Decouple the dashboard from the Aspire.Hosting during development #1003)
2024/3 リリースの Preview 4 ではダッシュボードを単独で使用するためのイメージが公開されました。
Standalone Aspire dashboard sample app
解説記事を書きましたので、是非ご覧ください。
3. 回復力・復元力(Resiliency)の実装
.NET で Resiliency を実装する場合 Polly (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になっています。もちろん設定値は修正することが可能になっています。
builder.Services.ConfigureHttpClientDefaults(http =>
{
// 既定の設定
http.AddStandardResilienceHandler(configure =>
{
// カスタマイズ
configure.Retry.BackoffType = Polly.DelayBackoffType.Constant;
configure.Retry.Delay = TimeSpan.FromSeconds(3);
});
});
その他の特徴
フレームワークではありません
.NET Aspire は 既存のライブラリをまとめてテンプレートとなるコードを提供しているだけなので ASP.NET Core や Blazor などのようなフレームワークではありません。そのため .NET Aspire を使用しなければ〜〜ができない、ということは基本的にはありません。.NET Aspire 独自の機能として複数のプロジェクト、コンテナ、実行ファイルを同時起動が可能、かつダッシュボードを提供していますが、これらも実装に影響を与えるものではありません。
独自ロジックを提供するライブラリではありません
.NET Aspire のテンプレートコードは既存ライブラリに対する実装、または既存ライブラリをラップしたクラスへの実装となります。.NET Aspire だけが持つ独自のロジックはありません。あくまで既存ライブラリを使いやすくしただけのものです。
いつでも導入可能です
2024/4時点で Visual Studio 2022 Preview を使用すると .NET Aspire に関するプロジェクトテンプレートが4つ表示されます。
しかし、 .NET Aspire を使用するにあたりプロジェクトテンプレートの使用は必須ではありません。新規にシステムを構築する場合だけでなく、既存のシステムにも簡単に導入可能です。
.NET Aspire コンポーネント
.NET Aspire はセットアップを簡易化することで開発者がコードの実装に集中できるようにすることを目指しています。そのため、特定のリソースをセットアップするための仕掛けを用意しています。それを.NET Aspire コンポーネントと呼びます。
例えば Redis を使用した出力キャッシュを導入しよう、というシナリオの場合は .NET Aspire コンポーネントの1つである Aspire.StackExchange.Redis.OutputCaching をプロジェクトに追加するだけで必要なライブラリは全て追加されます。
ここでいう必要なライブラリにはログ・メトリクス・トレースや Resiliency を実現するための Redis 用のライブラリが含まれているため、とても便利です。
また、2024/3 にリリースされた Preview 4 ではそれまでにリリースされた Azure OpenAI Services や CosmosDB、PostgreSQL 用の Aspire コンポーネントに加えて MySQL、MongoDB に対応したリリースされました。
2024/4 にリリースされた Preview 5 ではパフォーマンスとセキュリティの向上、ダッシュボードのローカライズなど、GAに向けてますます便利になってきています。
まとめ
.NET Aspire とは分散アプリケーションの開発を便利にするためのツールです。しかし OpenTelemetry や Resiliency の実装については単一のアプリケーションでも利用したくなるほど便利ですし、実際特定の部分だけを利用することが可能です。.NET Aspire はうまく使いたいツールです。