news 2026/9/18 1:26:15

Aspire 集成 Azure Cosmos DB 实战指南:深入解析 Aspire.Microsoft.Azure.Cosmos 组件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Aspire 集成 Azure Cosmos DB 实战指南:深入解析 Aspire.Microsoft.Azure.Cosmos 组件

Aspire 集成 Azure Cosmos DB 实战指南:深入解析 Aspire.Microsoft.Azure.Cosmos 组件

【免费下载链接】aspireAspire is the tool for code-first, extensible, observable dev and deploy.项目地址: https://gitcode.com/GitHub_Trending/as/aspire

本文以 .NET Aspire 仓库中的Aspire.Microsoft.Azure.Cosmos组件为核心,系统讲解如何通过依赖注入(DI)注册CosmosClient、以多种方式配置连接(连接字符串 / AccountEndpoint / 配置提供程序 / 内联委托)、启用健康检查与 OpenTelemetry 可观测性,以及在 AppHost 中使用Aspire.Hosting.Azure.CosmosDB编排 Azure Cosmos DB 资源(含本地模拟器)。读完本文,你将掌握在 Aspire 应用中开箱即用地连接 Azure Cosmos DB 的完整方案,并理解其底层实现原理。

组件定位与设计目标

Aspire.Microsoft.Azure.Cosmos是 Aspire 官方组件库(位于 src/Components)中面向 Azure Cosmos DB 的集成组件。它解决了手工实例化CosmosClient时的三类常见痛点:

  1. 注册与生命周期管理:将 CosmosClient 注册为 DI 容器中的单例(Singleton),并保证其在整个应用生命周期内只创建一次;
  2. 配置约定化:统一从ConnectionStrings配置节或Aspire:Microsoft:Azure:Cosmos配置节读取连接信息,遵循 Aspire 的命名约定;
  3. 可观测性开箱即用:自动关联健康检查、日志(Logging)与分布式追踪(Telemetry/Tracing),无需额外接线。

组件的核心入口是AspireMicrosoftAzureCosmosExtensions静态类(AspireMicrosoftAzureCosmosExtensions.cs),它向开发者暴露了一系列Add*扩展方法,全部作用于IHostApplicationBuilder。从方法签名可以看到,整个组件只依赖标准接口:

public static void AddAzureCosmosClient( this IHostApplicationBuilder builder, string connectionName, Action<MicrosoftAzureCosmosSettings>? configureSettings = null, Action<CosmosClientOptions>? configureClientOptions = null)

内部流程非常清晰:先GetSettings读取并合并配置,再GetClientOptions构建CosmosClientOptions,然后注册单例并追加健康检查。下文将逐一展开。

快速开始:前置条件与安装

前置条件

  • 一个Azure 订阅(可免费创建);
  • 一个Azure Cosmos DB 账户(NoSQL API);
  • 使用 .NET 8+ 与 Aspire 工作负载的宿主项目。

安装 NuGet 包

在需要使用 Cosmos DB 的服务项目(即调用AddAzureCosmosClient的项目)中执行:

dotnet add package Aspire.Microsoft.Azure.Cosmos

注意:该包属于 Aspire 组件(Components),与用于编排资源的 Hosting 包(Aspire.Hosting.Azure.CosmosDB)职责不同,后者在“AppHost 扩展”一节单独讲解。两者的分工是:Hosting 包在 AppHost 中定义资源与连接关系,组件包在具体服务中消费连接

注册与使用:把 CosmosClient 交给 DI

在承载服务的应用项目中(Aspire 当前模板为Program.cs,早期文档习惯称之为AppHost.cs),调用AddAzureCosmosClient即可注册CosmosClient

builder.AddAzureCosmosClient("cosmosConnectionName");

connectionName是连接名称,它同时用于在ConnectionStrings配置节中查找连接字符串。注册完成后,CosmosClient会以单例形式存在于 DI 容器中,任何构造函数注入即可获取,例如在一个 Web API 控制器中:

private readonly CosmosClient _client; public ProductsController(CosmosClient client) { _client = client; }

更细粒度的注册:Container 与 Database

CosmosClient外,组件还提供了直接注册ContainerDatabase的方法(同样在 AspireMicrosoftAzureCosmosExtensions.cs 中定义):

  • AddAzureCosmosContainer(connectionName):注册Container单例,底层调用client.GetContainer(settings.DatabaseName, settings.ContainerName)。要求连接字符串中必须包含DatabaseContainer名称,否则抛出InvalidOperationException(见源码中AddAzureCosmosContainer的校验逻辑);
  • AddAzureCosmosDatabase(connectionName):注册Database单例,返回CosmosDatabaseBuilder以支持链式注册同一个数据库下的多个容器。数据库名称缺失时同样会抛异常(CosmosDatabaseBuilder.cs 中AddDatabase的校验逻辑)。

CosmosDatabaseBuilder支持对同一数据库注册多个键控(keyed)容器:

builder.AddAzureCosmosDatabase("cosmos") .AddKeyedContainer("orders") .AddKeyedContainer("products");

AddKeyedContainer优先使用连接字符串中的Container名称,若未提供则回退到name参数(见 CosmosDatabaseBuilder.cs 中AddKeyedContainer的实现)。

键控注册(多个实例共存)

当应用中需要连接多个Cosmos DB 账户或数据库时,可以使用键控注册:

builder.AddKeyedAzureCosmosClient("inventory"); builder.AddKeyedAzureCosmosClient("analytics");

它们分别以"inventory""analytics"ServiceDescriptor.ServiceKey注册,消费时通过[FromKeyedServices("inventory")]GetRequiredKeyedService<CosmosClient>("inventory")获取。同理也有AddKeyedAzureCosmosContainerAddKeyedAzureCosmosDatabase

连接配置详解:四种配置方式的完整继承

组件的配置目标是"要么提供AccountEndpoint,要么提供ConnectionString",二者必居其一;否则在解析客户端时会抛出InvalidOperationException(异常信息在 AspireMicrosoftAzureCosmosExtensions.cs 的GetCosmosClient方法末尾)。以下四种配置方式可以组合使用,优先级从低到高依次为:配置提供程序 → 连接字符串 → 内联委托。

方式一:使用连接字符串(ConnectionStrings 节)

appsettings.jsonConnectionStrings节中按连接名称提供连接信息,代码中只需builder.AddAzureCosmosClient("cosmosConnectionName")即可自动拾取。支持两种格式。

(1)Account Endpoint(推荐)

仅提供账户端点 URI,配合MicrosoftAzureCosmosSettings.Credential属性完成认证。若未显式配置Credential,组件会依据当前环境自动创建默认的TokenCredential(即 DefaultAzureCredential 语义,兼容本地开发、Azure CLI、托管标识等场景):

{ "ConnectionStrings": { "cosmosConnectionName": "https://{account_name}.documents.azure.com:443/" } }

(2)完整连接字符串

使用包含账户密钥的完整 Azure Cosmos DB 连接字符串:

{ "ConnectionStrings": { "cosmosConnectionName": "AccountEndpoint=https://{account_name}.documents.azure.com:443/;AccountKey={account_key};" } }

测试代码(AspireMicrosoftAzureCosmosExtensionsTests.cs)证实连接字符串还支持附加Database=db;Container=mycontainer之类的子段,例如:

AccountEndpoint=https://localhost:8081;AccountKey=fake;Database=testdb;Container=mycontainers;

解析逻辑(GetSettings中)会把这些子段提取并写入settings.DatabaseNamesettings.ContainerName,供AddAzureCosmosContainer/AddAzureCosmosDatabase使用;DisableServerCertificateValidation=True等开关也可内联在连接字符串中。

方式二:使用配置提供程序(Aspire:Microsoft:Azure:Cosmos 节)

组件支持Microsoft.Extensions.Configuration的任意配置源(JSON、环境变量、用户机密等),统一从Aspire:Microsoft:Azure:Cosmos键加载MicrosoftAzureCosmosSettings。以下appsettings.json示例关闭了追踪:

{ "Aspire": { "Microsoft": { "Azure": { "Cosmos": { "DisableTracing": false } } } } }

所有可配置项在 ConfigurationSchema.json 中有完整定义,与 MicrosoftAzureCosmosSettings.cs 的属性一一对应:

配置属性类型默认值说明
ConnectionStringstringnull要连接的 Cosmos DB 连接字符串(含密钥)
AccountEndpointstring (uri)null账户端点 URI,如https://{account_name}.documents.azure.com不得包含共享访问签名(SAS),需配合Credential使用
CredentialTokenCredentialnull用于认证端点的凭据,缺省时自动创建默认凭据
DatabaseNamestringnull要连接的数据库名称
ContainerNamestringnull要连接的容器名称
DisableHealthChecksbooleanfalse是否禁用健康检查
DisableTracingbooleanfalse是否禁用 OpenTelemetry 追踪

此外,源码中的GetSettings还会尝试绑定Aspire:Microsoft:Azure:Cosmos:{connectionName}这一命名子节,因此不同连接可拥有各自独立的设置覆盖,这是容易被忽略但非常实用的特性。

方式三:使用内联委托(configureSettings)

AddAzureCosmosClient的可选参数Action<MicrosoftAzureCosmosSettings> configureSettings允许在代码中设置部分或全部设置项,它在配置绑定之后执行,因此优先级最高。例如在代码中禁用追踪:

builder.AddAzureCosmosClient("cosmosConnectionName", settings => settings.DisableTracing = true);

方式四:配置 CosmosClientOptions(configureClientOptions)

第二个可选参数Action<CosmosClientOptions> configureClientOptions用于定制底层 SDK 的CosmosClientOptions。例如为所有请求的User-Agent附加ApplicationName后缀:

builder.AddAzureCosmosClient("cosmosConnectionName", configureClientOptions: clientOptions => clientOptions.ApplicationName = "myapp");

从 AspireMicrosoftAzureCosmosExtensions.cs 的GetClientOptions可以看到几处关键的框架级强制设置

  • 分布式追踪默认开启clientOptions.CosmosClientTelemetryOptions.DisableDistributedTracing = false,这是日志与追踪生效的前提;
  • ApplicationName 拼接:组件会把内置的CosmosApplicationName与你传入的ApplicationName拼接成"{CosmosApplicationName}/{ApplicationName}"格式,保证请求可归因;
  • 模拟器自动适配:检测到模拟器连接字符串时,自动设置ConnectionMode.GatewayLimitToEndpoint = true(详见下文模拟器一节)。

健康检查:让下游依赖感知 Cosmos 状态

默认情况下,组件会注册一个健康检查,其名称为Microsoft.Azure.Cosmos(源码中的HealthCheckName常量)。该检查通过调用CosmosClient.ReadAccountAsync()读取账户属性来验证账户可达性——实现见 AzureCosmosDbHealthCheck.cs,其注释说明该实现参照了 AspNetCore.Diagnostics.HealthChecks 的账户级探测模式,并对不支持CancellationTokenReadAccountAsync通过WaitAsync做了取消支持。

健康检查会自动挂载到应用的/health端点。这意味着依赖方通过WaitFor等待服务 HTTP 健康(或 Kubernetes 就绪探针)时,在 Cosmos DB 不可达期间不会误报健康。键控注册时健康检查名称会带上服务键后缀(Microsoft.Azure.Cosmos_{serviceKey}),避免多个实例相互覆盖。

关闭健康检查

通过配置:

{ "Aspire": { "Microsoft": { "Azure": { "Cosmos": { "DisableHealthChecks": true } } } } }

或通过内联委托:

builder.AddAzureCosmosClient("cosmosConnectionName", settings => settings.DisableHealthChecks = true);

可观测性:日志与遥测

日志(Logging)

组件启用了 Cosmos DB 请求诊断日志。根据 ConfigurationSchema.json 中logLevel定义,可通过标准Logging:LogLevel配置控制名为Azure-Cosmos-Operation-Request-Diagnostics的日志类别:

{ "Logging": { "LogLevel": { "Azure-Cosmos-Operation-Request-Diagnostics": "Information" } } }

遥测(Tracing)

DisableTracingfalse(默认)时,GetClientOptions会执行:

builder.Services.AddOpenTelemetry().WithTracing(tracerProviderBuilder => { tracerProviderBuilder.AddSource("Azure.Cosmos.Operation"); });

即向 OpenTelemetry 的 TracerProvider 注册Azure.Cosmos.Operation这个 ActivitySource,将每个 Cosmos DB 操作的分布式追踪数据(延迟、状态、请求诊断等)接入 Aspire Dashboard 或其他 OpenTelemetry Collector。这使你在 Aspire 的仪表盘中可以直接按资源、按操作追踪到具体的 Cosmos 请求链路。

AppHost 扩展:用 Aspire.Hosting.Azure.CosmosDB 编排资源

前面所有内容都是"消费端"的工作;资源侧的编排由 Hosting 包完成。在AppHost 项目中安装:

dotnet add package Aspire.Hosting.Azure.CosmosDB

然后在 AppHost 的Program.cs中定义 Cosmos DB 资源,并通过WithReference将连接信息注入服务项目:

var cosmosdb = builder.ExecutionContext.IsPublishMode ? builder.AddAzureCosmosDB("cdb").AddCosmosDatabase("cosmosdb") : builder.AddConnectionString("cosmosdb"); var myService = builder.AddProject<Projects.MyService>() .WithReference(cosmosdb);

这里需要理解三个方法的分工:

  • AddAzureCosmosDB("cdb"):向应用模型添加一个 Azure Cosmos DB 资源(发布模式下会联动 Azure 预配逻辑,源码中AddAzureCosmosDB首先调用AddAzureProvisioning(),见 AzureCosmosDBExtensions.cs);AddCosmosDatabase("cosmosdb")进一步声明其中的数据库;
  • AddConnectionString("cosmosdb"):从 AppHost 配置(例如用户机密)的ConnectionStrings:cosmosdb键读取现成的连接信息,适合本地开发不触发 Azure 预配的场景;
  • WithReference(cosmosdb):把连接信息传递到MyService项目,在该项目中表现为名为cosmosdb的连接字符串。

MyService项目的Program.cs中消费:

builder.AddAzureCosmosClient("cosmosdb");

如此便完成了"AppHost 定义资源 → 注入连接 → 服务端注册客户端"的完整闭环。ExecutionContext.IsPublishMode分支保证了同一套代码在dotnet run(本地)与dotnet publish/azd deploy(发布)时分别走连接字符串与 Azure 资源两条路径。

使用本地模拟器(Emulator)

Aspire 支持通过本地容器运行 Azure Cosmos DB 模拟器,便于离线开发与测试。在 AppHost 中:

// AppHost var cosmosdb = builder.AddAzureCosmosDB("cosmos").RunAsEmulator();

AppHost 启动时,会自动拉起一个运行 Azure Cosmos DB 的本地容器(默认使用 Linux 版 vNext 模拟器镜像)。服务端代码无需任何改动:

// Service code builder.AddAzureCosmosClient("cosmos");

从 AzureCosmosDBExtensions.cs 的实现看,RunAsEmulatorIsPublishMode下会直接返回原资源(即发布时不启动模拟器);同时组件侧的GetClientOptions会检测模拟器连接字符串并自动切换ConnectionMode.GatewayLimitToEndpoint = true,以匹配模拟器的网络模型。源码中还有RunAsClassicEmulator(经典版模拟器)与已标记[Obsolete]RunAsPreviewEmulator(请改用RunAsEmulator),以及仅对 vNext 模拟器可用的WithDataExplorer(用于暴露 Data Explorer 端点,需配合ENABLE_EXPLORER环境变量)。

源码与测试佐证:行为是如何被保证的

组件的行为并非"文档承诺",而是有明确实现与测试约束的:

  • 连接字符串解析:AspireMicrosoftAzureCosmosExtensionsTests.cs 中的AddAzureCosmosClient_EnsuresConnectionStringIsCorrect用 7 组InlineData覆盖了含/不含AccountKeyDatabaseContainerDisableServerCertificateValidation及纯端点 URI 等组合,逐一断言最终client.Endpoint的规范化结果;AddAzureCosmosClient_FailsWithError则验证了非法连接字符串会抛出包含AccountEndpoint缺失信息的异常;
  • Database / Container 注册隔离AddAzureCosmosDatabase_RegistersDatabaseService断言注册数据库后容器中存在裸CosmosClient单例(Assert.Null(client)),说明 Database/Container 注册并不向 DI 暴露多余的客户端实例,避免资源泄漏与误用;
  • 键控注册AddKeyedAzureCosmosDatabase_RegistersDatabaseService等测试验证了键控路径下服务键与实例的正确绑定;
  • 配置节绑定GetSettingsconfigSection.Bind(settings)namedConfigSection.Bind(settings)的两次绑定,以及CosmosUtils.ParseConnectionString对连接字符串的解析,共同支撑了前文"多种配置方式可叠加、连接字符串子段可提取"的结论;
  • 健康检查AddCosmosHealthCheckDisableHealthCheckstrue时直接短路返回,避免无谓的注册开销。

这些测试位于 tests/Aspire.Microsoft.Azure.Cosmos.Tests 目录,是理解组件契约边界的最佳入口。

组件全景速查

关注点API / 配置位置
注册客户端AddAzureCosmosClient/AddKeyedAzureCosmosClientAspireMicrosoftAzureCosmosExtensions.cs
注册容器AddAzureCosmosContainer/AddKeyedAzureCosmosContainer同上
注册数据库(多容器)AddAzureCosmosDatabase+AddKeyedContainerCosmosDatabaseBuilder.cs
设置项Aspire:Microsoft:Azure:Cosmos(及命名子节)MicrosoftAzureCosmosSettings.cs、ConfigurationSchema.json
健康检查默认启用,DisableHealthChecks关闭AzureCosmosDbHealthCheck.cs
编排资源AddAzureCosmosDB/RunAsEmulator/WithReferenceAzureCosmosDBExtensions.cs
行为契约测试连接解析 / 注册隔离 / 键控注册AspireMicrosoftAzureCosmosExtensionsTests.cs

小结

Aspire.Microsoft.Azure.Cosmos组件用极简的 API 封装了 Azure Cosmos DB 接入的全部样板代码:单例注册、双轨认证(连接字符串 / AAD 凭据)、多容器编排、健康检查与 OpenTelemetry 追踪。配合Aspire.Hosting.Azure.CosmosDB的 AppHost 编排能力,开发者可以用同一套代码平滑地在本地模拟器、已配置连接字符串和 Azure 托管资源之间切换,这正是 Aspire"code-first、可扩展、可观测"开发与部署体验的典型体现。建议读者结合上述源码路径与测试用例进一步研读,在真实项目中优先采用 AccountEndpoint + 默认凭据的推荐配置,并保持健康检查默认开启以保障依赖拓扑的正确性。

【免费下载链接】aspireAspire is the tool for code-first, extensible, observable dev and deploy.项目地址: https://gitcode.com/GitHub_Trending/as/aspire

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 1:25:52

VTM6.0安装编译与使用全攻略:H.266/VVC参考软件实战

1. 先搞清楚这几件事&#xff0c;再动手装VTM6.0如果你是因为看到H.266/VVC相关论文或者招聘要求才搜到这个标题&#xff0c;建议先别急着敲命令。VTM6.0是VVC&#xff08;Versatile Video Coding&#xff09;在2019年发布的第六版参考软件&#xff0c;对应当时JVET推进到第六版…

作者头像 李华
网站建设 2026/9/18 1:25:09

QGIS二元分区着色图全流程:原理、实现与配色设计

做专题图的人&#xff0c;多半遇到过这种处境&#xff1a;手上明明有两个都挺重要的指标&#xff0c;比如人口密度和人均收入&#xff0c;但传统分区着色图&#xff08;choropleth&#xff09;一张图只能填一个变量。把两张图并排放在报告里&#xff0c;读者得来回对照&#xf…

作者头像 李华
网站建设 2026/9/18 1:25:04

AR-NAR混合生成模型YuE:Hugging Face一站式实践指南

1. 项目概述&#xff1a;从“YuE”到可复现的AR–NAR MoT模型实践“YuE”不是某个网红ID&#xff0c;也不是某款新出的字体渲染工具代号&#xff0c;而是2024年中旬悄然登上Hugging Face Model Hub并引发小范围技术圈讨论的一个开源序列建模项目——全称是Autoregressive–Non-…

作者头像 李华
网站建设 2026/9/18 1:23:55

2026冲刺用!AI论文写作工具测评:最新推荐与实用对比

2026年真正好用的AI论文写作工具&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …

作者头像 李华
网站建设 2026/9/18 1:21:53

大学生网购调研数据管线:问卷设计、数据清洗与自动报告生成

简介&#xff1a;围绕大学生网络消费行为展开的调查报告文档&#xff0c;适用于电子商务、市场营销、社会学等专业的学生与教师&#xff0c;也可为校园消费调研或课程作业提供参考样本。全文以问卷调研为主线&#xff0c;依次覆盖调查背景与目的、提纲设计、样本选取与抽样方法…

作者头像 李华