前言
雲原生應用程序通常需要連接到各種服務,例如數據庫、存儲和緩存解決方案、消息傳遞提供商或其他 Web 服務。.NET Aspire 旨在簡化這些類型服務之間的連接和配置。在本快速入門中,您將瞭解如何創建 .NET Aspire Starter 應用程序模板解決方案。
準備條件
要使用 .NET Aspire,您需要在本地安裝以下軟件:
- .NET 8.0
- .NET Aspire workload:
- Use the Visual Studio installer
- Use the dotnet workload install aspire command
- Docker Desktop
- Integrated Developer Environment (IDE) or code editor, such as:
- Visual Studio 2022 Preview version 17.9 or higher (Optional)
- Visual Studio Code (Optional)
創建模板
要創建新的 .NET Aspire Starter 應用程序模板解決方案,您可以使用 Visual Studio 或 .NET CLI。
Visual Studio 提供了 .NET Aspire 項目模板,可以爲您處理一些初始設置配置。請完成以下步驟爲本快速入門創建項目:
-
在 Visual Studio 頂部,導航到“文件” “新建” “項目”。
-
在對話框窗口中,搜索Aspire並選擇.NET Aspire Starter Application。選擇下一步。
-
在“配置新項目”屏幕上:
- 輸入項目名稱AspireSample。
- 將其餘值保留爲默認值,然後選擇“下一步”。
- 在附加信息屏幕上:
- 確保選擇.NET 8.0(長期支持) 。
- 確保選中“使用 Redis 進行緩存(需要 Docker)”並選擇“創建”。
Visual Studio 創建了一個新的解決方案,該解決方案的結構是使用 .NET Aspire。
AspireSample目錄:
└───📂 AspireSample
├───📂 AspireSample.ApiService
│ ├───📂 Properties
│ │ └─── launchSettings.json
│ ├─── appsettings.Development.json
│ ├─── appsettings.json
│ ├─── AspireSample.ApiService.csproj
│ └─── Program.cs
├───📂 AspireSample.AppHost
│ ├───📂 Properties
│ │ └─── launchSettings.json
│ ├─── appsettings.Development.json
│ ├─── appsettings.json
│ ├─── AspireSample.AppHost.csproj
│ └─── Program.cs
├───📂 AspireSample.ServiceDefaults
│ ├─── AspireSample.ServiceDefaults.csproj
│ └─── Extensions.cs
├───📂 AspireSample.Web
│ ├───📂 Components
│ │ ├───📂 Layout
│ │ │ ├─── MainLayout.razor
│ │ │ ├─── MainLayout.razor.css
│ │ │ ├─── NavMenu.razor
│ │ │ └─── NavMenu.razor.css
│ │ ├───📂 Pages
│ │ │ ├─── Counter.razor
│ │ │ ├─── Error.razor
│ │ │ ├─── Home.razor
│ │ │ └─── Weather.razor
│ │ ├─── _Imports.razor
│ │ ├─── App.razor
│ │ └─── Routes.razor
│ ├───📂 Properties
│ │ └─── launchSettings.json
│ ├───📂 wwwroot
│ │ ├───📂 bootstrap
│ │ │ ├─── bootstrap.min.css
│ │ │ └─── bootstrap.min.css.map
│ │ ├─── app.css
│ │ └─── favicon.png
│ ├─── appsettings.Development.json
│ ├─── appsettings.json
│ ├─── AspireSample.Web.csproj
│ ├─── Program.cs
│ └─── WeatherApiClient.cs
└─── AspireSample.sln
.NET Aspire 應用程序主項目
*.AppHost項目負責充當協調器,並將IsAspireHost項目文件的屬性設置爲true
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsAspireHost>true</IsAspireHost>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\AspireSample.ApiService\AspireSample.ApiService.csproj" />
<ProjectReference Include="..\AspireSample.Web\AspireSample.Web.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Aspire.Hosting" Version="8.0.0-preview.1.23557.2" />
</ItemGroup>
</Project>
AspireSample.AppHost項目的Program.cs文件:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedisContainer("cache");
var apiservice = builder.AddProject<Projects.AspireSample_ApiService>("apiservice");
builder.AddProject<Projects.AspireSample_Web>("webfrontend")
.WithReference(cache)
.WithReference(apiservice);
builder.Build().Run();
- IDistributedApplicationBuilder通過調用創建一個實例。DistributedApplication.CreateBuilder(args)。
- AddRedisContainer使用 name 進行調用"cache"以將 Redis 容器添加到應用程序,並將返回值分配給名爲 的變量cache,該變量的類型爲IResourceBuilder<RedisContainerResource>。
- 調用AddProject給定的泛型類型參數和項目IServiceMetadata詳細信息,將AspireSample.ApiService項目添加到應用程序模型中。這是 .NET Aspire 的基本構建塊之一,它用於配置應用程序中項目之間的服務發現和通信。name 參數"apiservice"用於標識應用程序模型中的項目,稍後由想要與其通信的項目使用。
- 再次調用AddProject,這次將AspireSample.Web項目添加到應用程序模型中。它還鏈接多個調用來WithReference傳遞cache和apiservice變量。該WithReferenceAPI 是 .NET Aspire 的另一個基本 API,它將服務發現信息或連接字符串配置注入到要添加到應用程序模型的項目中。
.NET Aspire 服務默認項目
*.ServiceDefaults項目是一個共享項目,用於管理在解決方案中的項目中重複使用的配置。該項目確保所有依賴服務共享相同的彈性、服務發現和 OpenTelemetry 配置。共享 .NET Aspire 項目文件包含IsAspireSharedProject設置爲的屬性true:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsAspireSharedProject>true</IsAspireSharedProject>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.ServiceDiscovery" Version="8.0.0-preview.1.23557.2" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.7.0-alpha.1" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.7.0-alpha.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.5.1-beta.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.GrpcNetClient" Version="1.5.1-beta.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.5.1-beta.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.5.1" />
</ItemGroup>
</Project>
服務默認項目在IHostApplicationBuilder類型上公開一個名爲 的擴展方法AddServiceDefaults。模板中的服務默認項目是一個起點,您可以對其進行自定義以滿足您的需求。有關詳細信息,請參閱.NET Aspire 服務默認值。
協調服務溝通
.NET Aspire 提供編排功能來協助配置應用程序不同部分之間的連接和通信。AspireSample.AppHost項目將AspireSample.ApiService和AspireSample.Web項目添加到應用程序模型中。它還聲明瞭Blazor 前端的名稱,以供 API 項目參考。此外,還添加了帶有標籤的 Redis 容器資源。這些名稱用於配置應用程序中項目之間的服務發現和通信。"webfrontend""apiservice""redis"
前端應用程序定義了HttpClient用於與 API 項目通信的類型。
namespace AspireSample.Web;
public class WeatherApiClient(HttpClient httpClient)
{
public async Task<WeatherForecast[]> GetWeatherAsync()
{
return await httpClient.GetFromJsonAsync<WeatherForecast[]>("/weatherforecast") ?? [];
}
}
public record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
配置爲使用服務發現,請考慮AspireSample.Web項目的Program.csHttpClient文件中的以下代碼:
using AspireSample.Web;
using AspireSample.Web.Components;
var builder = WebApplication.CreateBuilder(args);
// Add service defaults & Aspire components.
builder.AddServiceDefaults();
builder.AddRedisOutputCache("cache");
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
builder.Services.AddHttpClient<WeatherApiClient>(
static client=> client.BaseAddress = new("http://apiservice"));
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
}
app.UseStaticFiles();
app.UseAntiforgery();
app.UseOutputCache();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
app.MapDefaultEndpoints();
app.Run();
- 調用AddServiceDefaults,配置應用程序的共享默認值。
- 使用與將 Redis 容器添加到應用程序模型時使用的AddRedisOutputCache相同的調用。這將應用程序配置爲使用 Redis 進行輸出緩存。connectionName"cache"
- 調用AddHttpClient並將HttpClient.BaseAddress配置爲"http://apiservice"。這是將 API 項目添加到應用程序模型時使用的名稱,配置了服務發現後,它將自動解析爲 API 項目的正確地址。
在本地測試應用程序
示例應用程序現已準備好進行測試。想要驗證以下內容:
- 使用服務發現從 API 項目檢索天氣數據並將其顯示在天氣頁面上。
- 後續請求通過 .NET Aspire Redis 組件配置的輸出緩存進行處理。
在 Visual Studio 中,通過右鍵單擊“解決方案資源管理器”中的項目並選擇“設置爲啓動項目”,將AspireSample.AppHost項目設置爲啓動項目。然後,按運行該應用程序。F5
- 在瀏覽器中從主頁導航到天氣頁面。該頁面應加載天氣數據,並記下預報表中表示的一些值。
- 繼續偶爾刷新頁面 10 秒鐘。10秒內返回緩存數據。最終,會出現一組不同的天氣數據,因爲數據是隨機生成的並且緩存會更新。
探索 .NET Aspire 儀表板
當您運行 .NET Aspire 應用程序時,還會啓動一個儀表板,您可以使用它來監視應用程序的各個部分。儀表板應類似於以下屏幕截圖:
訪問左側導航中的每個鏈接可查看有關 .NET Aspire 應用程序的不同信息:
-
項目:列出 .NET Aspire 應用程序中所有單個 .NET 項目的基本信息,例如應用程序狀態、端點地址和加載的環境變量。
-
Containers:列出有關應用程序容器的基本信息,例如狀態、圖像標籤和端口號。您應該會看到爲輸出緩存添加的 Redis 容器以及您提供的名稱。
-
可執行文件:列出您的應用程序使用的正在運行的可執行文件。示例應用程序不包含任何可執行文件,因此它應該顯示消息No runningexecutablesfound。
-
日誌:
-
項目:顯示應用程序中項目的輸出日誌。使用頁面頂部的下拉菜單選擇您想要顯示日誌的項目。
-
容器:顯示應用程序中容器的日誌。您應該會看到來自作爲模板一部分配置的容器的 Redis 日誌。如果您有多個容器,您可以使用頁面頂部的下拉列表選擇要顯示日誌的容器。
-
可執行文件:顯示應用程序中可執行文件的日誌。示例應用程序不包含任何可執行文件,因此這裏沒有任何內容可看。
-
結構化:以表格格式顯示結構化日誌。這些日誌還支持基本過濾、自由格式搜索和日誌級別過濾。您應該看到來自apiservice和 的日誌webfrontend。您可以通過選擇行右端的“查看”按鈕來展開每個日誌條目的詳細信息。
-
Traces:顯示應用程序的跟蹤,它可以跟蹤通過您的應用程序的請求路徑。找到/weather的請求,然後選擇頁面右側的“查看” 。當請求穿過應用程序的不同部分時,儀表板應分階段顯示請求。
-
Metrics:顯示您的應用程序公開的各種儀器和儀表及其相應的尺寸。指標根據過濾器的可用維度有條件地公開過濾器。
至此就構建了第一個.NET Aspire應用程序,更多詳細信息請訪問.NET Aspire文檔。
擴展鏈接: