Funktionsflaggor
Dricks
Det här innehållet är ett utdrag från eBook, Architecting Cloud Native .NET Applications for Azure, tillgängligt på .NET Docs eller som en kostnadsfri nedladdningsbar PDF som kan läsas offline.
I kapitel 1 bekräftade vi att molnbaserat handlar mycket om hastighet och flexibilitet. Användarna förväntar sig snabb svarstid, innovativa funktioner och noll stilleståndstid. Feature flags
är en modern distributionsteknik som hjälper till att öka flexibiliteten för molnbaserade program. De gör att du kan distribuera nya funktioner till en produktionsmiljö, men begränsa deras tillgänglighet. Med en knappknapp kan du aktivera en ny funktion för specifika användare utan att starta om appen eller distribuera ny kod. De separerar lanseringen av nya funktioner från deras koddistribution.
Funktionsflaggor bygger på villkorsstyrd logik som styr synligheten för funktioner för användare vid körning. I moderna molnbaserade system är det vanligt att distribuera nya funktioner till produktion tidigt, men testa dem med en begränsad målgrupp. När konfidensen ökar kan funktionen distribueras stegvis till bredare målgrupper.
Andra användningsfall för funktionsflaggor är:
- Begränsa premiumfunktioner till specifika kundgrupper som är villiga att betala högre prenumerationsavgifter.
- Stabilisera ett system genom att snabbt inaktivera en problemfunktion och undvika riskerna med en återställning eller omedelbar snabbkorrigering.
- Inaktivera en valfri funktion med hög resursförbrukning under perioder med hög användning.
- Utför
experimental feature releases
till små användarsegment för att verifiera genomförbarhet och popularitet.
Funktionsflaggor främjar trunk-based
också utveckling. Det är en förgreningsmodell för källkontroll där utvecklare samarbetar om funktioner i en enda gren. Metoden minimerar risken och komplexiteten med att slå samman ett stort antal långvariga funktionsgrenar. Funktionerna är inte tillgängliga förrän de har aktiverats.
Implementera funktionsflaggor
I grunden är en funktionsflagga en referens till en enkel decision object
. Den returnerar ett booleskt tillstånd för on
eller off
. Flaggan omsluter vanligtvis ett kodblock som kapslar in en funktionsfunktion. Flaggans tillstånd avgör om kodblocket körs för en viss användare. Bild 10–11 visar implementeringen.
if (featureFlag) {
// Run this code block if the featureFlag value is true
} else {
// Run this code block if the featureFlag value is false
}
Bild 10–11 – Enkel implementering av funktionsflagga.
Observera hur den här metoden skiljer beslutslogik från funktionskoden.
I kapitel 1 diskuterade Twelve-Factor App
vi . Vägledningen rekommenderar att du håller konfigurationsinställningarna externa från programkörningsbar kod. När det behövs kan inställningarna läsas in från den externa källan. Konfigurationsvärden för funktionsflagga bör också vara oberoende av deras kodbas. Genom att externalisera flaggkonfigurationen på en separat lagringsplats kan du ändra flaggtillståndet utan att ändra och distribuera om programmet.
Azure App Configuration tillhandahåller en central lagringsplats för funktionsflaggor. Med den definierar du olika typer av funktionsflaggor och manipulerar deras tillstånd snabbt och säkert. Du lägger till appkonfigurationsklientbiblioteken i ditt program för att aktivera funktioner för funktionsflagga. Olika programmeringsspråkramverk stöds.
Funktionsflaggor kan enkelt implementeras i en ASP.NET Core-tjänst. Genom att installera .NET-funktionshanteringsbiblioteken och appkonfigurationsprovidern kan du deklarativt lägga till funktionsflaggor i koden. De aktiverar FeatureGate
attribut så att du inte behöver skriva manuellt om -instruktioner i din kodbas.
När du har konfigurerat i startklassen kan du lägga till funktioner för funktionsflagga på kontrollant-, åtgärds- eller mellanprogramsnivå. Bild 10–12 visar kontrollant- och åtgärdsimplementering:
[FeatureGate(MyFeatureFlags.FeatureA)]
public class ProductController : Controller
{
...
}
[FeatureGate(MyFeatureFlags.FeatureA)]
public IActionResult UpdateProductStatus()
{
return ObjectResult(ProductDto);
}
Bild 10–12 – Implementering av funktionsflagga i en kontrollant och åtgärd.
Om en funktionsflagga är inaktiverad får användaren statuskoden 404 (hittades inte) utan svarstext.
Funktionsflaggor kan också matas in direkt i C#-klasser. Bild 10-13 visar funktionsflaggainmatning:
public class ProductController : Controller
{
private readonly IFeatureManager _featureManager;
public ProductController(IFeatureManager featureManager)
{
_featureManager = featureManager;
}
}
Bild 10-13 – Inmatning av funktionsflagga i en klass.
Funktionshanteringsbiblioteken hanterar funktionsflaggans livscykel i bakgrunden. Om du till exempel vill minimera ett stort antal anrop till konfigurationsarkivet kan bibliotekens cachelagrade flagga tillstånd under en angiven varaktighet. De kan garantera att flaggtillstånden inte ändras under ett begärandeanrop. De erbjuder också en Point-in-time snapshot
. Du kan rekonstruera historiken för valfritt nyckelvärde och ange dess tidigare värde när som helst under de senaste sju dagarna.