Esaminare i concetti di configurazione delle app

Completato

La creazione di microservizi per un ambiente distribuito costituisce una sfida importante. I microservizi ospitati nel cloud sono spesso eseguiti in più contenitori in diverse aree. L'implementazione di una soluzione che separa il codice di ogni servizio dalla configurazione facilita la valutazione dei problemi in tutti gli ambienti.

In questa unità verrà illustrato come integrare le funzionalità di configurazione di ASP.NET Core e Docker con Configurazione app di Azure per affrontare questa sfida in modo efficace.

Verranno esaminati gli argomenti seguenti:

  • Infrastruttura di configurazione di ASP.NET Core.
  • Astrazione della configurazione di Kubernetes, ConfigMap.
  • Servizio Configurazione app di Azure.
  • Libreria Gestione funzionalità di .NET.
  • Componenti del flag di funzionalità implementati nell'app.

Configurazione di ASP.NET Core

La configurazione in un progetto ASP.NET Core è contenuta in uno o più provider di configurazione di .NET. Un provider di configurazione è un'astrazione in un'origine di configurazione specifica, ad esempio un file JSON. I valori dell'origine di configurazione sono rappresentati sotto forma di raccolta di coppie chiave-valore.

Un'app ASP.NET Core può registrare più provider di configurazione per leggere le impostazioni di varie origini. Con l'host dell'applicazione predefinito, vengono registrati automaticamente diversi provider di configurazione. Le origini di configurazione seguenti sono disponibili nell'ordine indicato:

  1. File JSON (appsettings.json)
  2. File JSON (appsettings.{environment}.json)
  3. Segreti utente
  4. Variabili di ambiente
  5. Riga di comando

Ogni provider di configurazione può contribuire con il proprio valore di chiave. Qualsiasi provider può anche sostituire un valore di un provider registrato nella catena prima del proprio. Sulla base dell'ordine di registrazione nell'elenco precedente, un parametro della riga di comando UseFeatureManagement sostituisce una variabile di ambiente UseFeatureManagement. Analogamente, una chiave UseFeatureManagement all'interno di appsettings.json può essere sostituita da una chiave UseFeatureManagement archiviata in appsettings.Development.json.

I nomi delle chiavi di configurazione possono descrivere una gerarchia. Ad esempio, la notazione eShop:Store:SeasonalSale fa riferimento alla funzionalità SeasonalSale all'interno del microservizio Store dell’app eShop. Questa struttura può anche eseguire il mapping dei valori di configurazione a un grafico di oggetti o a una matrice.

Importante

Alcune piattaforme non supportano i due punti nei nomi delle variabili di ambiente. Per assicurare la compatibilità multipiattaforma, si usa un doppio carattere di sottolineatura (__) anziché i due punti (:) per delimitare le chiavi. eShop__Store__SeasonalSale è ad esempio la notazione multipiattaforma equivalente di eShop:Store:SeasonalSale.

ASP.NET Core usa una classe ConfigurationBinder per eseguire il mapping dei valori di configurazione a oggetti e matrici. Il mapping ai nomi di chiave non fa distinzione tra maiuscole e minuscole. Ad esempio, ConnectionString e connectionstring vengono considerate chiavi equivalenti. Per altre informazioni, vedere Chiavi e valori.

Configurazione di Docker

In Docker, un'astrazione per gestire la configurazione come raccolta coppie chiave-valore è la sezione della variabile di ambiente del file YAML di un contenitore. Il frammento di codice seguente è un estratto del file docker-compose.yml dell'app:

services: 

  frontend:
    image: storeimage
    build:
      context: .
      dockerfile: DockerfileStore
    environment: 
      - ProductEndpoint=http://backend:8080
      - ConnectionStrings:AppConfig=Endpoint=https://eshop-app-features.azconfig.io;Id=QWQy;Secret=V/4r/rhg/0tdy2L/AmMfBUcgTrYC4krRC7uFqbjRvDU=
    ports:
      - "32000:8080"
    depends_on: 
      - backend

il frammento di file definisce:

  • variabili archiviate nella sezione environment del file YAML, come evidenziato nel frammento precedente.
  • Sono presentate nell'app in contenitori come variabili di ambiente.
  • Un meccanismo principale per salvare in modo permanente i valori di configurazione .NET nelle app di microservizi.

Le variabili di ambiente sono un meccanismo multipiattaforma per fornire la configurazione di runtime alle app ospitate nei contenitori Docker.

Configurazione app di Azure

Un servizio di configurazione centralizzato è particolarmente utile nelle app di microservizi e in altre app distribuite. Questo modulo presenta Configurazione app di Azure, un servizio per la gestione centralizzata dei valori di configurazione, nello specifico per i flag di funzionalità. Il servizio facilita la risoluzione degli errori che si verificano quando la configurazione viene distribuita con un'app.

Configurazione app è un servizio completamente gestito che esegue la crittografia dei valori delle chiavi inattivi e in transito. I valori di configurazione archiviati con il servizio possono essere aggiornati in tempo reale senza dover ridistribuire o riavviare un'app.

In un'app ASP.NET Core app il servizio Configurazione app di Azure è registrato come provider di configurazione. A parte la registrazione del provider, l'app non riconosce l'archivio di Configurazione app. È possibile recuperare i valori di configurazione dal servizio usando l'astrazione della configurazione di .NET, vale a dire l'interfaccia IConfiguration.

Libreria Gestione funzionalità

La libreria Gestione funzionalità offre API .NET standardizzate per la gestione dei flag di funzionalità all'interno delle app. La libreria viene distribuita tramite NuGet sotto forma di due pacchetti diversi denominati Microsoft.FeatureManagement e Microsoft.FeatureManagement.AspNetCore. Questo ultimo pacchetto contiene gli helper tag da usare nei file Razor di un progetto ASP.NET Core. Il primo pacchetto è sufficiente quando gli helper tag non sono necessari o quando non si usano con un progetto ASP.NET Core.

La libreria è compilata su IConfiguration. Per questo motivo, è compatibile con qualsiasi provider di configurazione .NET, incluso il provider per Configurazione app di Azure. Poiché la libreria è disaccoppiata da Configurazione app di Azure, l'integrazione dei due viene resa possibile tramite il provider di configurazione. La combinazione di questa libreria con Configurazione app di Azure consente di disattivare e attivare dinamicamente le funzionalità senza implementare un'infrastruttura di supporto.

Integrazione con Configurazione app di Azure

Per informazioni sull'integrazione di Configurazione app di Azure e della libreria Gestione funzionalità, vedere l'estratto seguente del file Program.cs di un progetto ASP.NET Core:

string connectionString = builder.Configuration.GetConnectionString("AppConfig");

// Load configuration from Azure App Configuration
builder.Configuration.AddAzureAppConfiguration(options => {
  options.Connect(connectionString)
    .UseFeatureFlags();
});

Nel frammento di codice precedente:

  • Il metodo builder.Configuration dell’app viene chiamato per registrare un provider di configurazione per l'archivio di Configurazione app di Azure. Il provider di configurazione viene registrato tramite una chiamata a AddAzureAppConfiguration.
  • Il comportamento del provider di Configurazione app di Azure viene configurato con le opzioni seguenti:
    • Eseguire l'autenticazione al servizio Azure corrispondente tramite una stringa di connessione passata alla chiamata a un metodo Connect. La stringa di connessione viene recuperata dalla variabile connectionString. Le origini di configurazione registrate vengono rese disponibili tramite builder.Configuration.
    • Abilitare il supporto per i flag di funzionalità tramite una chiamata a UseFeatureFlags.
  • Il provider di Configurazione app di Azure sostituisce tutti gli altri provider di configurazione registrati perché viene registrato dopo tutti gli altri.

Suggerimento

In un progetto ASP.NET Core è possibile accedere all'elenco dei provider registrati analizzando la proprietà configBuilder.Sources all'interno di ConfigureAppConfiguration.