前期准备
开始探索这个令人激动的技术之前,你需要确保本地环境已准备就绪,包括:
-
安装.NET 8.0版本
-
配置.NET Aspire工作负载:
-
可通过Visual Studio安装器进行
-
或使用命令
dotnet workload install aspire
-
-
安装Docker Desktop
-
集成开发环境(IDE)或代码编辑器,例如:
-
Visual Studio 2022预览版17.9或更高版本(可选)
-
Visual Studio Code(可选)
-
了解更多设置信息,请参见.NET Aspire的安装和工具设置指南。
创建模板解决方案
你可以使用Visual Studio或.NET CLI来创建一个新的.NET Aspire启动器应用程序模板解决方案。在Visual Studio中,导航至“文件”>“新建”>“项目”,搜索Aspire并选择“.NET Aspire启动器应用程序”。然后输入项目名称“AspireSample
”,确认.NET 8.0(长期支持)版本被选中,并勾选“使用Redis用于缓存(需要Docker)”选项后创建。
Visual Studio
.NET CLI
dotnet new aspire-starter --use-redis-cache --output AspireSample
探索入门项目
在这个快速入门中,我们将重点关注*.AppHost和*.ServiceDefaults两个项目。
.NET Aspire应用宿主项目 扮演着整个应用的编排者角色,负责连接和配置你的应用中各个项目和服务。例如,你的AspireSample.AppHost项目中,通过代码配置了一个Redis缓存,并建立了服务发现来连接API服务。
.NET Aspire服务默认项目 是用于管理在解决方案中多个项目间共享的配置,例如韧性、服务发现和遥测配置。
└───📂 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
AppHost 项目负责充当业务流程协调程序,并将项目文件的 IsAspireHost
属性设置为 true
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>
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();
服务通信编排
使用.NET Aspire提供的编排功能,可以轻松地在应用程序的各个部分之间配置连接和通信。如我们先前添加的AspireSample.AppHost项目,将AspireSample.ApiService和AspireSample.Web项目添加到了应用模型,并声明了它们的名称,以及添加了标为"cache"的Redis容器资源。这些名称被用来配置应用中项目间的服务发现和通信。
前端应用定义了一个类型化的HttpClient,用于与API项目通信。例如,在AspireSample.Web项目的Program.cs文件中,我们配置HttpClient以使用服务发现和Redis缓存。
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.cs 文件中的以下代码:HttpClient
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();
本地测试应用
现在,示例应用已经准备好进行测试。你将验证以下功能:
-
使用服务发现从API项目检索天气数据,并在天气页面上显示。
-
通过.NET Aspire Redis组件配置的输出缓存处理后续请求。
在Visual Studio中,将AspireSample.AppHost项目设置为启动项目,然后按F5运行应用。在浏览器中从首页导航到天气页面,页面将加载天气数据。
使用.Net CLI:
dotnet run --project AspireSample/AspireSample.AppHost
-
在浏览器中从主页导航到天气页面。该页面应加载天气数据,在脑海中记下预报表中表示的一些值。
-
继续偶尔刷新页面 10 秒钟。在 10 秒内,将返回缓存的数据。最终,会出现一组不同的天气数据,因为数据是随机生成的,缓存是更新的。
探索.NET Aspire仪表板
当你运行.NET Aspire应用时,还会启动一个仪表板,你可以使用它来监控应用的各个部分。仪表板会列出所有项目的基本信息,如应用状态、端点地址和加载的环境变量等。
恭喜你!你已成功创建了第一个.NET Aspire应用程序,并初步了解了如何使用.NET Aspire进行云原生开发。从这里开始,开拓你的.NET Aspire旅程吧!🤓
1. 项目
在“项目”部分,用户能够查看到.NET Aspire应用中所有单个.NET项目的关键信息。这包括每个项目的应用状态、服务的终结点地址、以及该项目加载的环境变量。
2. 容器
“容器”选项允许用户掌握应用程序容器的相关信息,这可能涉及容器的运行状态、使用的映象标签(Image Tag)、以及各个容器所监听的端口号。特别地,对于进行缓存的Redis容器,用户可以根据其命名确认对应的容器实例。
3. 可执行文件
在“可执行文件”区域内,用户可以查询当前正在运行的可执行文件。如果应用不包含任何运行中的可执行文件,该页面将会表示没有找到可运行的执行文件。
4. 日志
此区域分为多个子部分来提供详细的日志信息:
-
项目日志:展示了各个项目的输出日志。用户可以从顶部的下拉菜单中选择一个具体的项目以查看它的日志。
-
容器日志:呈现容器的活动日志。对于部署在应用中的每个容器(如作为模板配置的Redis容器),用户可以通过顶部的下拉菜单筛选日志。
-
可执行文件日志:由于示例应用不包含运行的可执行文件,因此在这一部分不会显示任何日志。
-
结构化日志:用表格格式展示日志信息,并支持基础的筛选、自由格式搜索以及日志级别的筛选。用户可以查看来自
apiservice
和webfrontend
的日志,通过选择日志条目最右侧的“查看”按钮来了解更多细节。
5. 跟踪
跟踪功能使用户能够观察并追踪请求在应用内的传递路径。用户可以针对特定的API请求(如/weather
),使用“查看”按钮来全面分析请求在应用的各个部分的传递阶段。
6.指标
显示公开的各种仪器仪表及其对应的应用维度。指标根据过滤器的可用维度有条件地公开过滤器。