Aspire Azure Event Hubs 集成

包含:已包含托管集成 托管集成 —&— 已包含 Client 集成Client 集成

Azure Event Hubs 是一种云中原生的数据流服务,每秒可以传输数百万个事件,具有低延迟的特性,从任何源到达任何目标。 Aspire Azure Event Hubs 集成使你能够从 Azure Event Hubs 应用程序连接到 .NET 实例。

托管集成

托管AspireAzure Event Hubs 集成功能将各种事件中心资源作为以下类型进行建模:

若要访问这些类型和 API 以在 AppHost 项目中表达它们,请安装 。📦AspireHosting.Azure.EventHubs NuGet 包:

dotnet add package Aspire.Hosting.Azure.EventHubs

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

添加 Azure Event Hubs 资源

若要向 AppHost 项目添加一个 AzureEventHubsResource ,请调用 AddAzureEventHubs 提供名称的方法,然后调用 AddHub

var builder = DistributedApplication.CreateBuilder(args);

var eventHubs = builder.AddAzureEventHubs("event-hubs");
eventHubs.AddHub("messages");

builder.AddProject<Projects.ExampleService>()
       .WithReference(eventHubs);

// After adding all resources, run the app...

将资源添加到 Azure Event Hubs AppHost 时,它会公开其他有用的 API,以添加事件中心资源、使用者组、快速显式预配配置,并启用模拟器的使用 Azure Event Hubs 。 前面的代码将添加一Azure Event Hubs个名为event-hubs的资源和一个名为 AppHost 项目的事件中心messagesWithReference 方法将连接信息传递给 ExampleService 项目。

重要

调用 AddAzureEventHubs时,它会隐式调用 AddAzureProvisioning(IDistributedApplicationBuilder),这增加了在应用启动期间动态生成 Azure 资源的支持。 应用必须配置相应的订阅和位置。 有关详细信息,请参阅 本地预配:配置

连接到现有 Azure Event Hubs 命名空间

你可能有一个要连接的现有 Azure Event Hubs 服务。 你可以链接调用以标注你的 AzureEventHubsResource 现有资源:

var builder = DistributedApplication.CreateBuilder(args);

var existingEventHubsName = builder.AddParameter("existingEventHubsName");
var existingEventHubsResourceGroup = builder.AddParameter("existingEventHubsResourceGroup");

var eventHubs = builder.AddAzureEventHubs("event-hubs")
                    .AsExisting(existingEventHubsName, existingEventHubsResourceGroup);

builder.AddProject<Projects.ExampleProject>()
       .WithReference(eventHubs);

// After adding all resources, run the app...

重要

调用RunAsExistingPublishAsExistingAsExisting处理订阅中Azure已存在的资源的方法时,必须将某些配置值添加到 AppHost,以确保Aspire找到它们。 必要的配置值包括 SubscriptionIdAllowResourceGroupCreationResourceGroupLocation。 如果未设置它们,仪表板中 Aspire 会显示“缺少配置”错误。 有关如何设置它们的详细信息,请参阅 “配置”。

有关将 Azure Event Hubs 资源视为现有资源的详细信息,请参阅 “使用现有 Azure 资源”。

注释

或者,可以向 AppHost 添加连接字符串,而不是表示 Azure Event Hubs 资源。 此方法属于弱类型,不适用于角色分配或基础结构自定义。 有关详细信息,请参阅 添加包含连接字符串的现有 Azure 资源

添加事件中心使用者组

若要添加使用者组,请将对 IResourceBuilder<AzureEventHubsResource> 的调用链接到 AddConsumerGroup API:

var builder = DistributedApplication.CreateBuilder(args);

var eventHubs = builder.AddAzureEventHubs("event-hubs");
var messages = eventHubs.AddHub("messages");
messages.AddConsumerGroup("messagesConsumer");

builder.AddProject<Projects.ExampleService>()
       .WithReference(eventHubs);

// After adding all resources, run the app...

调用 AddConsumerGroup时,它将 messages 事件中心资源配置为具有名为 messagesConsumer的使用者组。 使用者组是在您之前添加的 Azure Event Hubs 表示的 AzureEventHubsResource 命名空间中创建的。 有关详细信息,请参阅 Azure Event Hubs:使用者组

添加 Azure Event Hubs 模拟器资源

Aspire Azure Event Hubs 托管集成支持基于 mcr.microsoft.com/azure-messaging/eventhubs-emulator/latest 容器映像在本地以模拟器的形式运行事件中心资源。 这适用于想要在本地运行事件中心资源以进行开发和测试的情况,避免需要预配 Azure 资源或连接到现有 Azure Event Hubs 服务器。

若要以模拟器的形式运行事件中心资源,请调用 RunAsEmulator 方法:

var builder = DistributedApplication.CreateBuilder(args);

var eventHubs = builder.AddAzureEventHubs("event-hubs")
                       .RunAsEmulator();

eventHubs.AddHub("messages");

var exampleProject = builder.AddProject<Projects.ExampleProject>()
                            .WithReference(eventHubs);

// After adding all resources, run the app...

前面的代码将 Azure Event Hubs 资源配置为在容器中本地运行。 有关详细信息,请参阅 Azure Event Hubs 模拟器

配置事件中心模拟器容器

有各种配置可用于容器资源,例如,可以配置容器的端口、数据绑定装载、数据卷,或者提供替代所有内容的专用 JSON 配置。

配置事件中心模拟器容器主机端口

默认情况下,事件中心模拟器容器在配置 Aspire时公开以下终结点:

端点 图像 集装箱码头 主机端口
emulator mcr.microsoft.com/azure-messaging/eventhubs-emulator/latest 5672 动态的

默认情况下,侦听的端口是动态的。 容器启动时,端口将映射到主机上的随机端口。 若要配置终结点端口,请对 RunAsEmulator 方法提供的容器资源生成器进行链式调用,然后对 WithHostPort(IResourceBuilder<AzureEventHubsEmulatorResource>, Nullable<Int32>) 进行链式调用,如以下示例所示:

var builder = DistributedApplication.CreateBuilder(args);

var eventHubs = builder.AddAzureEventHubs("event-hubs")
                       .RunAsEmulator(emulator =>
                       {
                           emulator.WithHostPort(7777);
                       });

eventHubs.AddHub("messages");

builder.AddProject<Projects.ExampleService>()
       .WithReference(eventHubs);

// After adding all resources, run the app...

上述代码将 Azure 事件模拟器容器的现有 emulator 终结点配置为侦听 7777 端口。 Azure 事件模拟器容器的端口映射到主机端口,如下表所示:

终结点名称 端口映射 (container:host)
emulator 5672:7777
添加包含数据卷的事件中心模拟器

若要将数据卷添加到事件中心模拟器资源,请在事件中心模拟器资源上调用 WithDataVolume 方法:

var builder = DistributedApplication.CreateBuilder(args);

var eventHubs = builder.AddAzureEventHubs("event-hubs")
                       .RunAsEmulator(emulator =>
                       {
                           emulator.WithDataVolume();
                       });

eventHubs.AddHub("messages");

builder.AddProject<Projects.ExampleService>()
       .WithReference(eventHubs);

// After adding all resources, run the app...

数据卷用于在容器的生命周期之外保留事件中心模拟器数据。 数据卷会装载到容器中的 /data 路径。 除非你提供 name 参数集,否则会随机生成名称。 有关数据卷的详细信息,以及为什么首选它们而不是绑定装载的详细信息,请参阅 Docker 文档:卷

添加具有数据绑定装载的事件中心模拟器

将绑定装载添加到事件中心模拟器容器中,并链接对 WithDataBindMount API 的调用,如以下示例所示:

var builder = DistributedApplication.CreateBuilder(args);

var eventHubs = builder.AddAzureEventHubs("event-hubs")
                       .RunAsEmulator(emulator =>
                       {
                           emulator.WithDataBindMount("/path/to/data");
                       });

eventHubs.AddHub("messages");

builder.AddProject<Projects.ExampleService>()
       .WithReference(eventHubs);

// After adding all resources, run the app...

重要

相比,数据绑定装载的功能有限,这些卷提供更好的性能、可移植性和安全性,使它们更适用于生产环境。 但是,绑定装载允许直接访问和修改主机系统上的文件,非常适合在需要实时更改的情况下进行开发和测试。

数据绑定装载依赖于主机的文件系统在容器重启时保存 Azure Event Hubs 模拟器资源数据。 数据绑定装载在容器中主机的 /path/to/data 路径上装载。 有关数据绑定装载的详细信息,请参阅 Docker 文档:绑定装载

配置事件中心模拟器容器 JSON 配置

事件中心模拟器容器使用默认 config.json 文件运行。 你可以完全替代此文件,也可以使用配置的 JSON 表示形式更新 JsonNode 配置。

若要提供自定义 JSON 配置文件,请调用 WithConfigurationFile(IResourceBuilder<AzureEventHubsEmulatorResource>, String) 方法:

var builder = DistributedApplication.CreateBuilder(args);

var eventHubs = builder.AddAzureEventHubs("event-hubs")
                       .RunAsEmulator(emulator =>
                       {
                           emulator.WithConfigurationFile("./messaging/custom-config.json");
                       });

eventHubs.AddHub("messages");

builder.AddProject<Projects.ExampleService>()
       .WithReference(eventHubs);

// After adding all resources, run the app...

前面的代码将事件中心模拟器容器配置为使用位于 JSON的自定义 ./messaging/custom-config.json 配置文件。 这将作为只读文件挂载到容器上的 /Eventhubs_Emulator/ConfigFiles/Config.json 路径。 若要替代默认配置中的特定属性,请调用 WithConfiguration(IResourceBuilder<AzureEventHubsEmulatorResource>, Action<JsonNode>) 方法:

var builder = DistributedApplication.CreateBuilder(args);

var eventHubs = builder.AddAzureEventHubs("event-hubs")
                       .RunAsEmulator(emulator =>
                       {
                           emulator.WithConfiguration(
                               (JsonNode configuration) =>
                               {
                                   var userConfig = configuration["UserConfig"];
                                   var ns = userConfig["NamespaceConfig"][0];
                                   var firstEntity = ns["Entities"][0];
                                   
                                   firstEntity["PartitionCount"] = 5;
                               });
                       });

eventHubs.AddHub("messages");

builder.AddProject<Projects.ExampleService>()
       .WithReference(eventHubs);

// After adding all resources, run the app...

前面的代码从默认配置中检索 UserConfig 节点。 然后,它将第一个实体的 PartitionCount 更新为 5

预配生成的 Bicep

如果你不熟悉 Bicep,则它是用于定义 Azure 资源的特定于域的语言。 使用 Aspire时,无需手动编写 Bicep,而是预配 API 会为你生成 Bicep。 发布应用时,生成的 Bicep 文件将与清单文件一同输出。 添加 Azure Event Hubs 资源时,会生成以下 Bicep:

@description('The location for the resource(s) to be deployed.')
param location string = resourceGroup().location

param sku string = 'Standard'

resource event_hubs 'Microsoft.EventHub/namespaces@2024-01-01' = {
  name: take('event_hubs-${uniqueString(resourceGroup().id)}', 256)
  location: location
  properties: {
    disableLocalAuth: true
  }
  sku: {
    name: sku
  }
  tags: {
    'aspire-resource-name': 'event-hubs'
  }
}

resource messages 'Microsoft.EventHub/namespaces/eventhubs@2024-01-01' = {
  name: 'messages'
  parent: event_hubs
}

output eventHubsEndpoint string = event_hubs.properties.serviceBusEndpoint

output name string = event_hubs.name

前述的 Bicep 是一个配置 Azure Event Hubs 资源的模块。 此外,在单独的模块中为 Azure 资源创建角色分配:

@description('The location for the resource(s) to be deployed.')
param location string = resourceGroup().location

param event_hubs_outputs_name string

param principalType string

param principalId string

resource event_hubs 'Microsoft.EventHub/namespaces@2024-01-01' existing = {
  name: event_hubs_outputs_name
}

resource event_hubs_AzureEventHubsDataOwner 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(event_hubs.id, principalId, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'f526a384-b230-433a-b45c-95f59c4a2dec'))
  properties: {
    principalId: principalId
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'f526a384-b230-433a-b45c-95f59c4a2dec')
    principalType: principalType
  }
  scope: event_hubs
}

生成的 Bicep 是一个起点,并受到 C# 中预配基础结构变化的影响。 对 Bicep 文件进行的自定义将直接被覆盖,因此请通过 C# 预配 API 进行更改,以确保它们反映在生成的文件中。

自定义预配基础结构

所有 AspireAzure 资源都是 AzureProvisioningResource 类型的子类。 这类型通过提供用于配置 Azure 资源的流畅 API 来允许自定义生成的 Bicep - ConfigureInfrastructure<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure>) API。 例如,可以配置 kindconsistencyPolicylocations等。 以下示例演示如何自定义 AzureAzure Cosmos DB 资源:

builder.AddAzureEventHubs("event-hubs")
    .ConfigureInfrastructure(infra =>
    {
        var eventHubs = infra.GetProvisionableResources()
                             .OfType<EventHubsNamespace>()
                             .Single();

        eventHubs.Sku = new EventHubsSku()
        {
            Name = EventHubsSkuName.Premium,
            Tier = EventHubsSkuTier.Premium,
            Capacity = 7,
        };
        eventHubs.PublicNetworkAccess = EventHubsPublicNetworkAccess.SecuredByPerimeter;
        eventHubs.Tags.Add("ExampleKey", "Example value");
    });

前面的代码:

还有更多配置选项可用于自定义事件中心资源资源。 有关详细信息,请参阅 Azure.Provisioning.PostgreSql。 有关详细信息,请参阅 Azure.Provisioning 自定义

托管集成运行状况检查

Azure Event Hubs 托管集成会自动为 Event Hubs 资源添加健康检查。 运行状况检查会验证事件中心是否正在运行,以及是否可以与其建立连接。

托管集成依赖于 📦 AspNetCore.HealthChecks.Azure。Messaging.EventHubs NuGet 包。

Client 集成

若要开始进行 AspireAzure Event Hubs 客户端集成,请在使用客户端的项目(即,使用事件中心客户端的应用程序的项目)中安装 📦Aspire.Azure.Messaging.EventHubs NuGet 包。

dotnet add package Aspire.Azure.Messaging.EventHubs

支持的事件中心客户端类型

库支持以下事件中心客户端及其相应的选项和设置类:

Azure 客户端类型 Azure 选项类 Aspire 设置类
EventHubProducerClient EventHubProducerClientOptions AzureMessagingEventHubsProducerSettings
EventHubBufferedProducerClient EventHubBufferedProducerClientOptions AzureMessagingEventHubsBufferedProducerSettings
EventHubConsumerClient EventHubConsumerClientOptions AzureMessagingEventHubsConsumerSettings
EventProcessorClient EventProcessorClientOptions AzureMessagingEventHubsProcessorSettings
PartitionReceiver 类 PartitionReceiverOptions AzureMessagingEventHubsPartitionReceiverSettings

客户端类型来自用于 Azure的 .NET SDK,相应的选项类也一样。 设置类由 Aspire 提供。 设置类用于配置客户端实例。

添加事件中心生成者客户端

在客户端使用项目的 Program.cs 文件中,对任何 AddAzureEventHubProducerClient 调用 IHostApplicationBuilder 扩展方法,将 EventHubProducerClient 注册到依赖注入容器中以供使用。 该方法采用连接名称参数。

builder.AddAzureEventHubProducerClient(connectionName: "event-hubs");

小提示

参数 connectionName 必须与在 AppHost 项目中添加事件中心资源时使用的名称匹配。 有关详细信息,请参阅 “添加 Azure Event Hubs 资源”。

添加 EventHubProducerClient后,可以使用依赖项注入检索客户端实例。 例如,若要从示例服务中检索数据源对象,请将其定义为构造函数参数,并确保 ExampleService 类注册到依赖项注入容器:

public class ExampleService(EventHubProducerClient client)
{
    // Use client...
}

有关详细信息,请参阅:

要考虑的其他 API

客户端集成提供用于配置客户端实例的其他 API。 需要注册事件中心客户端时,请考虑以下 API:

Azure 客户端类型 注册 API
EventHubProducerClient AddAzureEventHubProducerClient
EventHubBufferedProducerClient AddAzureEventHubBufferedProducerClient
EventHubConsumerClient AddAzureEventHubConsumerClient
EventProcessorClient AddAzureEventProcessorClient
PartitionReceiver 类 AddAzurePartitionReceiverClient

上述所有 API 都包含用于配置客户端实例的可选参数。

添加键控事件中心生成者客户端

在某些情况下,可能需要使用不同的连接名称注册多个 EventHubProducerClient 实例。 若要注册密钥事件中心客户端,请调用 AddKeyedAzureServiceBusClient 方法:

builder.AddKeyedAzureEventHubProducerClient(name: "messages");
builder.AddKeyedAzureEventHubProducerClient(name: "commands");

重要

使用密钥服务时,预计您的事件中心资源应配置两个命名中心,一个用于 messages,一个用于 commands

然后,可以使用依赖项注入检索客户端实例。 例如,从服务中检索客户端:

public class ExampleService(
    [KeyedService("messages")] EventHubProducerClient messagesClient,
    [KeyedService("commands")] EventHubProducerClient commandsClient)
{
    // Use clients...
}

有关详细信息,请参阅 .NET 中的键控服务

要考虑的其他关键 API

客户端集成提供用于配置密钥客户端实例的其他 API。 需要注册密钥事件中心客户端时,请考虑以下 API:

Azure 客户端类型 注册 API
EventHubProducerClient AddKeyedAzureEventHubProducerClient
EventHubBufferedProducerClient AddKeyedAzureEventHubBufferedProducerClient
EventHubConsumerClient AddKeyedAzureEventHubConsumerClient
EventProcessorClient AddKeyedAzureEventProcessorClient
PartitionReceiver 类 AddKeyedAzurePartitionReceiverClient

上述所有 API 都包含用于配置客户端实例的可选参数。

配置

Aspire Azure Event Hubs 库提供了多个选项,用于根据项目的要求和约定配置 Azure Event Hubs 连接。 必须提供 FullyQualifiedNamespaceConnectionString

使用连接字符串

使用 ConnectionStrings 配置部分中的连接字符串时,在调用 builder.AddAzureEventHubProducerClient() 和其他受支持的事件中心客户端时提供连接字符串的名称。 在此示例中,连接字符串不包括 EntityPath 属性,因此必须在设置回调中设置 EventHubName 属性:

builder.AddAzureEventHubProducerClient(
    "event-hubs",
    static settings =>
    {
        settings.EventHubName = "MyHub";
    });

然后,将从 ConnectionStrings 配置部分检索连接信息。 支持两种连接格式:

完全限定命名空间 (FQN)

建议的方法是使用完全限定的命名空间,此命名空间协同 AzureMessagingEventHubsSettings.Credential 属性来建立连接。 如果未配置凭据,则使用 DefaultAzureCredential

{
  "ConnectionStrings": {
    "event-hubs": "{your_namespace}.servicebus.windows.net"
  }
}

连接字符串

或者,使用连接字符串:

{
  "ConnectionStrings": {
    "event-hubs": "Endpoint=sb://mynamespace.servicebus.windows.net/;SharedAccessKeyName=accesskeyname;SharedAccessKey=accesskey;EntityPath=MyHub"
  }
}

使用配置提供程序

Aspire Azure Event Hubs 库支持 Microsoft.Extensions.Configuration。 它通过使用 AzureMessagingEventHubsSettings 键前缀以及后面正在使用的特定客户端的名称从配置中加载 EventProcessorClientOptions 和关联的选项,例如 Aspire:Azure:Messaging:EventHubs:。 例如,考虑用于配置 appsettings.json 的某些选项的 EventProcessorClient

{
  "Aspire": {
    "Azure": {
      "Messaging": {
        "EventHubs": {
          "EventProcessorClient": {
            "EventHubName": "MyHub",
            "ClientOptions": {
              "Identifier": "PROCESSOR_ID"
            }
          }
        }
      }
    }
  }
}

有关完整的 Azure Event Hubs 客户端集成 JSON 架构,请参阅 Aspire.Azure.Messaging.EventHubs/ConfigurationSchema.json

使用命名配置

该 AspireAzure Event Hubs 库支持命名配置,允许你使用不同的设置配置同一客户端类型的多个实例。 命名配置使用连接名称作为特定客户端配置部分下的密钥。

{
  "Aspire": {
    "Azure": {
      "Messaging": {
        "EventHubs": {
          "EventProcessorClient": {
            "processor1": {
              "EventHubName": "MyHub1",
              "ClientOptions": {
                "Identifier": "PROCESSOR_1"
              }
            },
            "processor2": {
              "EventHubName": "MyHub2",
              "ClientOptions": {
                "Identifier": "PROCESSOR_2"
              }
            }
          }
        }
      }
    }
  }
}

在此示例中,当调用processor1时,可以使用processor2AddAzureEventProcessorClient作为连接名称。

builder.AddAzureEventProcessorClient("processor1");
builder.AddAzureEventProcessorClient("processor2");

命名配置优先于顶级配置。 如果同时提供这两种设置,则命名配置中的设置将替代顶级设置。

你还可以使用 Action<IAzureClientBuilder<EventProcessorClient, EventProcessorClientOptions>> configureClientBuilder 方法的可选 AddAzureEventProcessorClient 参数设置选项类型。 例如,若要为此客户端设置处理器的客户端 ID,请执行以下操作:

builder.AddAzureEventProcessorClient(
    "event-hubs",
    configureClientBuilder: clientBuilder => clientBuilder.ConfigureOptions(
        options => options.Identifier = "PROCESSOR_ID"));

可观测性和遥测

Aspire 集成会自动设置日志记录、跟踪和指标配置,这些配置有时称为 可观测性支柱。 有关集成可观测性和遥测的详细信息,请参阅 Aspire 集成概述。 根据支持服务,某些集成可能仅支持其中一些功能。 例如,某些集成支持日志记录和跟踪,但不支持指标。 还可以使用 “配置” 部分中介绍的技术禁用遥测功能。

日志记录

Aspire Azure Event Hubs 集成使用以下日志类别:

  • Azure.Core
  • Azure.Identity

跟踪

Aspire Azure Event Hubs 集成将使用 OpenTelemetry 发出以下跟踪活动:

  • Azure.Messaging.EventHubs.*

指标

由于 Aspire SDK for Azure Event Hubs 限制的缘故,Azure.NET 集成目前默认不支持这些指标。 如果将来发生此更改,将更新此部分以反映这些更改。

另请参阅