5 月份,我们向全世界发布了 .NET Aspire 的第一个正式版本。.NET 社区的热烈响应令我们深受鼓舞,在大家首次试用时,我们一直在积极倾听并与开发人员互动。
今天,我们很高兴地宣布 .NET Aspire 8.1的发布。这个版本包含了几个新功能和基于开发者在生产应用中使用 .NET Aspire 的反馈而进行的生活质量改进。我将在本文中深入介绍两个特定功能,即支持使用 AddDockerfile(...) 构建容器映像和使用 AddPythonProject(...) 编排 Python 代码。
除了这两个重要的新功能外,.NET Aspire 仪表板和遥测功能也有所增强,包括对指标exemplars 、跨度链接和改进的实例 ID 名称的支持。最后,我们发布了新的 .NET Aspire 组件,包括 Keykcloak、Elasticsearch、Valkey、Milvus、Garnet 和 Kafka UI,供您集成到您的应用程序中。让我们深入了解这些关键功能。
.NET Aspire
https://learn.microsoft.com/en-us/dotnet/aspire/get-started/aspire-overview
构建容器映像
https://learn.microsoft.com/en-us/dotnet/aspire/app-host/withdockerfile
编排 Python 代码
https://learn.microsoft.com/en-us/dotnet/aspire/get-started/build-aspire-apps-with-python
获取 .NET Aspire 8.1
若要开始使用 .NET Aspire 8.1,请访问我们的安装和设置文档,获取有关安装 .NET Aspire 工作负载的最新说明。在此 .NET Aspire 版本中,我们不会同时发布包含新工作负载的 Visual Studio 更新版本,因此您应该使用安装说明的 .NET CLI 版本来更新和安装工作负载。
安装和设置文档
https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/setup-tooling?pivots=dotnet-cli&tabs=windows#install-net-aspire
支持使用 Add Dockerfile(...) 构建容器镜像
对于已经使用 Docker Compose 自动构建容器的开发人员的一个常见请求是让 .NET Aspire 在 App Host 运行时自动构建 Dockerfile。我们引入了两种新的扩展方法(AddDockerfile(...) 和 WithDockerfile(...)来帮助实现这种需求。这意味着您可以快速编辑 Dockerfile 并依靠 .NET Aspire 来构建它们,而无需自己手动构建。让我们来看看这些新的扩展方法是如何工作的。
AddDockerfile(...) 方法最适用于创建一个不基于 .NET Aspire 内置的预设容器资源的容器资源。
var builder = DistributedApplication.CreateBuilder(args);
builder.AddDockerfile("mycontainer", contextPath);
如果您希望修改用于现有资源(例如 SQL Server)的容器映像,则可以使用 WithDockerfile(...) 扩展方法。
var builder = DistributedApplication.CreateBuilder(args);
builder.AddSqlServer("sql")
.WithDockerfile(contextPath); // 使用Dockerfile自定义镜像
在类型化资源构建器上使用 WithDockerfile(...) 的好处在于,该特定资源构建器的任何扩展都仍然可用。这对于注入启动脚本或将文件放置在已知目录中非常有用,而无需构建全新的资源类型。
默认情况下,这两种方法的上下文路径参数都是相对于 AppHost 目录的,除非它是绝对路径。可以使用可选参数来指定 Dockerfile 上下文,这在 Dockerfile 没有典型名称 (Dockerfile) 时很有用。
除了基本的 Dockerfile 构建支持之外,我们还添加了提供构建参数和构建密钥的功能。可以使用 WithBuildArg(...) 方法添加构建参数,并接受字符串、布尔值、整数和 .NET Aspire 参数。以下是使用参数控制容器基础映像版本的示例。
var builder = DistributedApplication.CreateBuilder(...);
var goVersion = builder.AddParameter("goversion");
builder.AddDockerfile("mycontainer", contextPath)
.WithBuildArg("GO_VERSION", goVersion);
若要使用构建参数,Dockerfile 需要像往常一样在 Dockerfile 中声明 ARG。在下面的示例中,您可以看到我们在分布式应用程序中使用的 Go 程序的多阶段构建。以下示例显示了在 Dockerfile 中使用上述示例中使用的 GO_VERSION 构建参数来控制用于构建 Go 程序的映像。
ARG GO_VERSION=1.22.5
FROM golang:${GO_VERSION} AS builder
WORKDIR /app
COPY . .
RUN go build qots.go
FROM mcr.microsoft.com/cbl-mariner/base/core:2.0
WORKDIR /app
COPY --from=builder /app/qots .
CMD ["./qots"]
使用构建密钥的方法类似,只是根据设计,我们不允许将明文值用于密钥。这是为了避免在发布时,意外泄露 .NET Aspire 应用程序清单中的密钥。以下是传递基于参数的构建密钥的示例。
var builder = DistributedApplication.CreateBuilder(...);
var token = builder.AddParameter("token", secret: true);
builder.AddDockerfile("mycontainer", contextPath)
.WithBuildSecret("TOKEN", token);
在 Dockerfile 中,可以修改 RUN 命令以将密钥信息公开给在 Docker 映像构建阶段运行的进程。在下面的示例中,我们正在运行一个 helloworld 程序,该程序采用在容器期间使用的令牌。请注意,在命令上使用 --mounttype=type=secret,id=ARG 前缀会导致将特定密钥信息公开给命令。
RUN --mount=type=secret,id=TOKEN helloworld
注意
您应该小心,不要无意中将密钥值和文件复制到最终容器映像中,因为这可能会导致这些密钥被泄露。如果您需要在容器内构建源代码,并且需要访问集中式软件包源,则构建密钥会特别有用。
Dockerfile
https://learn.microsoft.com/en-us/dotnet/aspire/app-host/withdockerfile
使用 AddPythonProject(...) 编排 Python 代码
我们将继续增加对多语言微服务架构的支持,并增加了对启动基于 Python 的服务的支持。我们已经支持 Node.js 应用程序,在 .NET Aspire 8.1 中,我们添加了由 Willem Meints 贡献的 AddPythonProject(...) 扩展方法。若要开始从 .NET Aspire 启动 Python 项目,您需要确保已安装 Python 托管包:
dotnet add package Aspire.Hosting.Python
然后使用以下 API 将 Python 资源添加到应用程序模型:
var builder = DistributedApplication.CreateBuilder(args);
builder.AddPythonProject("flaskapp", pathToPythonCode, "main.py")
.NET Aspire 中的 Python 支持基于虚拟环境 (venv) 工具。.NET Asire 将(默认)在上述 pathToPythonCode 变量指定的文件夹下查找 .venv 文件夹。main.py 脚本名称将附加到路径中,并定义将使用的特定入口点脚本。
开发人员应首先在激活的虚拟环境中使用 pip install -r requirements.txt 来恢复 requirements.txt 文件中指定的包,因为 .NET Aspire 此时不会为您触发这些依赖项的安装。
如果 requirements.txt 文件指定了 opentelemetry-distro[otlp] 依赖项,它将尝试启动启用了检测的 Python,这将导致遥测数据显示在 .NET Aspire 仪表板中。
局限性
OpenTelemetry 库无法验证用于 .NET Aspire 仪表板 OTLP 端点的证书。因此,当将 Python 应用程序与 .NET Aspire一起使用时,应用程序必须在
ASPIRE_ALLOW_UNSECURED_TRANSPORT 环境变量设置为 true 的情况下运行。
启动基于 Python 的服务
https://learn.microsoft.com/en-us/dotnet/aspire/get-started/build-aspire-apps-with-python?tabs=bash
Willem Meints
https://github.com/wmeints
新的资源类型和组件
我们已添加或改进了对 .NET Aspire 的许多容器化扩展的支持。我们对 .NET Aspire 8.1 中的社区贡献数量感到非常兴奋,我们感谢大家的贡献!
Keycloak;社区成员@julioct 为 Keycloak 贡献了一个托管包(8.1 预览版)。
https://learn.microsoft.com/en-us/dotnet/aspire/authentication/keycloak-component
Elasticsearch;社区成员@Alirexaa 为 Elasticsearch 贡献了一个托管包和组件(8.1 预览版)
https://learn.microsoft.com/en-us/dotnet/aspire/search/elasticsearch-component?tabs=dotnet-cli
Garnet;社区成员@Zombach 为 Garnet 添加了一个托管包,Garnet 是 Microsoft Research 开发的远程缓存存储,与 RESP 协议兼容。
https://learn.microsoft.com/en-us/dotnet/aspire/caching/stackexchange-redis-component?pivots=garnet&tabs=dotnet-cli
Valkey;社区成员@Zombach 为 Valkey(Redis 项目的一个分支)添加了一个托管包。
https://learn.microsoft.com/en-us/dotnet/aspire/caching/stackexchange-redis-component?pivots=valkey&tabs=dotnet-cli
Kafka UI;社区成员@g7ed6e 扩展了 Kafka 托管包以支持配置 Kafka UI。
https://learn.microsoft.com/en-us/dotnet/aspire/messaging/kafka-component?tabs=dotnet-cli
Milvus 支持;我们为流行的矢量数据库 Milvus 添加了托管包和组件。
https://learn.microsoft.com/en-us/dotnet/aspire/database/milvus-component?tabs=dotnet-cli
Azure Web PubSub;我们添加了对 Azure Web PubSub 的支持。
https://learn.microsoft.com/en-us/dotnet/aspire/messaging/azure-web-pubsub-component
EventHubs 模拟器;我们添加了对最近发布的 EventHubs 模拟器的支持,以改善 EventHubs 的本地开发体验。
https://learn.microsoft.com/en-us/dotnet/aspire/messaging/azure-event-hubs-component
@julioct
https://github.com/julioct
@Alirexaa
https://github.com/Alirexaa
@Zombach
https://github.com/Zombach
@g7ed6e
https://github.com/g7ed6e
测试改进
在测试使用 .NET Aspire 的应用程序时,您可以利用几个新功能。首先是新的 WaitForResourceAsync(...) API,它使编写需要等待资源初始化的测试用例变得更加容易。此外,社区成员 @Evangelink 在我们的测试项目模板中添加了对 MSTest 和 NUnit(除了 xUnit)的支持!
团队还在遥测方面进行了全面改进,以提升其在 .NET Aspire 仪表板中的显示效果。
@Evangelink
https://github.com/Evangelink
指标 exemplars
Exemplars 是聚合数据的示例数据点。它们是 OpenTelemetry 的一项功能,将指标遥测与分布式追踪关联起来。
HTTP 请求是 exemplars 的一个示例。ASP.NET Core 记录请求持续时间为一个指标,示例数据点是记录该值的请求。
Exemplars 以点的形式显示在 .NET Aspire 的度量图上,单击某个点即可转到记录该值的跨度。目前,它们仅在直方图上受支持。
一项功能
https://github.com/open-telemetry/opentelemetry-dotnet/blob/main/docs/metrics/customizing-the-sdk/README.md#exemplars
跨度链接
跨度链接在跨度之间创建关系。例如,异步系统可以将使用数据的操作与创建数据的操作进行链接。
.NET Aspire 现在允许您查看跨度如何链接在一起。跨度详细信息 UI 包括链接和反向链接列表(反向链接是链接到当前跨度的跨度),可用于在操作之间导航。
改进的实例 ID 名称
以前,如果某个应用有多个实例,Aspire 会显示实例 ID。但是,实例 ID 通常是 GUID,没有人愿意在 UI 中读取 GUID。这个问题影响了使用 .NET Aspire 仪表板独立查看遥测数据的开发人员。
使用 .NET Aspire 仪表板独立查看遥测数据
https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/dashboard/standalone?tabs=bash
Microsoft Learn 上的 .NET Aspire 培训
https://learn.microsoft.com/en-us/training/paths/dotnet-aspire/
.NET Aspire 视频系列
https://www.youtube.com/playlist?list=PLdo4fOcmZ0oUfIayQMrRqaSL55Rkck-GD
.NET Aspire 文档
https://learn.microsoft.com/en-us/dotnet/aspire/
.NET Aspire 示例
https://github.com/dotnet/aspire-samples
我们希望您能尝试并继续向我们提供反馈。