Esercitazione: Usare la configurazione dinamica usando l'aggiornamento push in un'app .NET Core
La libreria client Configurazione app .NET Core supporta l'aggiornamento della configurazione su richiesta senza causare il riavvio di un'applicazione. Un'applicazione può essere configurata per rilevare le modifiche in Configurazione app usando uno o entrambi gli approcci seguenti.
Modello di polling: si tratta del comportamento predefinito che usa il polling per rilevare le modifiche nella configurazione. Dopo la scadenza del valore memorizzato nella cache di un'impostazione, la chiamata successiva a
TryRefreshAsync
oRefreshAsync
invia una richiesta al server per verificare se la configurazione è stata modificata e esegue il pull della configurazione aggiornata se necessario.Modello push: viene usato Configurazione app eventi per rilevare le modifiche nella configurazione. Dopo aver configurato Configurazione app per inviare eventi di modifica del valore chiave a Griglia di eventi di Azure, l'applicazione può usare questi eventi per ottimizzare il numero totale di richieste necessarie per mantenere aggiornata la configurazione. Le applicazioni possono scegliere di sottoscrivere direttamente da Griglia di eventi o tramite uno dei gestori eventi supportati , ad esempio un webhook, una funzione di Azure o un argomento del bus di servizio.
Questa esercitazione illustra come implementare gli aggiornamenti dinamici della configurazione nel codice usando l'aggiornamento push. Si basa sull'app introdotta nell'esercitazione. Prima di continuare, completare l'esercitazione: usare la configurazione dinamica in un'app .NET Core prima di tutto.
Per completare i passaggi riportati in questa esercitazione, è possibile usare qualsiasi editor di codice. Visual Studio Code è un'ottima opzione ed è disponibile per le piattaforme Windows, macOS e Linux.
In questa esercitazione verranno illustrate le procedure per:
- Configurare una sottoscrizione per inviare eventi di modifica della configurazione da Configurazione app a un argomento del bus di servizio
- Configurare l'app .NET Core per aggiornarne la configurazione in risposta alle modifiche in Configurazione app.
- Utilizzare la configurazione più recente nell'applicazione.
Prerequisiti
- Esercitazione: Usare la configurazione dinamica in un'app .NET Core
- Pacchetto
Microsoft.Extensions.Configuration.AzureAppConfiguration
NuGet versione 5.0.0 o successiva
Configurare bus di servizio di Azure argomento e sottoscrizione
Questa esercitazione usa l'integrazione del bus di servizio per Griglia di eventi per semplificare il rilevamento delle modifiche di configurazione per le applicazioni che non desiderano eseguire il polling di Configurazione app per le modifiche in modo continuo. L'SDK di bus di servizio di Azure fornisce un'API per registrare un gestore messaggi che può essere usato per aggiornare la configurazione quando vengono rilevate modifiche in Configurazione app. Seguire la procedura descritta nella guida introduttiva: usare il portale di Azure per creare un argomento e una sottoscrizione del bus di servizio per creare uno spazio dei nomi, un argomento e una sottoscrizione del bus di servizio.
Dopo aver creato le risorse, aggiungere le variabili di ambiente seguenti. Questi verranno usati per registrare un gestore eventi per le modifiche alla configurazione nel codice dell'applicazione.
Chiave | Valore |
---|---|
ServiceBusConnectionString | Stringa di connessione per lo spazio dei nomi del bus di servizio |
ServiceBusTopic | Nome dell'argomento del bus di servizio |
ServiceBusSubscription | Nome della sottoscrizione del bus di servizio |
Configurare la sottoscrizione di eventi
Aprire la risorsa Configurazione app nella portale di Azure, quindi fare clic sul
+ Event Subscription
Events
riquadro.Immettere un nome per e
Event Subscription
.System Topic
Selezionare l'oggetto come
Service Bus Topic
, selezionare l'argomentoEndpoint Type
del bus di servizio e quindi fare clic suConfirm Selection
.Fare clic su
Create
per creare la sottoscrizione dell'evento.Event Subscriptions
Fare clic sulEvents
riquadro per verificare che la sottoscrizione sia stata creata correttamente.
Nota
Quando si sottoscrive per le modifiche alla configurazione, è possibile usare uno o più filtri per ridurre il numero di eventi inviati all'applicazione. Questi possono essere configurati come filtri di sottoscrizione griglia di eventi o filtri della sottoscrizionedel bus di servizio. Ad esempio, un filtro di sottoscrizione può essere usato solo per sottoscrivere eventi per le modifiche in una chiave che inizia con una stringa specifica.
Registrare il gestore eventi per ricaricare i dati da Configurazione app
Aprire Program.cs e aggiornare il file con il codice seguente.
using Azure.Messaging.EventGrid;
using Azure.Messaging.ServiceBus;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.AzureAppConfiguration;
using Microsoft.Extensions.Configuration.AzureAppConfiguration.Extensions;
using System;
using System.Threading.Tasks;
namespace TestConsole
{
class Program
{
private const string AppConfigurationConnectionStringEnvVarName = "AppConfigurationConnectionString";
// e.g. Endpoint=https://{store_name}.azconfig.io;Id={id};Secret={secret}
private const string ServiceBusConnectionStringEnvVarName = "ServiceBusConnectionString";
// e.g. Endpoint=sb://{service_bus_name}.servicebus.windows.net/;SharedAccessKeyName={key_name};SharedAccessKey={key}
private const string ServiceBusTopicEnvVarName = "ServiceBusTopic";
private const string ServiceBusSubscriptionEnvVarName = "ServiceBusSubscription";
private static IConfigurationRefresher _refresher = null;
static async Task Main(string[] args)
{
string appConfigurationConnectionString = Environment.GetEnvironmentVariable(AppConfigurationConnectionStringEnvVarName);
IConfiguration configuration = new ConfigurationBuilder()
.AddAzureAppConfiguration(options =>
{
options.Connect(appConfigurationConnectionString);
options.ConfigureRefresh(refresh =>
refresh
.Register("TestApp:Settings:Message")
.SetCacheExpiration(TimeSpan.FromDays(1)) // Important: Reduce poll frequency
);
_refresher = options.GetRefresher();
}).Build();
RegisterRefreshEventHandler();
var message = configuration["TestApp:Settings:Message"];
Console.WriteLine($"Initial value: {configuration["TestApp:Settings:Message"]}");
while (true)
{
await _refresher.TryRefreshAsync();
if (configuration["TestApp:Settings:Message"] != message)
{
Console.WriteLine($"New value: {configuration["TestApp:Settings:Message"]}");
message = configuration["TestApp:Settings:Message"];
}
await Task.Delay(TimeSpan.FromSeconds(1));
}
}
private static void RegisterRefreshEventHandler()
{
string serviceBusConnectionString = Environment.GetEnvironmentVariable(ServiceBusConnectionStringEnvVarName);
string serviceBusTopic = Environment.GetEnvironmentVariable(ServiceBusTopicEnvVarName);
string serviceBusSubscription = Environment.GetEnvironmentVariable(ServiceBusSubscriptionEnvVarName);
ServiceBusClient serviceBusClient = new ServiceBusClient(serviceBusConnectionString);
ServiceBusProcessor serviceBusProcessor = serviceBusClient.CreateProcessor(serviceBusTopic, serviceBusSubscription);
serviceBusProcessor.ProcessMessageAsync += (processMessageEventArgs) =>
{
// Build EventGridEvent from notification message
EventGridEvent eventGridEvent = EventGridEvent.Parse(BinaryData.FromBytes(processMessageEventArgs.Message.Body));
// Create PushNotification from eventGridEvent
eventGridEvent.TryCreatePushNotification(out PushNotification pushNotification);
// Prompt Configuration Refresh based on the PushNotification
_refresher.ProcessPushNotification(pushNotification);
return Task.CompletedTask;
};
serviceBusProcessor.ProcessErrorAsync += (exceptionargs) =>
{
Console.WriteLine($"{exceptionargs.Exception}");
return Task.CompletedTask;
};
}
}
}
Il ProcessPushNotification
metodo reimposta la scadenza della cache in un breve ritardo casuale. In questo modo, le chiamate future a RefreshAsync
o TryRefreshAsync
per convalidare nuovamente i valori memorizzati nella cache in Configurazione app e aggiornarli in base alle esigenze. In questo esempio si registrano le modifiche apportate alla chiave: TestApp:Settings:Message con scadenza della cache di un giorno. Ciò significa che non verrà effettuata alcuna richiesta di Configurazione app prima del passaggio di un giorno dall'ultima verifica. ProcessPushNotification
Chiamando l'applicazione, l'applicazione invierà richieste a Configurazione app nei prossimi secondi. L'applicazione caricherà i nuovi valori di configurazione poco dopo che le modifiche si verificano nell'archivio App Configuration
senza dover eseguire costantemente il polling per gli aggiornamenti. In caso di mancata notifica delle modifiche per qualsiasi motivo, l'applicazione verificherà comunque le modifiche alla configurazione una volta al giorno.
Il ritardo casuale breve per la scadenza della cache è utile se sono presenti molte istanze dell'applicazione o dei microservizi che si connettono allo stesso archivio Configurazione app con il modello push. Senza questo ritardo, tutte le istanze dell'applicazione potrebbero inviare richieste all'archivio Configurazione app simultaneamente non appena ricevono una notifica di modifica. Ciò può causare la limitazione del servizio Configurazione app. Il ritardo della scadenza della cache è impostato su un numero casuale compreso tra 0 e un massimo di 30 secondi per impostazione predefinita, ma è possibile modificare il valore massimo tramite il parametro maxDelay
facoltativo al ProcessPushNotification
metodo.
Il ProcessPushNotification
metodo accetta in un PushNotification
oggetto contenente informazioni sulla modifica in Configurazione app attivato la notfication push. Ciò consente di assicurarsi che tutte le modifiche di configurazione fino all'evento di attivazione vengano caricate nell'aggiornamento della configurazione seguente. Il SetDirty
metodo non gurarante la modifica che attiva la notifica push da caricare in un aggiornamento immediato della configurazione. Se si usa il SetDirty
metodo per il modello push, è consigliabile usare invece il ProcessPushNotification
metodo .
Compilare ed eseguire l'app in locale
Impostare una variabile di ambiente denominata AppConfigurationConnectionString e impostarla sulla chiave di accesso all'archivio Configurazione app.
Per compilare ed eseguire l'app in locale usando il prompt dei comandi di Windows, eseguire il comando seguente e riavviare il prompt dei comandi per consentire l'effetto della modifica:
setx AppConfigurationConnectionString "connection-string-of-your-app-configuration-store"
Eseguire il comando seguente per compilare l'app console:
dotnet build
Al termine della compilazione, eseguire questo comando per eseguire l'app Web in locale:
dotnet run
Accedere al portale di Azure. Selezionare Tutte le risorse e quindi l'istanza di archivio di Configurazione app creata nell'argomento di avvio rapido.
Selezionare Configuration Explorer e aggiornare i valori delle chiavi seguenti:
Chiave Valore TestApp:Settings:Message Dati di Configurazione app di Azure - Aggiornati Attendere 30 secondi per consentire l'elaborazione e la configurazione dell'evento.
Pulire le risorse
Se non si vuole continuare a usare le risorse create in questo articolo, eliminare il gruppo di risorse creato qui per evitare addebiti.
Importante
L'eliminazione di un gruppo di risorse è irreversibile. Il gruppo di risorse e tutte le risorse in esso contenute vengono eliminati in modo permanente. Assicurarsi di non eliminare accidentalmente il gruppo di risorse o le risorse sbagliate. Se le risorse per questo articolo sono state create in un gruppo di risorse che contiene altre risorse che si vogliono mantenere, eliminare ogni risorsa singolarmente dal rispettivo riquadro anziché eliminare il gruppo di risorse.
- Accedere al portale di Azure e selezionare Gruppi di risorse.
- Nella casella Filtra per nome immettere il nome del gruppo di risorse.
- Nell'elenco dei risultati selezionare il nome del gruppo di risorse per visualizzare una panoramica.
- Selezionare Elimina gruppo di risorse.
- Verrà chiesto di confermare l'eliminazione del gruppo di risorse. Immettere il nome del gruppo di risorse per confermare e selezionare Elimina.
Dopo qualche istante, il gruppo di risorse e tutte le risorse che contiene vengono eliminati.
Passaggi successivi
In questa esercitazione è stata abilitata l'app .NET Core per aggiornare in modo dinamico le impostazioni di configurazione di Configurazione app. Per informazioni su come usare un'identità gestita di Azure per semplificare l'accesso a Configurazione app, continuare con l'esercitazione successiva.