.NET Aspire 小贴士 —— 管理容器和数据生命周期

360影视 2025-01-24 09:52 2

摘要:NET Aspire 凭借其强大的应用程序组合编排功能增强了本地开发流程。在 .NET Aspire 应用程序主机中,您可以在一个集中位置指定应用程序所需的所有项目、可执行文件、云资源和容器。当您运行应用程序主机项目时,.NET Aspire 将自动运行您的项

M

作者:James Montemagno

排版:Alan Wang

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

.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("frontend") .WithReference(cache) .WaitFor(cache);

当启动 App Host 时,对 AddRedis 的调用将下载相应的 Redis 镜像。

它还会创建一个新的 Redis 容器并自动运行。

当我们停止调试 App Host 时,.NET Aspire 会自动停止所有项目,同时停止 Redis 容器并删除通常用于存储数据的关联卷。

容器生命周期

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

var builder = DistributedApplication.CreateBuilder(args);// Add a Redis server to the application and set lifetime to persistentvar cache = builder.AddRedis("cache") .WithLifetime(ContainerLifetime.Persistent);builder.AddProject("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有各自的规范,因此请务必查阅您所使用的集成的文档。

集成的文档

https://learn.microsoft.com/dotnet/aspire/fundamentals/integrations-overview

更好的控制资源

现在,我们已在 App Host 中完成了所有设置、持久化并准备就绪。额外的好消息是,.NET Aspire 9 中还新增了直接从仪表板启动、停止和重启资源(包括容器)的功能!

这项功能非常棒,可以让您在不离开仪表板的情况下测试应用程序的弹性。

升级到 .NET Aspire 9

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

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

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

.NET Aspire 9.0 中的新增功能文档

升级指南

容器资源生命周期

https://learn.microsoft.com/dotnet/aspire/fundamentals/app-host-overview?tabs=docker#container-resource-lifecycle

使用数据卷持久化数据

仪表板功能

https://learn.microsoft.com/dotnet/aspire/fundamentals/dashboard/explore#resource-actions

James Montemagno

Principal Manager, Tech PM

来源:opendotnet

相关推荐