Convalidare l'uso di uno schema Avro durante lo streaming di eventi usando gli SDK .NET di Hub eventi (AMQP)
In questa guida di avvio rapido si apprenderà come inviare e ricevere eventi da un hub eventi con la convalida dello schema utilizzando la libreria .NET Azure.Messaging.EventHubs.
Nota
Il Registro schemi di Azure è una funzionalità di Hub eventi, che fornisce un repository centrale per gli schemi per le applicazioni basate su eventi e incentrate sulla messaggistica. Offre la flessibilità necessaria per consentire alle applicazioni producer e consumer di scambiare dati senza dover gestire e condividere lo schema. Fornisce inoltre un framework di governance semplice per gli schemi riutilizzabili e definisce la relazione tra gli schemi tramite un costrutto di raggruppamento (gruppi di schemi). Per altre informazioni, vedere Registro schemi di Azure in Hub eventi.
Prerequisiti
Se non si ha familiarità con Hub eventi di Azure, vedere Panoramica di Hub eventi prima di procedere con questa guida di avvio rapido.
Per completare questa guida introduttiva è necessario soddisfare i prerequisiti seguenti:
- Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.
- Microsoft Visual Studio 2022.
La libreria client di Hub eventi di Azure usa le nuove funzionalità introdotte in C# 8.0. È comunque possibile usare la libreria con le versioni precedenti del linguaggio C#, ma la nuova sintassi non sarà disponibile. Per utilizzare la sintassi completa, è consigliabile eseguire la compilazione con .NET Core SDK 3.0 o versione successiva e la versione della lingua impostata su
latest
. Se si usa Visual Studio, le versioni precedenti a Visual Studio 2019 non sono compatibili con gli strumenti necessari per la compilazione di progetti in C# 8.0. Visual Studio 2019, inclusa l'edizione Community gratuita, può essere scaricato qui.
Creare un hub eventi
Seguire le istruzioni della guida di avvio rapido: Creare uno spazio dei nomi di Hub eventi e un hub eventi per creare uno spazio dei nomi di Hub eventi e un hub eventi. Seguire quindi le istruzioni riportate in Ottenere la stringa di connessione per ottenere una stringa di connessione in relazione allo spazio dei nomi di Hub eventi.
Prendere nota delle impostazioni seguenti usate nella guida di avvio rapido corrente:
- stringa di connessione per lo spazio dei nomi di Hub eventi
- Nome dell'hub eventi
Creare uno schema
Seguire le istruzioni riportate in Creare schemi utilizzando il Registro schemi per creare un gruppo di schemi e uno schema.
Creare un gruppo di schemi denominato contoso-sg utilizzando il portale del Registro schemi. Usare Avro come tipo di serializzazione e Nessuna per la modalità di compatibilità.
In tale gruppo di schemi creare un nuovo schema Avro con il nome dello schema:
Microsoft.Azure.Data.SchemaRegistry.example.Order
utilizzando il contenuto dello schema seguente.{ "namespace": "Microsoft.Azure.Data.SchemaRegistry.example", "type": "record", "name": "Order", "fields": [ { "name": "id", "type": "string" }, { "name": "amount", "type": "double" }, { "name": "description", "type": "string" } ] }
Aggiungere un utente al ruolo lettore del Registro schemi
Aggiungere l'account utente al ruolo Lettore del Registro schemi a livello di spazio dei nomi. È inoltre possibile usare il ruolo Collaboratore del Registro schemi, ma non è necessario per questa guida introduttiva.
- Nella pagina Spazio dei nomi di Hub eventi, selezionare Controllo di accesso (IAM) nel menu a sinistra.
- Nella pagina Controllo di accesso (IAM), selezionare + Aggiungi ->Aggiungi assegnazione di ruolo nel menu.
- Nella pagina Tipo di assegnazione, selezionare Avanti.
- Nella pagina Ruoli, selezionare Lettore del Registro schemi (anteprima) e quindi selezionare Avanti nella parte inferiore della pagina.
- Usare il collegamento + Seleziona membri per aggiungere l'account utente al ruolo e quindi selezionare Avanti.
- Nella pagina Rivedi + assegna, selezionare Rivedi + assegna.
Generare eventi in hub eventi con la convalida dello schema
Creare un'applicazione console per il producer di eventi
- Avviare Visual Studio 2019.
- Selezionare Crea un nuovo progetto.
- Nella finestra di dialogo Crea un nuovo progetto seguire questa procedura: se non viene visualizzata questa finestra di dialogo, selezionare File dal menu, selezionare Nuovoe quindi selezionare Progetto.
Selezionare C# come linguaggio di programmazione.
Selezionare Console come tipo di applicazione.
Selezionare Applicazione console nell'elenco dei risultati.
Quindi seleziona Avanti.
- Immettere OrderProducer come nome del progetto, SRQuickStart per il nome della soluzione e quindi selezionare OK per creare il progetto.
Aggiungere il pacchetto NuGet di Hub eventi
Scegliere Strumenti>Gestione pacchetti NuGet>Console di Gestione pacchetti dal menu.
Eseguire i comandi seguenti per installare Azure.Messaging.EventHubs e altri pacchetti NuGet. Premere INVIO per eseguire l'ultimo comando.
Install-Package Azure.Messaging.EventHubs Install-Package Azure.Identity Install-Package Microsoft.Azure.Data.SchemaRegistry.ApacheAvro Install-Package Azure.ResourceManager.Compute
Autenticare le applicazioni producer per connettersi ad Azure tramite Visual Studio, come illustrato qui.
Accedere ad Azure utilizzando l'account utente membro del ruolo
Schema Registry Reader
a livello dello spazio dei nomi. Per informazioni sui ruoli del Registro schemi, vedere Registro schemi di Azure in Hub eventi.
Generazione di codice con lo schema Avro
- Utilizzare lo stesso contenuto usato per creare lo schema per creare un file denominato
Order.avsc
. Salvare il file nella cartella del progetto o della soluzione. - È quindi possibile usare questo file di schema per generare codice per .NET. È possibile usare qualsiasi strumento di generazione di codice esterno, ad esempio avrogen per la generazione di codice. Ad esempio, è possibile eseguire
avrogen -s .\Order.avsc .
per generare codice. - Dopo aver generato il codice, verrà visualizzato il file denominato
Order.cs
nella cartella\Microsoft\Azure\Data\SchemaRegistry\example
. Per lo schema Avro precedente, genera i tipi C# nello spazio dei nomiMicrosoft.Azure.Data.SchemaRegistry.example
. - Aggiungere il file
Order.cs
al progettoOrderProducer
.
Scrivere codice per serializzare e inviare eventi all'hub eventi
Aggiungere il codice seguente al file
Program.cs
. Per i dettagli, vedere i commenti nel codice. I passaggi di alto livello nel codice sono:- Creare un client producer che è possibile utilizzare per inviare eventi a un hub eventi.
- Creare un client del Registro schemi che è possibile usare per serializzare e convalidare i dati in un oggetto
Order
. - Creare un nuovo oggetto
Order
usando il tipoOrder
generato. - Utilizzare il client del Registro schemi per serializzare l'oggetto
Order
inEventData
. - Creare un batch di eventi.
- Aggiungere i dati dell'evento al batch di eventi.
- Utilizzare il client producer per inviare il batch di eventi all'hub eventi.
using Azure.Data.SchemaRegistry; using Azure.Identity; using Microsoft.Azure.Data.SchemaRegistry.ApacheAvro; using Azure.Messaging.EventHubs; using Azure.Messaging.EventHubs.Producer; using Microsoft.Azure.Data.SchemaRegistry.example; // connection string to the Event Hubs namespace const string connectionString = "EVENTHUBSNAMESPACECONNECTIONSTRING"; // name of the event hub const string eventHubName = "EVENTHUBNAME"; // Schema Registry endpoint const string schemaRegistryEndpoint = "EVENTHUBSNAMESPACENAME.servicebus.windows.net"; // name of the consumer group const string schemaGroup = "SCHEMAGROUPNAME"; // The Event Hubs client types are safe to cache and use as a singleton for the lifetime // of the application, which is best practice when events are being published or read regularly. EventHubProducerClient producerClient; // Create a producer client that you can use to send events to an event hub producerClient = new EventHubProducerClient(connectionString, eventHubName); // Create a schema registry client that you can use to serialize and validate data. var schemaRegistryClient = new SchemaRegistryClient(schemaRegistryEndpoint, new DefaultAzureCredential()); // Create an Avro object serializer using the Schema Registry client object. var serializer = new SchemaRegistryAvroSerializer(schemaRegistryClient, schemaGroup, new SchemaRegistryAvroSerializerOptions { AutoRegisterSchemas = true }); // Create a new order object using the generated type/class 'Order'. var sampleOrder = new Order { id = "1234", amount = 45.29, description = "First sample order." }; EventData eventData = (EventData)await serializer.SerializeAsync(sampleOrder, messageType: typeof(EventData)); // Create a batch of events using EventDataBatch eventBatch = await producerClient.CreateBatchAsync(); // Add the event data to the event batch. eventBatch.TryAdd(eventData); // Send the batch of events to the event hub. await producerClient.SendAsync(eventBatch); Console.WriteLine("A batch of 1 order has been published.");
Sostituire i valori segnaposto seguenti con i valori reali.
EVENTHUBSNAMESPACECONNECTIONSTRING
- stringa di connessione per lo spazio dei nomi di Hub eventiEVENTHUBNAME
- nome dell'hub eventiEVENTHUBSNAMESPACENAME
- nome dello spazio dei nomi di Hub eventiSCHEMAGROUPNAME
- nome del gruppo di schemi
// connection string to the Event Hubs namespace const string connectionString = "EVENTHUBSNAMESPACECONNECTIONSTRING"; // name of the event hub const string eventHubName = "EVENTHUBNAME"; // Schema Registry endpoint const string schemaRegistryEndpoint = "EVENTHUBSNAMESPACENAME.servicebus.windows.net"; // name of the consumer group const string schemaGroup = "SCHEMAGROUPNAME";
Compilare il progetto e assicurarsi che non siano presenti errori.
Eseguire il programma e attendere il messaggio di conferma.
A batch of 1 order has been published.
Nel portale di Azure è possibile verificare che l'hub eventi abbia ricevuto gli eventi. Passare alla visualizzazione Messaggi nella sezione Metriche. Aggiornare la pagina per aggiornare il grafico. La conferma che i messaggi sono stati ricevuti potrebbe comparire dopo alcuni secondi.
Utilizzare eventi da hub eventi con la convalida dello schema
Questa sezione illustra come scrivere un'applicazione console .NET Core che riceve eventi da un hub eventi e come usare il Registro schemi per deserializzare i dati degli eventi.
Prerequisiti aggiuntivi
- Creare l'account di archiviazione da usare per il processore di eventi.
Creare un'applicazione consumer
- Nella finestra Esplora soluzioni fare clic con il pulsante destro del mouse sulla soluzione EventHubQuickStart, scegliere Aggiunti e selezionare Nuovo progetto.
- Selezionare Applicazione console e selezionare Avanti.
- Immettere OrderConsumer come Nome progetto e selezionare Crea.
- Nella finestra Esplora soluzioni, fare clic con il pulsante destro del mouse su OrderConsumere scegliere Imposta come progetto di avvio.
Aggiungere il pacchetto NuGet di Hub eventi
Scegliere Strumenti>Gestione pacchetti NuGet>Console di Gestione pacchetti dal menu.
Nella finestra Console di gestione pacchetti verificare che OrderConsumer sia selezionato per il progetto predefinito. In caso contrario, utilizzare l'elenco a discesa per selezionare OrderConsumer.
Eseguire il comando seguente per installare i pacchetti NuGet necessari. Premere INVIO per eseguire l'ultimo comando.
Install-Package Azure.Messaging.EventHubs Install-Package Azure.Messaging.EventHubs.Processor Install-Package Azure.Identity Install-Package Microsoft.Azure.Data.SchemaRegistry.ApacheAvro Install-Package Azure.ResourceManager.Compute
Autenticare le applicazioni producer per connettersi ad Azure tramite Visual Studio, come illustrato qui.
Accedere ad Azure utilizzando l'account utente membro del ruolo
Schema Registry Reader
a livello dello spazio dei nomi. Per informazioni sui ruoli del Registro schemi, vedere Registro schemi di Azure in Hub eventi.Aggiungere il file
Order.cs
generato durante la creazione dell'app producer al progetto OrderConsumer.Fare clic con il pulsante destro del mouse sul progetto OrderConsumer e scegliere Imposta come progetto di avvio.
Scrivere codice per ricevere gli eventi e deserializzarli usando il Registro schemi
Aggiungere il codice seguente al file
Program.cs
. Per i dettagli, vedere i commenti nel codice. I passaggi di alto livello nel codice sono:- Creare un client consumer che è possibile usare per inviare eventi a un hub eventi.
- Creare un client contenitore BLOB per il contenitore BLOB nell'archivio BLOB di Azure.
- Creare un client del processore di eventi e registrare gestori eventi ed errori.
- Nel gestore dell’evento creare un client del Registro schemi che è possibile usare per deserializzare i dati degli eventi in un oggetto
Order
. - Deserializzare i dati degli eventi in un oggetto
Order
utilizzando il serializzatore. - Stampare le informazioni sull'ordine ricevuto.
using Azure.Data.SchemaRegistry; using Azure.Identity; using Microsoft.Azure.Data.SchemaRegistry.ApacheAvro; using Azure.Storage.Blobs; using Azure.Messaging.EventHubs; using Azure.Messaging.EventHubs.Consumer; using Azure.Messaging.EventHubs.Processor; using Microsoft.Azure.Data.SchemaRegistry.example; // connection string to the Event Hubs namespace const string connectionString = "EVENTHUBSNAMESPACECONNECTIONSTRING"; // name of the event hub const string eventHubName = "EVENTHUBNAME"; // Schema Registry endpoint const string schemaRegistryEndpoint = "EVENTHUBSNAMESPACENAME.servicebus.windows.net"; // name of the consumer group const string schemaGroup = "SCHEMAGROUPNAME"; // connection string for the Azure Storage account const string blobStorageConnectionString = "AZURESTORAGECONNECTIONSTRING"; // name of the blob container that will be userd as a checkpoint store const string blobContainerName = "BLOBCONTAINERNAME"; // Create a blob container client that the event processor will use BlobContainerClient storageClient = new BlobContainerClient(blobStorageConnectionString, blobContainerName); // Create an event processor client to process events in the event hub EventProcessorClient processor = new EventProcessorClient(storageClient, EventHubConsumerClient.DefaultConsumerGroupName, connectionString, eventHubName); // Register handlers for processing events and handling errors processor.ProcessEventAsync += ProcessEventHandler; processor.ProcessErrorAsync += ProcessErrorHandler; // Start the processing await processor.StartProcessingAsync(); // Wait for 30 seconds for the events to be processed await Task.Delay(TimeSpan.FromSeconds(30)); // Stop the processing await processor.StopProcessingAsync(); static async Task ProcessEventHandler(ProcessEventArgs eventArgs) { // Create a schema registry client that you can use to serialize and validate data. var schemaRegistryClient = new SchemaRegistryClient(schemaRegistryEndpoint, new DefaultAzureCredential()); // Create an Avro object serializer using the Schema Registry client object. var serializer = new SchemaRegistryAvroSerializer(schemaRegistryClient, schemaGroup, new SchemaRegistryAvroSerializerOptions { AutoRegisterSchemas = true }); // Deserialized data in the received event using the schema Order sampleOrder = (Order)await serializer.DeserializeAsync(eventArgs.Data, typeof(Order)); // Print the received event Console.WriteLine($"Received order with ID: {sampleOrder.id}, amount: {sampleOrder.amount}, description: {sampleOrder.description}"); await eventArgs.UpdateCheckpointAsync(eventArgs.CancellationToken); } static Task ProcessErrorHandler(ProcessErrorEventArgs eventArgs) { // Write details about the error to the console window Console.WriteLine($"\tPartition '{eventArgs.PartitionId}': an unhandled exception was encountered. This was not expected to happen."); Console.WriteLine(eventArgs.Exception.Message); return Task.CompletedTask; }
Sostituire i valori segnaposto seguenti con i valori reali.
EVENTHUBSNAMESPACE-CONNECTIONSTRING
- stringa di connessione per lo spazio dei nomi di Hub eventiEVENTHUBNAME
- nome dell'hub eventiEVENTHUBSNAMESPACENAME
- nome dello spazio dei nomi di Hub eventiSCHEMAGROUPNAME
- nome del gruppo di schemiAZURESTORAGECONNECTIONSTRING
- stringa di connessione per l'account di archiviazione di AzureBLOBCONTAINERNAME
- Nome del contenitore BLOB
// connection string to the Event Hubs namespace const string connectionString = "EVENTHUBSNAMESPACE-CONNECTIONSTRING"; // name of the event hub const string eventHubName = "EVENTHUBNAME"; // Schema Registry endpoint const string schemaRegistryEndpoint = "EVENTHUBSNAMESPACENAME.servicebus.windows.net"; // name of the consumer group const string schemaGroup = "SCHEMAGROUPNAME"; // Azure storage connection string const string blobStorageConnectionString = "AZURESTORAGECONNECTIONSTRING"; // Azure blob container name const string blobContainerName = "BLOBCONTAINERNAME";
Compilare il progetto e assicurarsi che non siano presenti errori.
Eseguire l'applicazione ricevente.
Verrà visualizzato un messaggio che informa che gli eventi sono stati ricevuti.
Received order with ID: 1234, amount: 45.29, description: First sample order.
Questi eventi sono i tre eventi inviati in precedenza all'hub eventi eseguendo il programma mittente.
Esempi
Vedere l'articolo Leggimi nel repository GitHub.
Pulire le risorse
Eliminare lo spazio dei nomi di Hub eventi o eliminare il gruppo di risorse che contiene lo spazio dei nomi.
Passaggi successivi
Eseguire il checkout della libreria client del Registro schemi di Azure per .NET