Dela via


.NET Aspire Azure Event Hubs integrering

omfattar: Hostingintegration och Client integration

Azure Event Hubs är en intern dataströmningstjänst i molnet som kan strömma miljontals händelser per sekund, med låg svarstid, från valfri källa till valfri destination. Med integreringen .NET AspireAzure Event Hubs kan du ansluta till Azure Event Hubs instanser från dina .NET program.

Integrering av värdtjänster

.NET .NET Aspire Azure Event Hubs värdintegrering modellerar de olika Event Hub-resurserna i följande typer:

För att komma åt dessa typer och API:er för att uttrycka dem inom ditt appvärdprojekt, installerar du 📦Aspire.Hosting.Azure.EventHubs NuGet-paket:

dotnet add package Aspire.Hosting.Azure.EventHubs

Mer information finns i dotnet add package eller Hantera paketberoenden i .NET applikationer.

Lägga till en Azure Event Hubs resurs

Om du vill lägga till en AzureEventHubsResource i ditt appvärdsprojekt anropar du metoden AddAzureEventHubs och anger ett namn, och anropar sedan 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...

När du lägger till en Azure Event Hubs-resurs till appvärden tillhandahålls andra användbara API:er för att lägga till Event Hub-resurser och konsumentgrupper samt för att uttryckligt ange etableringskonfiguration, och som möjliggör användning av Azure Event Hubs-emulatorn. Föregående kod lägger till en Azure Event Hubs resurs med namnet event-hubs och en händelsehubb med namnet messages till appvärdprojektet. Metoden WithReference skickar anslutningsinformationen till ExampleService-projektet.

Viktig

När du anropar AddAzureEventHubsanropas implicit AddAzureProvisioning(IDistributedApplicationBuilder)– vilket ger stöd för att generera Azure resurser dynamiskt under appstarten. Appen måste konfigurera lämplig prenumeration och plats. För mer information, se lokal tilldelning: Konfiguration

Genererad Bicep-konfiguration

Om du är ny på Bicepär det ett domänspecifikt språk för att definiera Azure-resurser. Med .NET.NET Aspirebehöver du inte skriva Bicep för hand, i stället genererar etablerings-API:erna Bicep åt dig. När du publicerar din app genereras Bicep-filen tillsammans med manifestfilen. När du lägger till en Azure Event Hubs resurs genereras följande Bicep:

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

param sku string = 'Standard'

param principalType string

param principalId string

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

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
}

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

output eventHubsEndpoint string = event_hubs.properties.serviceBusEndpoint

Föregående Bicep är en modul som etablerar en Azure Event Hubs resurs med följande standardvärden:

  • location: Platsen för resursgruppen.
  • sku: SKU:n för Event Hubs-resursen har standardvärdet Standard.
  • principalId: Huvud-ID för Event Hubs-resursen.
  • principalType: Huvudtypen för Event Hubs-resursen.
  • event_hubs: Event Hubs-namnområdesresursen.
  • event_hubs_AzureEventHubsDataOwner: Resursägaren för Event Hubs, baserat på den inbyggda rollen Azure Event Hubs Data Owner. För mer information, se Azure Event Hubs dataägare.
  • messages: Event Hub-resursen.
  • eventHubsEndpoint: Slutpunkten för Event Hubs-resursen.

Den genererade Bicep är en startpunkt och påverkas av ändringar i tillhandahållandeinfrastrukturen i C#. Anpassningar till Bicep-filen skrivs över direkt, så gör ändringar via C#-etablerings-API:erna för att säkerställa att de återspeglas i de genererade filerna.

Anpassa tillhandahållandeinfrastruktur

Alla .NET AspireAzure resurser är underklasser av den AzureProvisioningResource typen. Den här typen möjliggör att den genererade Bicep kan anpassas genom att tillhandahålla ett tydligt API för att konfigurera Azure-resurserna med hjälp av ConfigureInfrastructure<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure>)-API:et. Du kan till exempel konfigurera kind, consistencyPolicy, locationsoch mycket mer. I följande exempel visas hur du anpassar AzureAzure Cosmos DB resursen:

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");
    });

Föregående kod:

Det finns många fler konfigurationsalternativ för att anpassa resursresursen för Event Hubs. Mer information finns i Azure.Provisioning.PostgreSql. För mer information, se anpassningi .

Ansluta till ett befintligt Azure Event Hubs namnområde

Du kan ha ett befintligt Azure Event Hubs namnområde som du vill ansluta till. I stället för att representera en ny Azure Event Hubs resurs kan du lägga till en anslutningssträng till appvärden. Om du vill lägga till en anslutning till ett befintligt Azure Event Hubs namnområde anropar du metoden AddConnectionString:

var builder = DistributedApplication.CreateBuilder(args);

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

builder.AddProject<Projects.WebApplication>("web")
       .WithReference(eventHubs);

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

Anmärkning

Anslutningssträngar används för att representera ett brett spektrum av anslutningsinformation, inklusive databasanslutningar, meddelandeköer, slutpunkts-URI:er och andra tjänster. I .NET.NET Aspire nomenklatur används termen "anslutningssträng" för att representera alla typer av anslutningsinformation.

Anslutningssträngen konfigureras i appvärdens konfiguration, vanligtvis under Användarhemligheter, under avsnittet ConnectionStrings. Appvärden injekterar den här anslutningssträngen som en miljövariabel i alla resurser som är beroende, till exempel:

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

Den beroende resursen kan komma åt den inmatade anslutningssträngen genom att anropa metoden GetConnectionString och skicka anslutningsnamnet som parameter, i det här fallet "event-hubs". API:et GetConnectionString är en förkortning för IConfiguration.GetSection("ConnectionStrings")[name].

Lägg till händelsehubbens konsumentgrupp

Om du vill lägga till en konsumentgrupp kedjar du ett anrop på en IResourceBuilder<AzureEventHubsResource> till AddConsumerGroup-API:et:

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...

När du anropar AddConsumerGroupkonfigureras din messages Event Hub-resurs till att ha en konsumentgrupp med namnet messagesConsumer. Konsumentgruppen skapas i Azure Event Hubs namnrymd som representeras av AzureEventHubsResource som du lade till tidigare. Mer information finns i Azure Event Hubs: Konsumentgrupper.

Lägga till Azure Event Hubs emulatorresurs

Den .NET AspireAzure Event Hubs värdintegrering stöder körning av Event Hubs-resursen som en emulator lokalt, baserat på mcr.microsoft.com/azure-messaging/eventhubs-emulator/latest containeravbildning. Detta är fördelaktigt för situationer där du vill köra Event Hubs-resursen lokalt i utvecklings- och testsyfte, så att du inte behöver etablera en Azure resurs eller ansluta till en befintlig Azure Event Hubs server.

Om du vill köra Event Hubs-resursen som en emulator anropar du metoden 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...

Föregående kod konfigurerar en Azure Event Hubs resurs att köras lokalt i en container. Mer information finns i Azure Event Hubs emulatorn.

Konfigurera Event Hubs-emulatorcontainer

Det finns olika konfigurationer tillgängliga för containerresurser, till exempel kan du konfigurera containerns portar, databindningsmonteringar, datavolymer eller tillhandahålla en wholistisk JSON konfiguration som åsidosätter allt.

Konfigurera Event Hubs-emulatorns värdport för container

Som standard exponerar containern för Event Hubs-emulatorn följande slutpunkter när den konfigureras av .NET.NET Aspire:

Slutpunkt Bild Containerhamn Värdport
emulator mcr.microsoft.com/azure-messaging/eventhubs-emulator/latest 5672 dynamisk

Porten som den lyssnar på är dynamisk som standard. När containern startar mappas porten till en slumpmässig port på värddatorn. För att konfigurera slutpunktsporten anropar kedjan containerresursverktyget som tillhandahålls av metoden RunAsEmulator och sedan WithHostPort(IResourceBuilder<AzureEventHubsEmulatorResource>, Nullable<Int32>) enligt följande exempel:

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...

Föregående kod konfigurerar Azure Event-emulatorns befintliga emulator slutpunkt för att lyssna på port 7777. Containerporten för Azure-händelseemulatorn mappas till värdporten enligt följande tabell:

Slutpunktsnamn Portmappning (container:host)
emulator 5672:7777
Lägga till Event Hubs-emulator med datavolym

Om du vill lägga till en datavolym i Event Hubs-emulatorresursen anropar du metoden WithDataVolume på Event Hubs-emulatorresursen:

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...

Datavolymen används för att bevara Event Hubs-emulatordata utanför containerns livscykel. Datavolymen monteras på sökvägen /data i containern. Ett namn genereras slumpmässigt om du inte anger parametern name. Mer information om datavolymer och detaljer om varför de föredras framför bind mountsfinns i Docker dokumentationen: Volymer.

Lägga till Event Hubs-emulatorn med databindningsmontering

Lägg till en bindningsmontering till Event Hubs-emulatorcontainern, länka ett anrop till WithDataBindMount-API:et enligt följande exempel:

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...

Viktig

Data bind-mounts har begränsad funktionalitet jämfört med volymer, som erbjuder bättre prestanda, portabilitet och säkerhet, vilket gör dem mer lämpliga för produktionsmiljöer. Bindningsmonteringar tillåter dock direkt åtkomst och ändring av filer i värdsystemet, perfekt för utveckling och testning där realtidsändringar behövs.

Databindningsmonteringar förlitar sig på värddatorns filsystem för att bevara Azure Event Hubs-emulatorns resursdata mellan omstarter av containrar. Databindningsmonteringen är monterad på sökvägen /path/to/data på värddatorn i containern. Mer information om databindningspunkter finns i Docker dokumentationen: Bindningspunkter.

Konfigurera konfigurationen för Event Hubs-emulatorcontainer JSON

Event Hubs-emulatorcontainern körs med en standardfil config.json. Du kan åsidosätta den här filen helt eller uppdatera JSON konfigurationen med en JsonNode representation av konfigurationen.

Om du vill ange en anpassad JSON konfigurationsfil anropar du metoden 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...

Föregående kod konfigurerar Event Hubs-emulatorcontainern för att använda en anpassad JSON konfigurationsfil som finns på ./messaging/custom-config.json. Detta kommer att monteras på sökvägen /Eventhubs_Emulator/ConfigFiles/Config.json i containern som en skrivskyddad fil. Om du i stället vill åsidosätta specifika egenskaper i standardkonfigurationen anropar du metoden 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...

Föregående kod hämtar noden UserConfig från standardkonfigurationen. Den uppdaterar sedan den första entitetens PartitionCount till en 5.

Utför hälsokontroller för integration

Azure Event Hubs värdintegrering lägger automatiskt till en hälsokontroll för Event Hubs-resursen. Hälsokontrollen verifierar att Event Hubs körs och att en anslutning kan upprättas till den.

Värdintegrering förlitar sig på 📦 AspNetCore.HealthChecks.Azure.Messaging.EventHubs NuGet-paket.

Client integration

Kom igång med .NET AspireAzure Event Hubs-klientintegrering genom att installera 📦Aspire.Azure. Messaging.EventHubs NuGet-paket i det klientkrävande projektet, dvs. projektet för programmet som använder Event Hubs-klienten.

dotnet add package Aspire.Azure.Messaging.EventHubs

Event Hubs-klienttyper som stöds

Följande Event Hub-klienter stöds av biblioteket, tillsammans med deras motsvarande alternativ och inställningsklasser:

Azure klienttyp Azure alternativklass .NET .NET Aspire inställningsklass
EventHubProducerClient EventHubProducerClientOptions AzureMessagingEventHubsProducerSettings
EventHubBufferedProducerClient EventHubBufferedProducerClientOptions AzureMessagingEventHubsBufferedProducerSettings
EventHubConsumerClient EventHubConsumerClientOptions AzureMessagingEventHubsConsumerSettings
EventProcessorClient EventProcessorClientOptions AzureMessagingEventHubsProcessorSettings
PartitionReceiver PartitionReceiverOptions AzureMessagingEventHubsPartitionReceiverSettings

Klienttyperna kommer från Azure SDK för .NET, liksom motsvarande alternativklasser. Inställningsklasserna tillhandahålls av .NET.NET Aspire. Inställningsklasserna används för att konfigurera klientinstanserna.

Lägga till en Event Hubs-producentklient

I Program.cs-filen för ditt klientprojekt anropar du AddAzureEventHubProducerClient-tilläggsmetoden på alla IHostApplicationBuilder för att registrera en EventHubProducerClient för användning via beroendeinjiceringscontainern. Metoden tar en parameter för anslutningsnamn.

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

Tips

Parametern connectionName måste matcha namnet som används när du lägger till Event Hubs-resursen i appvärdprojektet. Mer information finns i Lägg till en Azure Event Hubs resurs.

När du har lagt till EventHubProducerClientkan du hämta klientinstansen med hjälp av beroendeinjektion. Om du till exempel vill hämta datakällobjektet från en exempeltjänst definierar du det som en konstruktorparameter och kontrollerar att klassen ExampleService är registrerad med containern för beroendeinmatning:

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

Mer information finns i:

Ytterligare API:er att överväga

Klientintegrering innehåller ytterligare API:er för att konfigurera klientinstanser. När du behöver registrera en Event Hubs-klient bör du överväga följande API:er:

Azure klienttyp API för registrering
EventHubProducerClient AddAzureEventHubProducerClient
EventHubBufferedProducerClient AddAzureEventHubBufferedProducerClient
EventHubConsumerClient AddAzureEventHubConsumerClient
EventProcessorClient AddAzureEventProcessorClient
PartitionReceiver AddAzurePartitionReceiverClient

Alla ovan nämnda API:er innehåller valfria parametrar för att konfigurera klientinstanserna.

Lägga till en nyckelad Event Hubs-producentklient

Det kan finnas situationer där du vill registrera flera EventHubProducerClient instanser med olika anslutningsnamn. Om du vill registrera nyckelade Event Hubs-klienter anropar du metoden AddKeyedAzureServiceBusClient:

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

Viktig

När du använder nyckelade tjänster förväntas din Event Hubs-resurs konfigurera två namngivna hubbar, en för messages och en för commands.

Sedan kan du hämta klientinstanserna med hjälp av dependency injection. Om du till exempel vill hämta klienterna från en tjänst:

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

Mer information finns i Nyckelade tjänster i .NET.

Ytterligare nyckelade API:er att överväga

Klientintegrering innehåller ytterligare API:er för att konfigurera nyckelade klientinstanser. När du behöver registrera en nyckelad Event Hubs-klient bör du överväga följande API:er:

Azure klienttyp API för registrering
EventHubProducerClient AddKeyedAzureEventHubProducerClient
EventHubBufferedProducerClient AddKeyedAzureEventHubBufferedProducerClient
EventHubConsumerClient AddKeyedAzureEventHubConsumerClient
EventProcessorClient AddKeyedAzureEventProcessorClient
PartitionReceiver AddKeyedAzurePartitionReceiverClient

Alla ovan nämnda API:er innehåller valfria parametrar för att konfigurera klientinstanserna.

Konfiguration

.NET Aspire Azure Event Hubs-biblioteket innehåller flera alternativ för att konfigurera Azure Event Hubs-anslutningen baserat på kraven och konventionerna i ditt projekt. Antingen en FullyQualifiedNamespace eller en ConnectionString måste anges.

Använda en anslutningssträng

När du använder en anslutningssträng från ConnectionStrings konfigurationsavsnittet anger du namnet på anslutningssträngen när du anropar builder.AddAzureEventHubProducerClient() och andra Event Hubs-klienter som stöds. I det här exemplet innehåller anslutningssträngen inte egenskapen EntityPath, så egenskapen EventHubName måste anges i inställningsåteranropet:

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

Och sedan hämtas anslutningsinformationen från avsnittet ConnectionStrings konfiguration. Två anslutningsformat stöds:

Fullständigt kvalificerat namnområde (FQN)

Den rekommenderade metoden är att använda ett fullständigt kvalificerat namnområde som fungerar med egenskapen AzureMessagingEventHubsSettings.Credential för att upprätta en anslutning. Om inga autentiseringsuppgifter har konfigurerats används DefaultAzureCredential.

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

Anslutningssträng

Du kan också använda en anslutningssträng:

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

Använda konfigurationsprovidrar

.NET Aspire Azure Event Hubs-biblioteket stöder Microsoft.Extensions.Configuration. Den läser in AzureMessagingEventHubsSettings och associerade alternativ, t.ex. EventProcessorClientOptions, från konfigurationen med hjälp av Aspire:Azure:Messaging:EventHubs:-nyckelprefixet följt av namnet på den specifika klient som används. Tänk till exempel på appsettings.json som konfigurerar några av alternativen för en EventProcessorClient:

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

Det fullständiga Azure Event Hubs klientintegreringsschemat JSON finns i Aspire.Azure. Messaging.EventHubs/ConfigurationSchema.json.

Du kan också konfigurera typ av alternativ med hjälp av den valfria parametern Action<IAzureClientBuilder<EventProcessorClient, EventProcessorClientOptions>> configureClientBuilder för metoden AddAzureEventProcessorClient. Om du till exempel vill ange processorns klient-ID för den här klienten:

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

Observerbarhet och telemetri

.NET .NET Aspire integreringar konfigurerar automatiskt konfigurationer för loggning, spårning och mått, som ibland kallas grundpelarna för observerbarhet. Mer information om integreringsobservabilitet och telemetri finns i översikten över .NET.NET Aspire integreringar. Beroende på säkerhetskopieringstjänsten kanske vissa integreringar bara stöder vissa av dessa funktioner. Vissa integreringar stöder till exempel loggning och spårning, men inte mått. Telemetrifunktioner kan också inaktiveras med hjälp av de tekniker som visas i avsnittet Configuration.

Skogsavverkning

.NET Aspire Azure Event Hubs-integreringen använder följande loggkategorier:

  • Azure.Core
  • Azure.Identity

Spårning

.NET Aspire Azure Event Hubs-integreringen genererar följande spårningsaktiviteter med hjälp av OpenTelemetry:

  • Azure.Messaging.EventHubs.*

Mätvärden

Den .NET AspireAzure Event Hubs integreringen stöder för närvarande inte mått som standard på grund av begränsningar med Azure SDK för .NET. Om detta ändras i framtiden uppdateras det här avsnittet för att återspegla dessa ändringar.

Se även