Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Suggerimento
Questo contenuto è un estratto dell'eBook Architecting Cloud Native .NET Applications for Azure, disponibile in .NET Docs o come PDF scaricabile gratuito che può essere letto offline.
Nel capitolo 1 è stato affermato che il cloud nativo è molto relativo alla velocità e all'agilità. Gli utenti si aspettano tempi di risposta rapidi, funzionalità innovative e tempi di inattività zero.
Feature flags
sono una tecnica di distribuzione moderna che consente di aumentare l'agilità per le applicazioni native del cloud. Consentono di distribuire nuove funzionalità in un ambiente di produzione, ma limitarne la disponibilità. Con il tocco di un commutatore, è possibile attivare una nuova funzionalità per utenti specifici senza riavviare l'app o distribuire nuovo codice. Separano il rilascio delle nuove funzionalità dalla distribuzione del codice.
I flag di funzionalità sono basati sulla logica condizionale che controlla la visibilità delle funzionalità per gli utenti in fase di esecuzione. Nei sistemi moderni nativi del cloud, è comune distribuire nuove funzionalità nell'ambiente di produzione in anticipo, ma testarle con un gruppo di destinatari limitato. Con l'aumentare dell'attendibilità, la funzionalità può essere implementata in modo incrementale a gruppi di destinatari più ampi.
Altri casi d'uso per i flag di funzionalità includono:
- Limitare la funzionalità Premium a specifici gruppi di clienti disposti a pagare tariffe di sottoscrizione più elevate.
- Stabilizzare un sistema disattivando rapidamente una funzionalità di problema, evitando i rischi di un rollback o di un hotfix immediato.
- Disabilitare una funzionalità facoltativa con un utilizzo elevato delle risorse durante i periodi di utilizzo di picco.
- Condurre
experimental feature releases
a segmenti di utenti di piccole dimensioni per convalidare la fattibilità e la popolarità.
Anche i flag di funzionalità promuovono trunk-based
lo sviluppo. Si tratta di un modello di diramazione del controllo del codice sorgente in cui gli sviluppatori collaborano alle funzionalità in un singolo ramo. L'approccio riduce il rischio e la complessità al minimo nell'unione di un numero elevato di rami di funzionalità in esecuzione da lungo tempo. Le funzionalità non sono disponibili fino all'attivazione.
Implementazione di flag delle funzionalità
Al suo centro, un flag di funzionalità è un riferimento a un semplice decision object
. Restituisce uno stato booleano di on
o off
. Il flag normalmente avvolge un blocco di codice che incapsula una funzionalità. Lo stato del flag determina se il blocco di codice viene eseguito per un determinato utente. La figura 10-11 mostra l'implementazione.
if (featureFlag) {
// Run this code block if the featureFlag value is true
} else {
// Run this code block if the featureFlag value is false
}
Figura 10-11 - Implementazione del feature flag semplice.
Si noti che questo approccio separa la logica decisionale dal codice della funzionalità.
Nel capitolo 1 si è discusso di Twelve-Factor App
. Le indicazioni consigliate consentono di mantenere le impostazioni di configurazione esterne dal codice eseguibile dell'applicazione. Quando necessario, le impostazioni possono essere lette dall'origine esterna. I valori di configurazione dei flag di funzionalità devono anche essere indipendenti dalla codebase. Esternalizzando la configurazione dei flag in un repository separato, è possibile modificare lo stato del flag senza modificare e ridistribuire l'applicazione.
Configurazione app di Azure fornisce un repository centralizzato per i flag di funzionalità. Con esso, si definiscono diversi tipi di flag di funzionalità e si modificano i relativi stati in modo rapido e sicuro. Aggiungi le librerie client di configurazione dell'app alla tua applicazione per abilitare la funzionalità dei flag delle caratteristiche. Sono supportati vari framework del linguaggio di programmazione.
I flag di funzionalità possono essere facilmente implementati in un servizio ASP.NET Core. L'installazione delle librerie di Gestione funzionalità .NET e del provider di Configurazione app consente di aggiungere in modo dichiarativo flag di funzionalità al codice.
FeatureGate
Abilitano gli attributi in modo che non sia necessario scrivere manualmente istruzioni if nella codebase.
Dopo aver configurata la classe Startup, è possibile aggiungere funzioni di controllo delle funzionalità sia a livello di controller, sia a livello di azione o middleware. La figura 10-12 presenta l'implementazione del controller e dell'azione:
[FeatureGate(MyFeatureFlags.FeatureA)]
public class ProductController : Controller
{
...
}
[FeatureGate(MyFeatureFlags.FeatureA)]
public IActionResult UpdateProductStatus()
{
return ObjectResult(ProductDto);
}
Figura 10-12 - Implementazione del feature flag in un controller e in un'azione.
Se un flag di funzionalità è disabilitato, l'utente riceverà un codice di stato 404 (Non trovato) senza corpo della risposta.
I flag di funzionalità possono anche essere inseriti direttamente nelle classi C#. La figura 10-13 mostra l'inserimento di flag di funzionalità:
public class ProductController : Controller
{
private readonly IFeatureManager _featureManager;
public ProductController(IFeatureManager featureManager)
{
_featureManager = featureManager;
}
}
Figura 10-13 - Inserimento dei feature flag all'interno di una classe.
Le librerie di Gestione funzionalità gestiscono il ciclo di vita dei flag di funzionalità in background. Ad esempio, per minimizzare l'elevato numero di chiamate all'archivio di configurazione, le librerie memorizzano nella cache gli stati dei flag per una durata specificata. Possono garantire l'immutabilità degli stati di flag durante una chiamata di richiesta. Offrono anche un Point-in-time snapshot
. È possibile ricostruire la cronologia di qualsiasi valore chiave e specificare il valore passato in qualsiasi momento entro i sette giorni precedenti.