È possibile estrarre le informazioni di configurazione dal pacchetto di distribuzione dell'applicazione e spostarle in una posizione centralizzata. In questo modo può essere più facile gestire e controllare i dati di configurazione e si può avere l'opportunità di condividere i dati di configurazione tra applicazioni e istanze dell'applicazione.
Contesto e problema
La maggior parte degli ambienti di runtime delle applicazioni includono informazioni di configurazione contenute in file distribuiti con l'applicazione. In alcuni casi è possibile modificare questi file per cambiare il comportamento dell'applicazione dopo che è stata distribuita. Tuttavia, se si modifica la configurazione sarà necessario ridistribuire l'applicazione e spesso questo causa tempi di inattività inaccettabili e altro sovraccarico amministrativo.
I file di configurazione locale limitano anche la configurazione a una sola applicazione, ma a volte può essere utile condividere le impostazioni di configurazione tra più applicazioni. Alcuni esempi sono le stringhe di connessione del database, le informazioni sui temi dell'interfaccia utente o gli URL delle code e delle risorse di archiviazione usate da un insieme di applicazioni correlate.
È difficile gestire le modifiche apportate alle configurazioni locale tra più istanze in esecuzione dell'applicazione, soprattutto in uno scenario ospitato nel cloud. Di conseguenza, è possibile avere istanze che usano impostazioni di configurazione diverse durante la distribuzione dell'aggiornamento.
Inoltre, gli aggiornamenti di applicazioni e componenti possono richiedere modifiche agli schemi di configurazione. Molti sistemi di configurazione non supportano versioni diverse delle informazioni di configurazione.
Soluzione
Archiviare le informazioni di configurazione in un archivio esterno e rendere disponibile un'interfaccia che consenta di leggere e aggiornare le impostazioni di configurazione in modo rapido ed efficiente. Il tipo di archivio esterno dipende dall'ambiente di hosting e di runtime dell'applicazione. In uno scenario ospitato nel cloud si tratta in genere di un servizio di archiviazione basato sul cloud o di un servizio di configurazione dedicato, ma può essere un database ospitato o un altro sistema personalizzato.
L'archivio di backup che si sceglie per le informazioni di configurazione deve avere un'interfaccia con accesso semplice e coerente. Le informazioni devono essere esposte in un formato correttamente tipizzato e strutturato. L'implementazione potrebbe anche dover autorizzare l'accesso degli utenti per proteggere i dati di configurazione e essere sufficientemente flessibile per consentire l'archiviazione di più versioni della configurazione ( ad esempio sviluppo, gestione temporanea o produzione, incluse più versioni di rilascio di ognuna).
Molti sistemi di configurazione predefiniti leggono i dati all'avvio dell'applicazione e memorizzano i dati nella cache per consentire un accesso rapido e ridurre al minimo l'impatto sulle prestazioni dell'applicazione. In base al tipo di archivio di backup in uso e alla latenza di tale archivio, potrebbe essere utile implementare un meccanismo di memorizzazione nella cache all'interno dell'archivio di configurazione esterno. Per altre informazioni, vedere le indicazioni sulla memorizzazione nella cache. La figura illustra una panoramica del modello di archivio di configurazione esterno con cache locale facoltativa.
Considerazioni e problemi
Prima di decidere come implementare questo modello, considerare quanto segue:
Scegliere un archivio di backup che offre prestazioni accettabili, elevata disponibilità, affidabilità e di cui si può eseguire il backup come parte del processo di manutenzione e amministrazione dell'applicazione. In un'applicazione ospitata nel cloud, l'uso di un meccanismo di archiviazione cloud o di un servizio di piattaforma di configurazione dedicato è in genere una scelta ottimale per soddisfare questi requisiti.
Progettare lo schema dell'archivio di backup per garantire la flessibilità nei tipi di informazioni che può contenere. Verificare che soddisfi tutti i requisiti di configurazione, ad esempio dati tipizzati, raccolte di impostazioni, più versioni delle impostazioni e altre funzionalità richieste dalle applicazioni che lo usano. Lo schema deve essere facile da estendere per supportare impostazioni aggiuntive quando cambiano i requisiti.
Considerare le funzionalità fisiche dell'archivio di backup, la sua relazione con la modalità di archiviazione delle informazioni di configurazione e l'impatto sulle prestazioni. Ad esempio, l'archiviazione di un documento XML contenente informazioni di configurazione richiederà che l'interfaccia di configurazione o l'applicazione analizzi il documento in modo da leggere le singole impostazioni. In questo modo aggiornare un'impostazione diventerà più complicato, anche se memorizzare nella cache le impostazioni può compensare il rallentamento delle prestazioni di lettura.
Considerare il modo in cui l'interfaccia di configurazione consente il controllo dell'ambito e dell'ereditarietà delle impostazioni di configurazione. Ad esempio, potrebbe essere un requisito esaminare le impostazioni di configurazione a livello di organizzazione, applicazione e computer. L'operazione può essere necessaria per supportare la delega del controllo dell'accesso a diversi ambiti e per impedire o consentire alle singole applicazioni di ignorare le impostazioni.
Verificare che l'interfaccia di configurazione sia in grado di esporre i dati di configurazione nei formati richiesti, ad esempio valori tipizzati, raccolte, coppie chiave/valore o contenitori di proprietà.
Prendere in considerazione il comportamento dell'interfaccia dell'archivio di configurazione quando le impostazioni di contengono errori o non esistono nell'archivio di backup. Può essere appropriato restituire le impostazioni predefinite e registrare gli errori. Considerare anche aspetti come la distinzione tra maiuscole e minuscole per le chiavi o i nomi delle impostazioni di configurazione, l'archiviazione e la gestione dei dati binari e i modi in cui vengono gestiti i valori null o vuoti.
È necessario proteggere i dati di configurazione per consentire l'accesso solo alle applicazioni e agli utenti appropriati. Si tratta probabilmente di una funzionalità dell'interfaccia dell'archivio di configurazione, ma è anche necessario assicurarsi che non sia possibile accedere ai dati contenuti nell'archivio di backup senza l'autorizzazione appropriata. Verificare che esista una separazione rigorosa tra le autorizzazioni necessarie per leggere e scrivere i dati di configurazione. Considerare anche la necessità di crittografare alcune o tutte le impostazioni di configurazione e le relative modalità di implementazione nell'interfaccia dell'archivio di configurazione.
Le configurazioni archiviate centralmente, che modificano il comportamento dell'applicazione in fase di esecuzione, sono estremamente importanti e devono essere distribuite, aggiornate e gestite con gli stessi meccanismi usati per la distribuzione di codice dell'applicazione. Ad esempio, le modifiche che possono interessare più di un'applicazione devono essere apportate usando un approccio con test completi e distribuzione a fasi per garantire che le modifiche siano appropriate per tutte le applicazioni che usano questa configurazione. Se un amministratore modifica un'impostazione per aggiornare una sola applicazione, ciò potrebbe influire negativamente sulle altre applicazioni che usano la stessa impostazione.
Se un'applicazione memorizza nella cache le informazioni di configurazione, l'applicazione deve ricevere un avviso se la configurazione viene modificata. Può essere possibile implementare un criterio di scadenza sui dati di configurazione memorizzati nella cache in modo che periodicamente queste informazioni vengano automaticamente aggiornate e le eventuali modifiche vengano selezionate e gestite.
Anche se la memorizzazione nella cache dei dati di configurazione può aiutare a risolvere i problemi di connettività temporanei con l'archivio di configurazione esterno in fase di esecuzione dell'applicazione, in genere non risolve il problema se l'archivio esterno è inattivo quando l'applicazione viene avviata per la prima volta. Assicurarsi che la pipeline di distribuzione dell'applicazione possa fornire l'ultimo set noto di valori di configurazione in un file di configurazione come fallback se l'applicazione non riesce a recuperare i valori in tempo reale all'avvio.
Quando usare questo modello
Questo modello è utile per:
Impostazioni di configurazione che vengono condivise tra più applicazioni e istanze dell'applicazione o quando è necessario usare una configurazione standard in più applicazioni e istanze dell'applicazione.
Un sistema di configurazione standard che non supporta tutte le impostazioni di configurazione necessarie, ad esempio l'archiviazione di immagini o tipi di dati complessi.
Come archivio complementare per alcune delle impostazioni per le applicazioni, per consentire ad esempio alle applicazioni di ignorare alcune o tutte le impostazioni archiviate centralmente.
Come un modo per semplificare l'amministrazione di più applicazioni e, facoltativamente, monitorare l'uso delle impostazioni di configurazione registrando alcuni o tutti i tipi di accesso all'archivio di configurazione.
Progettazione del carico di lavoro
Un architetto deve valutare il modo in cui il modello di archivio di configurazione esterna può essere usato nella progettazione del carico di lavoro per soddisfare gli obiettivi e i principi trattati nei pilastri di Azure Well-Architected Framework. Ad esempio:
Concetto fondamentale | Come questo modello supporta gli obiettivi di pilastro |
---|---|
L'eccellenza operativa consente di offrire la qualità del carico di lavoro attraverso processi standardizzati e coesione del team. | Questa separazione della configurazione dell'applicazione dal codice dell'applicazione supporta la configurazione specifica dell'ambiente e applica il controllo delle versioni ai valori di configurazione. Gli archivi di configurazione esterni sono anche un luogo comune per gestire i flag di funzionalità per abilitare procedure di distribuzione sicure. - Progettazione di Automazione di OE:10 - Procedure di distribuzione sicura di OE:11 |
Come per qualsiasi decisione di progettazione, prendere in considerazione eventuali compromessi rispetto agli obiettivi degli altri pilastri che potrebbero essere introdotti con questo modello.
Esempio di archivio di backup personalizzato
In un'applicazione ospitata in Microsoft Azure, una possibile scelta per archiviare le informazioni di configurazione esternamente consiste nell'usare Archiviazione di Azure. Si tratta di una soluzione flessibile, che offre prestazioni elevate e viene replicata tre volte con failover automatico per assicurare una disponibilità elevata. Tabella di Azure offre un archivio di chiavi/valori con la possibilità di usare uno schema flessibile per i valori. L'archiviazione BLOB di Azure offre un archivio gerarchico basato su contenitore in grado di contenere qualsiasi tipo di dati in BLOB denominati singolarmente.
Quando si implementa questo modello, si sarebbe responsabili dell'astrazione dell'archiviazione BLOB di Azure e dell'esposizione delle impostazioni all'interno delle applicazioni, incluso il controllo degli aggiornamenti in fase di esecuzione e l'indirizzamento a come rispondere a tali elementi.
L'esempio seguente mostra come potrebbe essere previsto un archivio di configurazione semplicistico sull'archiviazione BLOB per archiviare ed esporre le informazioni di configurazione. Una BlobSettingsStore
classe può astrarre l'archiviazione BLOB per contenere le informazioni di configurazione e implementa un'interfaccia semplice ISettingsStore
.
public interface ISettingsStore
{
Task<ETag> GetVersionAsync();
Task<Dictionary<string, string>> FindAllAsync();
}
Questa interfaccia definisce i metodi per recuperare le impostazioni di configurazione contenute nell'archivio di configurazione e include un numero di versione che può essere usato per rilevare se le impostazioni di configurazione sono state modificate di recente. Una BlobSettingsStore
classe può usare la ETag
proprietà del BLOB per implementare il controllo delle versioni. La ETag
proprietà viene aggiornata automaticamente ogni volta che viene scritto un BLOB.
Per impostazione predefinita, questa semplice illustrazione espone tutte le impostazioni di configurazione come valori stringa anziché valori tipizzati.
Una ExternalConfigurationManager
classe potrebbe quindi fornire un wrapper intorno a un'istanza BlobSettingsStore
di . Un'applicazione può usare questa classe per recuperare le informazioni di configurazione. Questa classe potrebbe usare qualcosa come Microsoft Reactive Extensions per pubblicare le modifiche apportate alla configurazione mentre il sistema è in esecuzione. Sarebbe anche responsabile dell'implementazione del modello Cache-Aside per le impostazioni per fornire resilienza e prestazioni aggiuntive.
L'utilizzo potrebbe essere simile al seguente.
static void Main(string[] args)
{
// Start monitoring configuration changes.
ExternalConfiguration.Instance.StartMonitor();
// Get a setting.
var setting = ExternalConfiguration.Instance.GetAppSetting("someSettingKey");
…
}
Uso della configurazione di app Azure
Durante la compilazione di un archivio di configurazione personalizzato potrebbe essere necessario in alcune situazioni, molte applicazioni possono invece usare app Azure Configurazione. app Azure Configurazione supporta coppie chiave-valore che possono essere spazi dei nomi. Le chiavi vengono tipate e sono singolarmente con controllo delle versioni. app Azure Configurazione supporta anche snapshot temporizzato della configurazione in modo che sia possibile esaminare o persino eseguire il rollback ai valori di configurazione precedenti. I valori di configurazione possono essere esportati in modo che una copia della configurazione possa essere spedita con l'applicazione nel caso in cui il servizio non sia raggiungibile all'avvio dell'applicazione.
Librerie client
Molte di queste funzionalità vengono esposte tramite librerie client che si integrano con il runtime dell'applicazione per facilitare il recupero e la memorizzazione nella cache dei valori, l'aggiornamento dei valori alla modifica e anche la gestione di interruzioni temporanee del servizio Configurazione app.
esecuzione | Libreria client | Note | Guida introduttiva |
---|---|---|---|
.NET | Microsoft.Extensions.Configuration.AzureAppConfiguration | Provider per Microsoft.Extensions.Configuration |
Guida introduttiva |
ASP.NET | Microsoft.Azure.AppConfiguration.AspNetCore | Provider per Microsoft.Extensions.Configuration |
Guida introduttiva |
Funzioni di Azure in .NET | Microsoft.Extensions.Configuration.AzureAppConfiguration | Usato con le estensioni della funzione di Azure per supportare la configurazione in Startup.cs | Guida introduttiva |
.NET Framework | Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration | Generatore di configurazione per System.Configuration |
Guida introduttiva |
Java Spring | com.azure.spring > azure-spring-cloud-appconfiguration-config | Supporta l'accesso a Spring Framework tramite ConfigurationProperties |
Guida introduttiva |
Python | azure.appconfiguration | Fornisce un oggetto AzureAppConfigurationClient |
Guida introduttiva |
JavaScript/Node.js | @azure/configurazione app | Fornisce un oggetto AppConfigurationClient |
Guida introduttiva |
Oltre alle librerie client, sono disponibili anche un app Azure Configuration Sync GitHub Action e app Azure Configuration Pull & app Azure Configuration Push Azure DevOps tasks per integrare i passaggi di configurazione nel processo di compilazione.
Passaggi successivi
- Vedere altri esempi di Configurazione app
- Informazioni su come integrare app Azure Configuration con le distribuzioni kubernetes
- Informazioni su come app Azure Configurazione può anche aiutare a gestire i flag di funzionalità