教程:使用 .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.NET Aspire 设置和工具,以及 .NET.NET Aspire SDK

创建项目

  1. 在 Visual Studio顶部,导航到 文件>新建>项目...
  2. 在对话框窗口中,在项目模板搜索框中输入 .NET Aspire,然后选择 .NET.NET Aspire 初学者应用程序。 选择 下一
  3. 配置新项目 屏幕上:
    • 输入 项目名称AspireRedis
    • 将值的 rest 保留为默认值,然后选择 “下一步”
  4. 其他信息 屏幕上显示:
    • 确保已选择 .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 共享项目,用于管理解决方案中与 复原能力服务发现以及 遥测相关的配置。

配置应用主机项目

  1. 将 NuGet 包 📦Aspire.Hosting.Redis 添加到 AspireRedis.AppHost 项目中:

    dotnet add package Aspire.Hosting.Redis
    

    有关详细信息,请参阅 dotnet add package在 .NET 应用程序中管理包依赖项

  2. 更新 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

  1. .NET Aspire Stack Exchange Redis 输出缓存 集成包添加到 AspireRedis.Web 应用:

    dotnet add package Aspire.StackExchange.Redis.OutputCaching
    
  2. Program.csAspireRedis.Web 项目的 Blazor 文件中,紧接在行 var builder = WebApplication.CreateBuilder(args);后面,添加对 AddRedisOutputCache 扩展方法的调用:

    builder.AddRedisOutputCache("cache");
    

    此方法完成以下任务:

    • 将 ASP.NET Core 输出缓存配置为使用具有指定连接名称的 Redis 实例。
    • 自动启用对应的运行状况检查、日志记录和遥测。
  3. 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

  1. .NET Aspire Stack Exchange Redis 分布式缓存 集成包添加到 AspireRedis.ApiService 应用:

    dotnet add package Aspire.StackExchange.Redis.DistributedCaching
    
  2. Program.cs 文件的顶部,添加对 AddRedisDistributedCache的调用:

    builder.AddRedisDistributedCache("cache");
    
  3. Program.cs 文件中,添加以下 using 语句:

    using System.Text;
    using System.Text.Json;
    using Microsoft.Extensions.Caching.Distributed;
    
  4. 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");
    

在本地测试应用

使用以下步骤测试应用的缓存行为:

  1. 按 Visual Studio,使用 运行应用。
  2. 如果出现“启动 Docker 桌面”对话框,请选择 “是”,以启动服务。
  3. .NET .NET Aspire 仪表板在浏览器中加载,并列出 UI 和 API 项目。

测试输出缓存:

  1. 在项目页上,在 webfrontend 行中,单击 localhost 列中的 链接以打开应用的 UI。
  2. 应用程序将在主页上显示当前时间。
  3. 每隔几秒钟刷新浏览器,以查看输出缓存返回的同一页。 10秒后,缓存将过期,页面会重新加载,并显示更新后的时间。

测试分布式缓存:

  1. 请转到 UI 上的“Blazor”页面,加载随机天气数据的表格。
  2. 每隔几秒钟刷新浏览器以查看输出缓存返回的相同天气数据。 10 秒后,缓存过期,页面会重新加载更新的天气数据。

祝贺! 已将 ASP.NET Core 应用配置为将输出和分布式缓存与 .NET Aspire配合使用。