技术速递|.NET Aspire 小贴士 —— 管理容器和数据生命周期

作者:James Montemagno
排版:Alan Wang

.NET Aspire 凭借其强大的应用程序组合编排功能增强了本地开发流程。在 .NET Aspire 应用程序主机中,您可以在一个集中位置指定应用程序所需的所有项目、可执行文件、云资源和容器。当您运行应用程序主机项目时,.NET Aspire 将自动运行您的项目和可执行文件,在必要时配置云资源,并下载和运行应用程序依赖的容器。.NET Aspire 9 添加了新功能,让您可以更好地控制如何在本地计算机上管理容器生命周期,从而在使用容器时加快开发速度。

.NET Aspire 容器

让我们来看一个简单的 .NET Aspire App Host 示例,该示例创建一个本地 Redis 容器资源,等待其可用后,为 Web 项目配置连接字符串:

// Create a distributed application builder given the command line arguments.
var builder = DistributedApplication.CreateBuilder(args);
// Add a Redis server to the application.
var cache = builder.AddRedis("cache");
// Add the frontend project to the application and configure it to use the 
// Redis server, defined as a referenced dependency.
builder.AddProject<Projects.MyFrontend>("frontend")
       .WithReference(cache)
       .WaitFor(cache);

当启动 App Host 时,对 AddRedis 的调用将下载相应的 Redis 镜像。
在这里插入图片描述
它还会创建一个新的 Redis 容器并自动运行。
在这里插入图片描述
当我们停止调试 App Host 时,.NET Aspire 会自动停止所有项目,同时停止 Redis 容器并删除通常用于存储数据的关联卷。

容器生命周期

虽然上述方式适用于许多场景,但如果容器没有任何更改,您可能希望容器始终保持运行状态,而不受 App Host 状态的影响。这就是新的 WithLifetime API 的作用,它允许您自定义容器的生命周期。这意味着您可以配置容器以启动后持续运行,从而加快项目启动速度,因为容器随时可用,并且可以重复使用数据卷。

var builder = DistributedApplication.CreateBuilder(args);// Add a Redis server to the application and set lifetime to persistent
var cache = builder.AddRedis("cache")
                   .WithLifetime(ContainerLifetime.Persistent);
​
builder.AddProject<Projects.MyFrontend>("frontend")
       .WithReference(cache)
       .WaitFor(cache);

现在,当我们运行 App Host 时,如果找不到容器,它仍然会创建一个新的容器资源并启动它;但如果找到指定名称的容器,.NET Aspire 会使用该资源而不是创建新的资源。当 App Host 关闭时,容器资源不会被终止,从而允许您在多次运行中重复使用它!您可以在 .NET Aspire 仪表板上看到一个小图钉图标,表示该容器已设置为持久化状态。
在这里插入图片描述

它是如何工作的?

默认情况下,当设置了 ContainerLifetime.Persistent 时,.NET Aspire 会考虑多种因素以确定是使用现有容器还是创建新容器。.NET Aspire 首先会根据 App Host 项目路径的哈希值为容器生成唯一名称。这意味着容器对于特定的 App Host 项目是持久化的,但如果您有多个 App Host 项目,它不会是全局持久化的。您可以使用 WithContainerName 方法指定容器名称,这样可以创建一个全局唯一的持久化容器。

除了容器名称之外,.NET Aspire 还会考虑以下因素:

  • 容器镜像

  • 启动容器的命令及参数

  • 数据卷挂载

  • 公开的容器端口

  • 环境变量

  • 容器重启策略

.NET Aspire 会获取所有这些信息并从中创建唯一哈希值,以与任何现有容器数据进行比较。如果这些设置中有任何不同,则不会重用现有容器,而是会创建一个新容器。因此,如果您好奇为什么会创建新容器,可能是因为设置发生了一些改变。 .NET Aspire 针对这一新选项制定了非常严格的政策,团队正在寻求对未来迭代的反馈意见。

关于持久化数据

现在,当我们在 App Host 的多次启动之间实现了容器的持久化,这也意味着我们正在重用与容器关联的卷。数据卷是容器生成数据的推荐持久化方式,它们具有以下优点:可以同时存储来自多个容器的数据、提供高性能的数据访问,并且易于备份或迁移。因此,尽管我们确实在重用数据卷,但如果设置发生更改,仍然可能会创建新的容器。

通过对使用和重用的卷进行更精确的控制,我们可以实现以下功能:

  • 在应用程序启动期间维护 Redis 实例中的缓存数据或消息。

  • 在延长的开发会话期间处理数据库中的连续数据集。

  • 在 Azure Blob Storage 模拟器中测试或调试不断变化的文件集。

所以,让我们用 WithDataVolume 方法告诉容器资源要使用哪个数据卷。默认情况下,它将根据我们的项目和资源名称分配一个名称:{appHostProjectName}-{resourceName}-data,但我们也可以定义将创建和重用的名称,如果我们有多个App Host,这将非常有用。

var cache = builder.AddRedis("cache")
        .WithLifetime(ContainerLifetime.Persistent)
        .WithDataVolume("myredisdata");

现在,将为该容器资源创建一个新的数据卷并重新使用它,并且如果由于某种原因创建了一个新容器,它仍将使用 myredisdata 卷。
在这里插入图片描述
使用数据卷非常方便,因为它们提供了理想的性能、可移植性和安全性。然而,有时您可能需要直接访问和修改机器上的文件。可以使用数据绑定装载,以便进行实时更改。

var cache = builder.AddRedis("cache")
        .WithLifetime(ContainerLifetime.Persistent)
        .WithDataBindMount(@"C:\Redis\Data");

数据绑定装载依赖文件系统在容器重启之间持久化 Redis 数据。在这里,数据绑定装载会在 Windows 上装载到 Redis 容器中的 C:\Redis\Data 路径。

对于 Redis,我们还可以控制数据持久化方式,例如在特定时间间隔和阈值时对数据进行快照保存。

var cache = builder.AddRedis("cache")
        .WithLifetime(ContainerLifetime.Persistent)
        .WithDataVolume("myredisdata")
        .WithPersistence(interval: TimeSpan.FromMinutes(5), keysChangedThreshold: 100);

在这里,interval 表示快照导出之间的时间间隔,keysChangedThreshold 表示触发快照所需的键更改操作次数。

不同的集成对 WithDataVolumeWithBindMount 有各自的规范,因此请务必查阅您所使用的集成的文档

更好的控制资源

现在,我们已在 App Host 中完成了所有设置、持久化并准备就绪。额外的好消息是,.NET Aspire 9 中还新增了直接从仪表板启动、停止和重启资源(包括容器)的功能!
在这里插入图片描述
这项功能非常棒,可以让您在不离开仪表板的情况下测试应用程序的弹性。

升级到 .NET Aspire 9

在 .NET Aspire 9 中还有更多功能,因此请务必阅读 .NET Aspire 9.0 中的新增功能文档,并通过完整的升级指南在几分钟内轻松完成升级。

此外,还更新了有关容器资源生命周期使用数据卷持久化数据和新仪表板功能的文档。

欢迎在下方评论中告诉我们您对 .NET Aspire 9 中这项新功能以及其他所有出色功能的看法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值