教程:使用 .NET.NET Aspire 集成实现缓存
云原生应用通常需要各种类型的可缩放缓存解决方案来提高性能。 .NET Aspire 集成简化了连接到常用缓存服务(如 Redis)的过程。 您将在本文中学习如何:
- 创建一个基本的 ASP.NET 核心应用,并将其设置为使用 .NET Aspire。
- 添加 .NET Aspire 集成以连接到 Redis 并实现缓存。
- 配置 .NET.NET Aspire 集成以满足特定要求。
本文探讨如何使用 ASP.NET Core 和 .NET Aspire进行两种不同类型的 Redis 缓存:
- 输出缓存:一种可配置的可扩展缓存方法,用于存储将来请求的整个 HTTP 响应。
- 分布式缓存:多个应用服务器共享的缓存,可用于缓存特定数据片段。 分布式缓存通常作为外部服务维护给访问它的应用服务器,并可以提高 ASP.NET Core 应用的性能和可伸缩性。
先决条件
若要使用 .NET.NET Aspire,需要在本地安装以下各项:
- .NET 8.0 或 .NET 9.0
- 符合 OCI 规范的容器运行时,比如:
- 集成开发人员环境(IDE)或代码编辑器,例如:
- Visual Studio 2022 17.9 或更高版本(可选)
-
Visual Studio Code (可选)
- C# Dev Kit:扩展(可选)
- JetBrains Rider 使用 .NET.NET Aspire 插件 (可选)
有关详细信息,请参阅 .NET.NET Aspire 设置和工具,以及 .NET.NET Aspire SDK。
创建项目
- 在 Visual Studio顶部,导航到 文件>新建>项目...。
- 在对话框窗口中,在项目模板搜索框中输入 .NET Aspire,然后选择 .NET.NET Aspire 初学者应用程序。 选择 下一。
- 在 配置新项目 屏幕上:
- 输入 项目名称 的 AspireRedis。
- 将值的 rest 保留为默认值,然后选择 “下一步”。
- 在 其他信息 屏幕上显示:
- 确保已选择 .NET 9.0。
- 取消选中 ,使用 Redis 缓存。 你将实现自己的缓存设置。
- 选择 创建。
Visual Studio 创建一个新的 .NET Aspire 解决方案,其中包含以下项目:
- AspireRedis.Web - 一个带有默认 Blazor 配置的 .NET Aspire UI 项目。
- AspireRedis.ApiService - 具有默认 .NET.NET Aspire 配置的最小 API,用于提供前端数据。
- AspireRedis.AppHost - 一个业务流程协调程序项目,旨在连接和配置应用的不同项目和服务。
- AspireRedis.ServiceDefaults - 一个 .NET.NET Aspire 共享项目,用于管理解决方案中与 复原能力、服务发现以及 遥测相关的配置。
配置应用主机项目
将 NuGet 包 📦Aspire.Hosting.Redis 添加到
AspireRedis.AppHost
项目中:dotnet add package Aspire.Hosting.Redis
有关详细信息,请参阅 dotnet add package 或 在 .NET 应用程序中管理包依赖项。
更新 Program.cs 项目的
AspireRedis.AppHost
文件以匹配以下代码:var builder = DistributedApplication.CreateBuilder(args); var redis = builder.AddRedis("cache"); var apiservice = builder.AddProject<Projects.AspireRedis_ApiService>("apiservice") .WithReference(redis); builder.AddProject<Projects.AspireRedis_Web>("webfrontend") .WithExternalHttpEndpoints() .WithReference(apiservice) .WithReference(redis); builder.Build().Run();
前面的代码创建本地 Redis 容器实例,并将 UI 和 API 配置为自动将实例用于输出缓存和分布式缓存。 该代码还使用服务发现配置前端 UI 与后端 API 之间的通信。 借助 .NET.NET Aspire的隐式服务发现,设置和管理服务连接被简化,以提高开发人员的工作效率。 在本教程的上下文中,此功能简化了连接到 Redis的方式。
传统上,需在每个项目的 Redis 文件中手动指定 appsettings.json 连接字符串:
{
"ConnectionStrings": {
"cache": "localhost:6379"
}
}
使用此方法配置连接字符串,虽然功能正常,但需要跨多个项目复制连接字符串,这很繁琐且容易出错。
使用输出缓存配置 UI
将 .NET Aspire Stack Exchange Redis 输出缓存 集成包添加到
AspireRedis.Web
应用:dotnet add package Aspire.StackExchange.Redis.OutputCaching
在 Program.cs
AspireRedis.Web
项目的 Blazor 文件中,紧接在行var builder = WebApplication.CreateBuilder(args);
后面,添加对 AddRedisOutputCache 扩展方法的调用:builder.AddRedisOutputCache("cache");
此方法完成以下任务:
- 将 ASP.NET Core 输出缓存配置为使用具有指定连接名称的 Redis 实例。
- 自动启用对应的运行状况检查、日志记录和遥测。
将
AspireRedis.Web
项目的 Blazor 文件的内容替换为以下内容:@page "/" @attribute [OutputCache(Duration = 10)] <PageTitle>Home</PageTitle> <h1>Hello, world!</h1> Welcome to your new app on @DateTime.Now
集成包括
[OutputCache]
属性,用于缓存整个呈现的响应。 该页还包括对@DateTime.Now
的调用,以帮助验证响应是否已缓存。
使用分布式缓存配置 API
将 .NET Aspire Stack Exchange Redis 分布式缓存 集成包添加到
AspireRedis.ApiService
应用:dotnet add package Aspire.StackExchange.Redis.DistributedCaching
在 Program.cs 文件的顶部,添加对 AddRedisDistributedCache的调用:
builder.AddRedisDistributedCache("cache");
在 Program.cs 文件中,添加以下
using
语句:using System.Text; using System.Text.Json; using Microsoft.Extensions.Caching.Distributed;
在 Program.cs 文件中,将现有的
/weatherforecast
终结点代码替换为以下内容:app.MapGet("/weatherforecast", async (IDistributedCache cache) => { var cachedForecast = await cache.GetAsync("forecast"); if (cachedForecast is null) { var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; var forecast = Enumerable.Range(1, 5).Select(index => new WeatherForecast ( DateOnly.FromDateTime(DateTime.Now.AddDays(index)), Random.Shared.Next(-20, 55), summaries[Random.Shared.Next(summaries.Length)] )) .ToArray(); await cache.SetAsync("forecast", Encoding.UTF8.GetBytes(JsonSerializer.Serialize(forecast)), new () { AbsoluteExpiration = DateTime.Now.AddSeconds(10) }); ; return forecast; } return JsonSerializer.Deserialize<IEnumerable<WeatherForecast>>(cachedForecast); }) .WithName("GetWeatherForecast");
在本地测试应用
使用以下步骤测试应用的缓存行为:
- 按 Visual Studio,使用 运行应用。
- 如果出现“启动 Docker 桌面”对话框,请选择 “是”,以启动服务。
- .NET .NET Aspire 仪表板在浏览器中加载,并列出 UI 和 API 项目。
测试输出缓存:
- 在项目页上,在 webfrontend 行中,单击
localhost
列中的 链接以打开应用的 UI。 - 应用程序将在主页上显示当前时间。
- 每隔几秒钟刷新浏览器,以查看输出缓存返回的同一页。 10秒后,缓存将过期,页面会重新加载,并显示更新后的时间。
测试分布式缓存:
- 请转到 UI 上的“Blazor”页面,加载随机天气数据的表格。
- 每隔几秒钟刷新浏览器以查看输出缓存返回的相同天气数据。 10 秒后,缓存过期,页面会重新加载更新的天气数据。
祝贺! 已将 ASP.NET Core 应用配置为将输出和分布式缓存与 .NET Aspire配合使用。