وباسمبلی و کانتینرها (WebAssembly and Containers)
نکات کلیدی
- .NET Aspire بهمنظور سادهسازی توسعه برنامههای توزیعشده طراحی شده و به توسعهدهندگان اجازه میدهد معماری برنامه را با استفاده از C# تعریف کنند.
- در حالی که .NET Aspire برای جایگزینی سیستمهای سطح تولید مانند Kubernetes در نظر گرفته نشده است، اما یک مجموعه ابزار قدرتمند برای ارکستراسیون محلی ارائه میدهد که محیط توسعه را بهطور قابلتوجهی بهبود میدهد.
- .NET Aspire از runtimeهای محبوب کانتینر مانند Docker Desktop و Podman پشتیبانی میکند و به توسعهدهندگان امکان میدهد اجزای مختلف برنامه و وابستگیها را مستقیماً روی ماشین محلی خود اجرا کنند.
- اضافهشدن Fermyon.Aspire.Spin به .NET Aspire امکان افزودن برنامههای وباسمبلی بدون سرور (Serverless) را به معماری توزیعشده فراهم میکند. Spin از زبانهای برنامهنویسی متنوعی برای ساخت برنامههای WebAssembly پشتیبانی میکند.
- داشبورد .NET Aspire بینشهای مهمی از رفتار برنامه توزیعشده در زمان اجرا ارائه میدهد و دسترسی به لاگهای ساختیافته، متریکها و متغیرهای محیطی را فراهم میکند.
اجرای، ترکیب و دیباگ کردن برنامههای توزیعشده روی ماشین محلی توسعهدهنده میتواند دشوار، خطاپذیر و زمانبر باشد. این وظایف روزمره با کمک .NET Aspire میتوانند بهطور چشمگیری ساده شوند.
در این مقاله، بهسرعت وارد دنیای .NET Aspire میشویم و نشان میدهیم چگونه میتوانید برنامههای توزیعشده نسل جدید (یا همان cloud-native) را که از کانتینرها، بارهای کاری WebAssembly و وابستگیهای آنها تشکیل شدهاند، ارکستره کنید.
.NET Aspire چیست؟
.NET Aspire یک پشته دارای دیدگاه مشخص (opinionated stack) است که به شما امکان میدهد برنامههای توزیعشده متشکل از اجزای مختلفِ بههمپیوسته و وابستگیهای آنها را ارکستره کنید. در دنیای .NET Aspire، ارکستراسیون به معنای مدیریت، اتصال و پیکربندی تمام اجزای یک برنامه توزیعشده (cloud-native) است؛ با هدف بهبود محیط توسعه محلی و جریانهای کاری آن (inner-loop).
نکته مهم این است که ارکستراسیون در .NET Aspire برای جایگزینی سیستمهای قدرتمند مورد استفاده در محیطهای تولید، مانند Kubernetes، طراحی نشده است.
در اصل، .NET Aspire به شما بهعنوان یک توسعهدهنده اجازه میدهد معماری برنامه توزیعشده خود را با استفاده از کد C# بیان کنید. ارکستراسیون در .NET Aspire به موارد رایج زیر کمک میکند:
ترکیب برنامه (Application composition): امکان مشخصکردن تمام اجزایی که برنامه شما را تشکیل میدهند.
کشف سرویس و مدیریت رشتههای اتصال: تزریق رشتههای اتصال صحیح، پیکربندیهای شبکه و اطلاعات کشف سرویس برای سادهسازی تجربه توسعهدهنده.
برای سادهسازی یکپارچهسازی با سرویسها و پلتفرمهای محبوب مانند PostgreSQL، Redis و سایر موارد، میتوانید از کامپوننتهای .NET Aspire استفاده کنید که بهصورت بستههای NuGet توزیع میشوند. این کامپوننتها بهگونهای طراحی شدهاند که بهصورت یکپارچه با ارکستراسیون .NET Aspire کار کنند و دغدغههای رایج cloud-native مانند افزودن health check و ارسال دادههای تلهمتری را پوشش دهند.
در نهایت، .NET Aspire بهصورت کاملاً یکپارچه با محیطهای توسعه مختلف از Visual Studio کامل گرفته تا Visual Studio Code و dotnet CLI کار میکند.
عرضه عمومی (General Availability) .NET Aspire توسط مایکروسافت در رویداد Microsoft Build 2024 اعلام شد.
شروع کار با .NET Aspire
در این مقاله، .NET Aspire را با استفاده از dotnet CLI بررسی میکنیم. برای شروع، مطمئن شوید آخرین نسخه dotnet CLI (نسخه ۸.۰) روی سیستم شما نصب شده است. میتوانید .NET Aspire را با افزودن workload مربوطه به نصب .NET خود فعال کنید. افزودن workload aspire با دستورات زیر انجام میشود:

یکپارچهسازی با Container Runtime
اجزای مختلف برنامه و یا وابستگیها ممکن است بهصورت کانتینر روی ماشین محلی شما اجرا شوند. در حال حاضر، .NET Aspire از دو runtime کانتینر پشتیبانی میکند: Docker Desktop و Podman. اگرچه .NET Aspire بهصورت پیشفرض از Docker Desktop استفاده میکند، اما میتوانید با تنظیم متغیر محیطی DOTNET_ASPIRE_CONTAINER_RUNTIME به podman، runtime را تغییر دهید:
بررسی AppHost در .NET Aspire
ارکستراسیون در .NET Aspire در قالب نوع خاصی از پروژه به نام AppHost انجام میشود. در این مقاله، مراحل ساخت AppHost را گامبهگام بررسی نمیکنیم، بلکه به برخی ویژگیهای خاص .NET Aspire اشاره میکنیم. اگر تاکنون از .NET Aspire استفاده نکردهاید یا نام آن را نشنیدهاید، پیشنهاد میشود مستندات رسمی .NET Aspire را مطالعه کنید؛ این مستندات مفاهیم اصلی را بهخوبی توضیح میدهند و شما را در مسیر ارکستراسیون، اجرا و دیباگ برنامههای توزیعشده روی ماشین محلی راهنمایی میکنند.
به یک نمونه ساده از ارکستراسیون شامل یک .NET WebAPI و یک Redis cache نگاه میکنیم (قابلیتهای Redis توسط بسته NuGet به نام Aspire.Hosting.Redis فراهم میشود).

با فرض اینکه پروژه WebAPI با OpenTelemetry ابزارگذاری شده باشد (که این کار میتواند از طریق .NET Aspire Service Defaults هم انجام شود)، هنگام اجرای پروژه AppHost بهصورت محلی، میتوانید فراخوانیها را از طریق داشبورد .NET Aspire ردیابی کنید.

معرفی Fermyon.Aspire.Spin
در Fermyon، ما عمیقاً معتقدیم .NET Aspire بهرهوری توسعهدهندگان و سازمانها را افزایش میدهد. به همین دلیل، شروع به ساخت افزونهای برای .NET Aspire کردیم که به شما اجازه میدهد برنامههای WebAssembly بدون سرور (Spin Apps) را به معماریهای توزیعشده خود اضافه کنید. با Fermyon.Aspire.Spin میتوانید Spin Appهایی که با هر زبانی نوشته شدهاند و به WebAssembly (پلتفرم wasm32-wasi) کامپایل میشوند را از طریق رابط IDistributedApplicationBuilder به برنامه خود اضافه کنید.
قابلیتهای ارائهشده توسط Fermyon.Aspire.Spin
برای حفظ انعطافپذیری، Fermyon.Aspire.Spin به شما اجازه میدهد Spin Appها را یا با ارجاع به کد منبع آنها اضافه کنید، یا با اشاره به یک OCI reference موجود که میتواند از هر رجیستری سازگار با OCI (مانند Azure Container Registry) دریافت شود.
علاوه بر این، میتوانید با Fermyon.Aspire.Spin کارهای زیر را انجام دهید:
-
ایجاد پیکربندیهای زمان اجرا (Runtime Configurations) بهصورت پویا با استفاده از:
-
وابستگیهای تعریفشده در .NET Aspire
-
پایگاههای داده SQLite ارائهشده توسط Spin
-
ذخیرهسازهای key-value مبتنی بر SQLite ارائهشده توسط Spin
-
استنتاج ترکیبی LLM با استفاده از Fermyon Cloud
-
-
مشخصکردن متغیرهای محیطی ارسالشده به Spin App با استفاده از provider متغیرهای محیطی (SPIN_VARIABLE_)
هنگام شروع .NET Aspire Host میتوانید:
-
نصب بودن spin CLI را با lifecycle hook به نام CheckForSpin بررسی کنید.
-
احراز هویت در رجیستریهای خصوصی OCI را با SpinRegistryLogin انجام دهید.
-
افزونههای موردنیاز spin CLI را با InstallSpinPlugin نصب کنید.
نصب Fermyon.Aspire.Spin
نصب Fermyon.Aspire.Spin بهسادگی اضافهکردن بسته NuGet مربوطه به پروژه AppHost است:
ارکستراسیون کانتینرها و WebAssembly
پس از نصب Fermyon.Aspire.Spin میتوانید از متدهای extension ارائهشده برای ارکستراسیون برنامه توزیعشده استفاده کنید. تمام این متدها در namespace مربوط به Aspire.Hosting قرار دارند؛ بنابراین نیازی به import کردن namespace اضافی ندارید. متد AddSpinApp مهمترین آنهاست و امکان افزودن Spin App به DistributedApplicationBuilder را فراهم میکند.
نمونه زیر یک برنامه توزیعشده شامل یک Spin App، یک API مبتنی بر .NET و یک Redis cache را میسازد.

تولید پیکربندیهای زمان اجرا با .NET Aspire
میتوانید رفتار قابلیتهای مختلف Spin App را با ارائه یک فایل پیکربندی زمان اجرا کنترل کنید. Fermyon.Aspire.Spin یک SpinRuntimeConfigurationBuilder ارائه میدهد که میتوانید با آن یک فایل پیکربندی سفارشی بسازید:
ممکن است بخواهید فایلهای پیکربندی زمان اجرا را بین چند Spin App به اشتراک بگذارید. این کار در سناریوهای زیادی مفید است؛ برای مثال معماری توزیعشدهای که در آن چند Spin App از یک Redis مشترک بهعنوان key-value store استفاده میکنند. در این حالت میتوانید SpinRuntimeConfigurationBuilder را به چند Spin App پاس دهید.
اجرای Spin Appها با .NET Aspire
Spin Appها هنگام اجرای پروژه .NET Aspire Host با دستور spin up اجرا میشوند. علاوه بر این، فلگ –build بهصورت خودکار توسط Fermyon.Aspire.Spin اضافه میشود تا اطمینان حاصل شود آخرین نسخه کد منبع به WebAssembly کامپایل شده است.
استفاده از Spin Appها از رجیستریهای OCI
علاوه بر ارجاع به مسیر کد منبع Spin App، میتوانید Spin Appهای موجود را با ارائه OCI reference مربوطه نیز اضافه کنید:
در این مثال، یک Spin App بر اساس یک artifact عمومی OCI از Docker Hub ساخته میشود.
استفاده از رجیستریهای خصوصی که نیاز به احراز هویت دارند رایج است. Fermyon.Aspire.Spin با ارائه lifecycle hook به نام SpinRegistryLogin از این رجیستریها پشتیبانی میکند.

بررسی نصب بودن Spin CLI
برای اجرای Spin Appها از طریق .NET Aspire، spin CLI باید روی ماشین توسعهدهندگان و سیستمهای CI نصب باشد. Fermyon.Aspire.Spin یک lifecycle hook ساده اما کاربردی به نام CheckForSpin ارائه میدهد که نصب بودن spin CLI را بررسی میکند.
در صورت عدم شناسایی spin CLI، هنگام راهاندازی برنامه توزیعشده یک exception ایجاد خواهد شد.
نصب افزونههای Spin
spin CLI دارای یک زیرساخت قدرتمند برای افزونههاست که به توسعهدهندگان اجازه میدهد قابلیتهای بیشتری به CLI اضافه کنند. برای اطمینان از عملکرد یکسان Spin Appها روی ماشینهای مختلف، میتوانید از lifecycle hook به نام InstallSpinPlugin استفاده کنید.
افزونه kube نمونه خوبی است که امکان تولید مانیفستهای Kubernetes Deployment را برای Spin Appها فراهم میکند.
مشاهده Spin Appها با .NET Aspire
Spin بهصورت داخلی از تلهمتری پشتیبانی میکند و بهطور یکپارچه با OpenTelemetry ادغام شده است. در .NET Aspire، پیکربندی OpenTelemetry برای Spin Appها تنها با فراخوانی متد WithOtlpExporter انجام میشود.
با اجرای مجدد برنامه توزیعشده و ارسال درخواستهای HTTP به Spin App، traceهای توزیعشده جمعآوری شده و به endpoint مربوط به OpenTelemetry ارسال میشوند.
بررسی Spin Appها در داشبورد .NET Aspire
داشبورد .NET Aspire اطلاعات مهمی از تمام اجزای برنامه توزیعشده ارائه میدهد و Spin Appها نیز از این قاعده مستثنی نیستند. در داشبورد میتوانید موارد زیر را بررسی کنید:
-
لاگهای ساختیافته برنامه
-
لاگهای کنسول (stdout)
-
متریکها
-
متغیرهای محیطی
Spin Appها همچنین متریکهای پایه را از طریق OpenTelemetry ارسال میکنند که بهصورت خودکار توسط .NET Aspire جمعآوری و در بخش Metrics داشبورد نمایش داده میشود.
جمعبندی و بازخورد
ارکستراسیون برنامههای توزیعشده شامل Spin Appها، پروژههای .NET و کانتینرها با استفاده از .NET Aspire اصطکاک توسعه را کاهش داده و تجربه توسعه محلی را بهطور چشمگیری ساده میکند. بهجای نوشتن صدها خط کد declarative، میتوانید بهسادگی با C# اجزای مختلف برنامه توزیعشده را پیکربندی و به یکدیگر متصل کنید.
داشبورد .NET Aspire نقطه مرکزی برای درک رفتار برنامه توزیعشده در زمان اجرا، بررسی دادههای پیکربندی واقعی هر جزء و تحلیل عمیق دادههای تلهمتری تولیدشده توسط برنامه است.
پشتیبانی سطح اول از Spin Appها در .NET Aspire گام دیگری در مسیر ساخت برنامههایی سریع، امن و قابلحمل است؛ برنامههایی که از قابلیتهای Spin و WebAssembly بهصورت کامل بهره میبرند.



