.NET-szolgáltatáskezelés
A .NET szolgáltatásfelügyeleti kódtára lehetővé teszi az alkalmazásfunkciók funkciójelzők alapján történő fejlesztését és elérhetővé cióját. Egy új funkció fejlesztése után számos alkalmazás speciális követelményekkel rendelkezik, például mikor és milyen feltételek mellett kell engedélyezni a funkciót. Ez a kódtár lehetővé teszi ezeknek a kapcsolatoknak a meghatározását, valamint a közös .NET-kódmintákba való integrálást, hogy lehetővé tegye ezeknek a funkcióknak a feltárást.
A funkciójelzők lehetővé teszik, hogy a .NET és ASP.NET Core-alkalmazások dinamikusan kapcsolják be vagy ki a funkciókat. A fejlesztők olyan egyszerű használati esetekben is használhatnak funkciójelzőket, mint például feltételes utasítások a speciálisabb forgatókönyvekhez, például útvonalak feltételes hozzáadásához vagy MVC-szűrőkhöz. A funkciójelzők a .NET Core konfigurációs rendszerére épülnek. Bármely .NET Core-konfigurációszolgáltató képes a funkciójelzők gerinceként viselkedni.
A .NET szolgáltatásfelügyeleti kódtár használatának néhány előnye:
A funkciókezelés általános konvenciója
Alacsony belépési korlát
- Beépített
IConfiguration
- Támogatja a JSON-fájlfunkció-jelző beállítását
- Beépített
Funkciójelölő élettartamának kezelése
- A konfigurációs értékek valós időben változhatnak; A funkciójelzők a teljes kérelemben konzisztensek lehetnek
Az egyszerű és összetett forgatókönyvek lefedve
- Szolgáltatások be- és kikapcsolása deklaratív konfigurációs fájlon keresztül
- A szolgáltatás állapotának dinamikus kiértékelése a kiszolgáló hívása alapján
API-bővítmények ASP.NET Core- és MVC-keretrendszerhez
- Útválasztás
- Szűrők
- Műveletattribútumok
A .NET szolgáltatásfelügyeleti kódtára nyílt forráskód. További információkért látogasson el a GitHub-adattárba.
Funkciójelzők
A funkciójelzők két részből állnak, egy névből és a funkció bekapcsolásához használt funkciószűrők listájából.
Funkciószűrők
A funkciószűrők meghatároznak egy forgatókönyvet, amikor engedélyezni kell egy funkciót. Ha a rendszer kiértékel egy funkciót, hogy be- vagy kikapcsolt állapotban van-e, a szolgáltatásszűrők listája mindaddig bejáródik, amíg az egyik szűrő el nem dönti, hogy engedélyezni kell-e a funkciót. Ezen a ponton a szolgáltatás engedélyezve van, és a funkciószűrők leállnak. Ha nincs funkciószűrő, amely azt jelzi, hogy engedélyezni kell a funkciót, akkor az le van tiltva.
Ilyen például egy Microsoft Edge böngészőfunkció-szűrő. Ez a funkciószűrő aktiválja azokat a funkciókat, amelyekhez csatolva van, amíg a Microsoft Edge-ből http-kérés érkezik.
Funkciójelző konfigurálása
A .NET Core konfigurációs rendszer a funkciójelzők állapotának meghatározására szolgál. Ennek a rendszernek az alapja .IConfiguration
Bármely szolgáltató IConfiguration
használható a funkciójelző-kódtár szolgáltatásállapot-szolgáltatójaként. Ez a rendszer appsettings.json és Azure-alkalmazás konfigurációs forgatókönyveket tesz lehetővé.
Funkciójelző deklarációja
A szolgáltatásfelügyeleti kódtár támogatja a appsettings.json funkciójelző forrásként, mivel a .NET Core rendszerszolgáltatója IConfiguration
. Az alábbiakban egy példa látható arra a formátumra, amellyel egy json-fájlban beállíthat funkciójelzőket.
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
// Define feature flags in a json file
"FeatureManagement": {
"FeatureT": {
"EnabledFor": [
{
"Name": "AlwaysOn"
}
]
},
"FeatureU": {
"EnabledFor": []
},
"FeatureV": {
"EnabledFor": [
{
"Name": "TimeWindow",
"Parameters": {
"Start": "Wed, 01 May 2019 13:59:59 GMT",
"End": "Mon, 01 Jul 2019 00:00:00 GMT"
}
}
]
}
}
}
A FeatureManagement
json-dokumentum szakaszát a konvenciók a funkciójelző beállításainak betöltésére használják. A fenti szakaszban három különböző funkciót láthatunk. A funkciók a tulajdonság használatával határozzák meg a EnabledFor
funkciószűrőket. A funkciószűrőkben FeatureT
a következő látható AlwaysOn
: . Ez a funkciószűrő beépített, és ha meg van adva, mindig engedélyezi a funkciót. A AlwaysOn
funkciószűrő nem igényel konfigurációt, ezért csak a tulajdonsága Name
van. FeatureU
nem rendelkezik szűrőkkel a EnabledFor
tulajdonságában, így soha nem lesz engedélyezve. A funkció engedélyezésére támaszkodó funkciók nem lesznek elérhetők mindaddig, amíg a funkciószűrők üresek maradnak. Amint azonban hozzáadunk egy olyan funkciószűrőt, amely lehetővé teszi a funkció működését. FeatureV
a nevű szolgáltatásszűrőt TimeWindow
adja meg. Ez egy konfigurálható funkciószűrő példája. A példában láthatjuk, hogy a szűrő rendelkezik tulajdonságával Parameters
. Ez a szűrő konfigurálására szolgál. Ebben az esetben a szolgáltatás aktiválásának kezdő és befejező időpontjai konfigurálva vannak.
A szakasz részletes sémája FeatureManagement
itt található.
Speciális: A ":" kettőspont használata tiltott a funkciójelzők neveiben.
Be- és kikapcsolási deklaráció
Az alábbi kódrészlet egy alternatív módszert mutat be a be- és kikapcsolható funkciókhoz használható funkciók definiálására.
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
// Define feature flags in config file
"FeatureManagement": {
"FeatureT": true, // On feature
"FeatureX": false // Off feature
}
}
RequirementType
A RequirementType
funkciójelölő tulajdonsága határozza meg, hogy a szűrőknek használniuk Any
kell-e vagy All
logikát a funkció állapotának kiértékelésekor. Ha RequirementType
nincs megadva, az alapértelmezett érték a következő Any
.
Any
azt jelenti, hogy csak egy szűrőnek kell igaznak lennie ahhoz, hogy a funkció engedélyezve legyen.All
azt jelenti, hogy minden szűrőnek igaznak kell lennie ahhoz, hogy a funkció engedélyezve legyen.
A RequirementType
bejárás All
módosítása. Először is, ha nincsenek szűrők, a funkció le van tiltva. Ezután a szolgáltatásszűrők mindaddig bejáródnak, amíg az egyik szűrő úgy nem dönt, hogy le kell tiltani a funkciót. Ha nincs szűrő, amely azt jelzi, hogy a funkciót le kell tiltani, az engedélyezettnek minősül.
"FeatureW": {
"RequirementType": "All",
"EnabledFor": [
{
"Name": "TimeWindow",
"Parameters": {
"Start": "Mon, 01 May 2023 13:59:59 GMT",
"End": "Sat, 01 Jul 2023 00:00:00 GMT"
}
},
{
"Name": "Percentage",
"Parameters": {
"Value": "50"
}
}
]
}
A fenti példában egy értéket ad megAll
RequirementType
, ami azt jelenti, FeatureW
hogy az összes szűrőjének igaznak kell lennie ahhoz, hogy a funkció engedélyezve legyen. Ebben az esetben a funkció a felhasználók 50%-a számára engedélyezve van a megadott időkeretben.
Microsoft Szolgáltatáskezelési séma
A szolgáltatásfelügyeleti kódtár a funkciójelzők deklarálásához is támogatja a Microsoft Feature Management schema
használatát. Ez a séma nyelvi agnosztikus eredetű, és minden Microsoft-szolgáltatásfelügyeleti kódtár támogatja.
{
"feature_management": {
"feature_flags": [
{
"id": "FeatureT",
"enabled": true,
"conditions": {
"client_filters": [
{
"name": "Microsoft.TimeWindow",
"parameters": {
"Start": "Mon, 01 May 2023 13:59:59 GMT",
"End": "Sat, 01 Jul 2023 00:00:00 GMT"
}
}
]
}
}
]
}
}
Feljegyzés
Ha a feature_management
szakasz megtalálható a konfigurációban, a FeatureManagement
szakasz figyelmen kívül lesz hagyva.
A szolgáltatásfelügyeleti kódtár támogatja a appsettings.json funkciójelző forrásként, mivel a .NET Core rendszerszolgáltatója IConfiguration
. A funkciójelzők deklarálása a Microsoft Feature Management schema
. Ez a séma nyelvi agnosztikus eredetű, és minden Microsoft-szolgáltatásfelügyeleti kódtár támogatja.
Az alábbiakban egy json-fájlban található funkciójelzők deklarálására mutatunk példát.
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
// Define feature flags in a json file
"feature_management": {
"feature_flags": [
{
"id": "FeatureT",
"enabled": false
},
{
"id": "FeatureU",
"enabled": true,
"conditions": {}
},
{
"id": "FeatureV",
"enabled": true,
"conditions": {
"client_filters": [
{
"name": "Microsoft.TimeWindow",
"parameters": {
"Start": "Mon, 01 May 2023 13:59:59 GMT",
"End": "Sat, 01 July 2023 00:00:00 GMT"
}
}
]
}
}
]
}
}
A feature_management
json-dokumentum szakaszát a konvenciók a funkciójelző beállításainak betöltésére használják. A funkciójelző objektumokat a feature_flags
szakasz alatti feature_management
tömbben kell listázni. A fenti szakaszban láthatjuk, hogy három különböző funkciót biztosítottunk. Egy funkciójelölő rendelkezik és enabled
tulajdonságokat tartalmazid
. A id
funkciójelző azonosításához és hivatkozásához használt név. A enabled
tulajdonság a funkciójelző engedélyezett állapotát adja meg. A funkció ki van kapcsolva , ha enabled
hamis. Ha enabled
igaz, akkor a funkció állapota a conditions
. Ha nincs conditions
, akkor a funkció be van kapcsolva. Ha vannak conditions
, és teljesülnek, akkor a funkció be van kapcsolva. Ha vannak conditions
, és nem teljesülnek, akkor a funkció ki van kapcsolva. A conditions
tulajdonság deklarálja a funkció dinamikus engedélyezéséhez használt feltételeket. A funkciók meghatározzák a funkciószűrőket a client_filters
tömbben. FeatureV
a nevű szolgáltatásszűrőt Microsoft.TimeWindow
adja meg. Ez egy konfigurálható funkciószűrő példája. A példában láthatjuk, hogy a szűrő rendelkezik tulajdonságával Parameters
. Ez a szűrő konfigurálására szolgál. Ebben az esetben a szolgáltatás aktiválásának kezdő és befejező időpontjai konfigurálva vannak.
Speciális: A ":" kettőspont használata tiltott a funkciójelzők neveiben.
RequirementType
A requirement_type
tulajdonság azt conditions
határozza meg, hogy a szűrők használnak-e Any
vagy All
logikát a funkció állapotának kiértékelésekor. Ha requirement_type
nincs megadva, az alapértelmezett érték a következő Any
.
Any
azt jelenti, hogy csak egy szűrőnek kell igaznak lennie ahhoz, hogy a funkció engedélyezve legyen.All
azt jelenti, hogy minden szűrőnek igaznak kell lennie ahhoz, hogy a funkció engedélyezve legyen.
A requirement_type
bejárás All
módosítása. Először is, ha nincs szűrő, a funkció le lesz tiltva. Ha vannak szűrők, akkor a funkciószűrők mindaddig bejáródnak, amíg az egyik szűrő úgy nem dönt, hogy le kell tiltani a funkciót. Ha nincs szűrő, amely azt jelzi, hogy a funkciót le kell tiltani, akkor az engedélyezve lesz.
{
"id": "FeatureW",
"enabled": true,
"conditions": {
"requirement_type": "All",
"client_filters": [
{
"name": "Microsoft.TimeWindow",
"parameters": {
"Start": "Mon, 01 May 2023 13:59:59 GMT",
"End": "Sat, 01 Jul 2023 00:00:00 GMT"
}
},
{
"name": "Microsoft.Percentage",
"parameters": {
"Value": "50"
}
}
]
}
}
A fenti példában egy értéket ad megAll
requirement_type
, ami azt jelenti, FeatureW
hogy az összes szűrőjének igaznak kell lennie ahhoz, hogy a funkció engedélyezve legyen. Ebben az esetben a funkció a felhasználók 50%-a számára lesz engedélyezve a megadott időkeretben.
.NET szolgáltatáskezelési séma
A korábbi verziókban a szolgáltatásfelügyeleti kódtár elsődleges sémája a .NET feature management schema
. A 4.0.0-s verziótól kezdődően a .NET szolgáltatáskezelési sémája nem támogatja az új funkciókat, köztük a változatokat és a telemetriát.
Feljegyzés
Ha a konfigurációban megtalálható egy funkciójelölő Microsoft Feature Management schema
, a rendszer figyelmen kívül hagyja a vele .NET feature management schema
írt funkciójelzőt.
Felhasználás
A funkciókezelés alapszintű formája annak ellenőrzése, hogy engedélyezve van-e a funkciójelző, majd az eredmény alapján hajt végre műveleteket. Ez a IFeatureManager
módszeren IsEnabledAsync
keresztül történik.
…
IFeatureManager featureManager;
…
if (await featureManager.IsEnabledAsync("FeatureX"))
{
// Do something
}
Szolgáltatásregisztráció
A funkciókezelés a .NET Core-függőséginjektáláson alapul. A szolgáltatásfelügyeleti szolgáltatásokat standard konvenciók használatával regisztrálhatjuk.
using Microsoft.FeatureManagement;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddFeatureManagement();
}
}
Alapértelmezés szerint a szolgáltatáskezelő lekéri a funkciójelző konfigurációját a .NET Core konfigurációs adatainak "FeatureManagement" szakaszából. Ha a "FeatureManagement" szakasz nem létezik, a konfiguráció üresnek minősül.
Feljegyzés
Azt is megadhatja, hogy a szolgáltatásjelző konfigurációját egy másik konfigurációs szakaszból kell lekérni AddFeatureManagement
a szakasz átadásával. Az alábbi példa arra utasítja a szolgáltatáskezelőt, hogy inkább olvassa fel a "MyFeatureFlags" nevű másik szakaszt:
services.AddFeatureManagement(configuration.GetSection("MyFeatureFlags"));
Függőséginjektálás
Ha a szolgáltatásfelügyeleti kódtárat MVC-vel használja, az IFeatureManager
függőséginjektálással szerezhető be.
public class HomeController : Controller
{
private readonly IFeatureManager _featureManager;
public HomeController(IFeatureManager featureManager)
{
_featureManager = featureManager;
}
}
Hatókörön belüli szolgáltatásfelügyeleti szolgáltatások
A AddFeatureManagement
metódus az alkalmazáson belül egyetlen egységként adja hozzá a szolgáltatásfelügyeleti szolgáltatásokat, de vannak olyan helyzetek, amikor a szolgáltatásfelügyeleti szolgáltatások hatókörön belüli szolgáltatásként való hozzáadásához szükség lehet rá. Előfordulhat például, hogy a felhasználók olyan funkciószűrőket szeretnének használni, amelyek hatókörön belüli szolgáltatásokat használnak környezeti információkhoz. Ebben az esetben inkább a AddScopedFeatureManagement
metódust kell használni. Ez biztosítja, hogy a szolgáltatásfelügyeleti szolgáltatások, köztük a szolgáltatásszűrők hatókörön belüli szolgáltatásokként legyenek hozzáadva.
services.AddScopedFeatureManagement();
ASP.NET Core-integráció
A szolgáltatásfelügyeleti kódtár a ASP.NET Core és az MVC funkcióit biztosítja a webalkalmazások gyakori funkciójelző-forgatókönyveinek engedélyezéséhez. Ezek a képességek a Microsoft.FeatureManagement.AspNetCore NuGet csomagra való hivatkozással érhetők el.
Vezérlők és műveletek
Az MVC-vezérlő és a műveletek végrehajtásához engedélyezni kell egy adott funkciót vagy a funkciók listájának egyikét. Ez egy , a Microsoft.FeatureManagement.Mvc
névtérben található használatával végezhető elFeatureGateAttribute
.
[FeatureGate("FeatureX")]
public class HomeController : Controller
{
…
}
A HomeController
fenti kaput a "FeatureX" határozza meg. A "FeatureX"-et engedélyezni kell, mielőtt bármilyen műveletet végrehajtanának a HomeController
tartalmai.
[FeatureGate("FeatureX")]
public IActionResult Index()
{
return View();
}
A Index
fenti MVC művelet végrehajtásához engedélyezni kell a "FeatureX" műveletet.
Letiltott műveletkezelés
Ha egy MVC-vezérlő vagy művelet le van tiltva, mert az általa megadott funkciók egyike sem engedélyezett, a rendszer meghív egy regisztráltat IDisabledFeaturesHandler
. Alapértelmezés szerint egy minimalista kezelő van regisztrálva, amely HTTP 404-et ad vissza. Ezt felül lehet bírálni a IFeatureManagementBuilder
funkciójelzők regisztrálásakor.
public interface IDisabledFeaturesHandler
{
Task HandleDisabledFeature(IEnumerable<string> features, ActionExecutingContext context);
}
Nézet
Az MVC-nézetekben <feature>
címkék használhatók a tartalom feltételes megjelenítésére attól függően, hogy engedélyezve van-e egy funkció.
<feature name="FeatureX">
<p>This can only be seen if 'FeatureX' is enabled.</p>
</feature>
Letilthatja a címke súgójának kiértékelését is, hogy tartalmat jelenítsen meg, ha egy funkció vagy funkciókészlet le van tiltva. Az alábbi példában megadott negate="true"
tartalom csak akkor jelenik meg, ha FeatureX
le van tiltva.
<feature negate="true" name="FeatureX">
<p>This can only be seen if 'FeatureX' is disabled.</p>
</feature>
A <feature>
címke több funkcióra is hivatkozhat az attribútumban name
található szolgáltatások vesszővel tagolt listájának megadásával.
<feature name="FeatureX,FeatureY">
<p>This can only be seen if 'FeatureX' and 'FeatureY' are enabled.</p>
</feature>
Alapértelmezés szerint az összes felsorolt funkciót engedélyezni kell a funkciócímke megjelenítéséhez. Ezt a viselkedést felül lehet bírálni az requirement
alábbi példában látható attribútum hozzáadásával.
<feature name="FeatureX,FeatureY" requirement="Any">
<p>This can only be seen if either 'FeatureX' or 'FeatureY' or both are enabled.</p>
</feature>
Az MVC-nézetekben <feature>
a címkék a tartalom feltételes megjelenítésére használhatók attól függően, hogy engedélyezve van-e egy szolgáltatás, vagy egy funkció adott változata van-e hozzárendelve. További információkért tekintse meg a változatok szakaszt .
<feature name="FeatureX">
<p>This can only be seen if 'FeatureX' is enabled.</p>
</feature>
<feature name="FeatureX" variant="Alpha">
<p>This can only be seen if variant 'Alpha' of 'FeatureX' is assigned.</p>
</feature>
Letilthatja a címke súgójának kiértékelését is, hogy tartalmat jelenítsen meg, ha egy funkció vagy funkciókészlet le van tiltva. Az alábbi példában megadott negate="true"
tartalom csak akkor jelenik meg, ha FeatureX
le van tiltva.
<feature negate="true" name="FeatureX">
<p>This can only be seen if 'FeatureX' is disabled.</p>
</feature>
<feature negate="true" name="FeatureX" variant="Alpha">
<p>This can only be seen if variant 'Alpha' of 'FeatureX' isn't assigned.</p>
</feature>
A <feature>
címke több jellemzőre/változatra is hivatkozhat az attribútumban name
/variant
található funkciók/változatok vesszővel tagolt listájának megadásával.
<feature name="FeatureX,FeatureY">
<p>This can only be seen if 'FeatureX' and 'FeatureY' are enabled.</p>
</feature>
<feature name="FeatureX" variant="Alpha,Beta">
<p>This can only be seen if variant 'Alpha' or 'Beta' of 'FeatureX' is assigned.</p>
</feature>
Feljegyzés
Ha variant
meg van adva, csak egy funkciót kell megadni.
Alapértelmezés szerint az összes felsorolt funkciót engedélyezni kell a funkciócímke megjelenítéséhez. Ezt a viselkedést felül lehet bírálni az requirement
alábbi példában látható attribútum hozzáadásával.
Feljegyzés
Ha az egyiket requirement
And
egy hibával variant
együtt használja a rendszer, akkor több változatot soha nem lehet hozzárendelni.
<feature name="FeatureX,FeatureY" requirement="Any">
<p>This can only be seen if either 'FeatureX' or 'FeatureY' or both are enabled.</p>
</feature>
A <feature>
címke használatához egy címkesegítőre van szükség. Ezt úgy teheti meg, hogy hozzáadja a szolgáltatásfelügyeleti címke segédjét a ViewImports.cshtml fájlhoz.
@addTagHelper *, Microsoft.FeatureManagement.AspNetCore
MVC-szűrők
Az MVC műveletszűrők beállíthatók a szolgáltatás állapota alapján feltételes végrehajtásra. Ez az MVC-szűrők funkcióérzékeny módon történő regisztrálásával végezhető el.
A szolgáltatásfelügyeleti folyamat támogatja az aszinkron MVC-műveleti szűrőket, amelyek implementálják IAsyncActionFilter
azokat.
services.AddMvc(o =>
{
o.Filters.AddForFeature<SomeMvcFilter>("FeatureX");
});
A fenti kód hozzáad egy MVC-szűrőt.SomeMvcFilter
Ez a szűrő csak akkor aktiválódik az MVC-folyamaton belül, ha a "FeatureX" engedélyezve van.
Razor Pages
Az MVC Razor-lapok futtatásához engedélyezni kell egy adott funkciót vagy bármely funkciólistát. Ez egy , a Microsoft.FeatureManagement.Mvc
névtérben található használatával végezhető elFeatureGateAttribute
.
[FeatureGate("FeatureX")]
public class IndexModel : PageModel
{
public void OnGet()
{
}
}
A fenti kód beállít egy Razor-oldalt, amely megköveteli a "FeatureX" engedélyezését. Ha a funkció nincs engedélyezve, a lap HTTP 404 (NotFound) eredményt hoz létre.
Razor-oldalakon való használat esetén a FeatureGateAttribute
lapkezelő típusára kell helyezni. Nem helyezhető el az egyes kezelőmetszeteken.
Alkalmazásépítés
A szolgáltatásfelügyeleti kódtár olyan alkalmazáságak és köztes szoftverek hozzáadására használható, amelyek a funkcióállapot alapján feltételesen futnak.
app.UseMiddlewareForFeature<ThirdPartyMiddleware>("FeatureX");
A fenti hívással az alkalmazás hozzáad egy köztes szoftver összetevőt, amely csak akkor jelenik meg a kérelemfolyamatban, ha a "FeatureX" funkció engedélyezve van. Ha a szolgáltatás futásidőben engedélyezve van/le van tiltva, a köztes szoftverfolyamat dinamikusan módosítható.
Ez kiépíti az általánosabb képességet, hogy a teljes alkalmazást elágaztathassa egy funkció alapján.
app.UseForFeature(featureName, appBuilder =>
{
appBuilder.UseMiddleware<T>();
});
Funkciószűrő implementálása
A szolgáltatásszűrők létrehozásával lehetővé válik a szolgáltatások engedélyezése az Ön által meghatározott feltételek alapján. A funkciószűrő implementálásához az IFeatureFilter
interfészt végre kell hajtani. IFeatureFilter
egyetlen metódussal rendelkezik EvaluateAsync
. Ha egy szolgáltatás megadja, hogy engedélyezhető egy szolgáltatásszűrőhöz, a EvaluateAsync
metódus meghívása történik. Ha EvaluateAsync
visszaadja true
, az azt jelenti, hogy a funkciót engedélyezni kell.
Az alábbi kódrészlet bemutatja, hogyan adhat hozzá testre szabott funkciószűrőt MyCriteriaFilter
.
services.AddFeatureManagement()
.AddFeatureFilter<MyCriteriaFilter>();
A szolgáltatásszűrők regisztrálva vannak a IFeatureManagementBuilder
visszaadott AddFeatureManagement
feladó meghívásávalAddFeatureFilter<T>
. Ezek a szolgáltatásszűrők hozzáféréssel rendelkeznek a szolgáltatásgyűjteményben található szolgáltatásokhoz, amelyek funkciójelölők hozzáadására szolgálnak. A függőséginjektálás a szolgáltatások lekérésére használható.
Feljegyzés
Ha a szűrőkre a funkciójelölő beállításai hivatkoznak (például appsettings.json), a típusnév Szűrő részét ki kell hagyni. További információkért lásd a szakaszt Filter Alias Attribute
.
Paraméteres funkciószűrők
Egyes funkciószűrőkhöz paraméterek szükségesek annak eldöntéséhez, hogy be kell-e kapcsolni egy funkciót. Előfordulhat például, hogy egy böngészőfunkció-szűrő bekapcsol egy funkciót bizonyos böngészőkben. Előfordulhat, hogy az Edge és a Chrome böngészők engedélyezik a funkciót, míg a Firefox nem. Ehhez egy funkciószűrőt úgy lehet megtervezni, hogy paramétereket várjon. Ezek a paraméterek a szolgáltatáskonfigurációban lesznek megadva, a kódban pedig a FeatureFilterEvaluationContext
paraméteren IFeatureFilter.EvaluateAsync
keresztül érhetők el.
public class FeatureFilterEvaluationContext
{
/// <summary>
/// The name of the feature being evaluated.
/// </summary>
public string FeatureName { get; set; }
/// <summary>
/// The settings provided for the feature filter to use when evaluating whether the feature should be enabled.
/// </summary>
public IConfiguration Parameters { get; set; }
}
FeatureFilterEvaluationContext
nevű tulajdonsága Parameters
van. Ezek a paraméterek egy nyers konfigurációt jelölnek, amellyel a szolgáltatásszűrő eldöntheti, hogyan kell értékelni, hogy engedélyezve legyen-e a szolgáltatás. Ha ismét példaként szeretné használni a böngészőfunkció-szűrőt, a szűrővel Parameters
kinyerheti a funkcióhoz megadott engedélyezett böngészők készletét, majd ellenőrizheti, hogy a kérést az adott böngészők egyikéből küldi-e el.
[FilterAlias("Browser")]
public class BrowserFilter : IFeatureFilter
{
…
public Task<bool> EvaluateAsync(FeatureFilterEvaluationContext context)
{
BrowserFilterSettings settings = context.Parameters.Get<BrowserFilterSettings>() ?? new BrowserFilterSettings();
//
// Here we would use the settings and see if the request was sent from any of BrowserFilterSettings.AllowedBrowsers
}
}
Szűrő aliasattribútum
Ha egy szolgáltatásszűrő regisztrálva van egy funkciójelölőhöz, a konfigurációban használt alias a funkciószűrő típusának neve, ha van ilyen, eltávolítva a Szűrő utótaggal. A konfigurációban például MyCriteriaFilter
MyCriteria-nak nevezik.
"MyFeature": {
"EnabledFor": [
{
"Name": "MyCriteria"
}
]
}
Ezt felül lehet bírálni a FilterAliasAttribute
. Ezzel az attribútummal egy funkciószűrővel deklarálható az a név, amelyet a konfigurációban használni kell a funkciószűrőre való hivatkozáshoz egy funkciójelölőn belül.
Hiányzó funkciószűrők
Ha egy szolgáltatás úgy van konfigurálva, hogy engedélyezve legyen egy adott szolgáltatásszűrőhöz, és a funkciószűrő nincs regisztrálva, a szolgáltatás kiértékelése kivételt eredményez. A kivétel letiltható a szolgáltatásfelügyeleti beállítások használatával.
services.Configure<FeatureManagementOptions>(options =>
{
options.IgnoreMissingFeatureFilters = true;
});
HttpContext használata
A funkciószűrők kiértékelhetik, hogy engedélyezni kell-e egy funkciót egy HTTP-kérés tulajdonságai alapján. Ezt a HTTP-környezet vizsgálatával hajtja végre. A funkciószűrők a függőséginjektáláson IHttpContextAccessor
keresztüli beolvasással hivatkozhatnak a HTTP-környezetre.
public class BrowserFilter : IFeatureFilter
{
private readonly IHttpContextAccessor _httpContextAccessor;
public BrowserFilter(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
}
}
Az IHttpContextAccessor
indításkor hozzá kell adni a függőséginjektáló tárolóhoz, hogy elérhető legyen. Az alábbi módszerrel regisztrálható IServiceCollection
.
public void ConfigureServices(IServiceCollection services)
{
…
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
…
}
Speciális: IHttpContextAccessor
/HttpContext
nem használható a kiszolgálóoldali Blazor-alkalmazások Razor-összetevőiben. A Http-környezet Blazor-alkalmazásokban való átadásának ajánlott módszere az adatok hatókörrel rendelkező szolgáltatásba való másolása. A Blazor-alkalmazások AddScopedFeatureManagement
esetében a szolgáltatásfelügyeleti szolgáltatások regisztrálásához kell használni. További információkért lásd a szakaszt Scoped Feature Management Services
.
Környezet biztosítása a funkcióértékeléshez
A konzolalkalmazásokban nincs olyan környezeti környezet, mint amilyen például HttpContext
az, hogy a funkciószűrők be- vagy kikapcsolhatják-e a funkciót. Ebben az esetben az alkalmazásoknak egy környezetet képviselő objektumot kell biztosítaniuk a szolgáltatásfelügyeleti rendszerbe a funkciószűrők általi használathoz. Ezt a következővel IFeatureManager.IsEnabledAsync<TContext>(string featureName, TContext appContext)
végezheti el: . A funkciókezelőnek biztosított appContext objektumot a funkciószűrők használhatják a funkció állapotának kiértékeléséhez.
MyAppContext context = new MyAppContext
{
AccountId = current.Id;
}
if (await featureManager.IsEnabledAsync(feature, context))
{
…
}
Környezeti funkciószűrők
A környezetfüggő funkciószűrők implementálják az interfészt IContextualFeatureFilter<TContext>
. Ezek a speciális funkciószűrők kihasználhatják a meghíváskor IFeatureManager.IsEnabledAsync<TContext>
átadott környezetet. A TContext
típusparaméter azt írja le, IContextualFeatureFilter<TContext>
hogy a szűrő milyen környezettípust képes kezelni. Ez lehetővé teszi egy környezetfüggő funkciószűrő fejlesztőjének, hogy leírja, mi szükséges azok számára, akik használni szeretnék. Mivel minden típus az objektum leszármazottja, egy implementálható IContextualFeatureFilter<object>
szűrő bármilyen megadott környezethez hívható meg. Ha egy konkrétabb környezeti funkciószűrőre szeretne példát szemléltetni, fontolja meg az engedélyezett funkciók használatát, ha egy fiók szerepel az engedélyezett fiókok konfigurált listájában.
public interface IAccountContext
{
string AccountId { get; set; }
}
[FilterAlias("AccountId")]
class AccountIdFilter : IContextualFeatureFilter<IAccountContext>
{
public Task<bool> EvaluateAsync(FeatureFilterEvaluationContext featureEvaluationContext, IAccountContext accountId)
{
//
// Evaluate if the feature should be on with the help of the provided IAccountContext
}
}
Láthatjuk, hogy a AccountIdFilter
szükséges objektumnak meg kell adnia egy olyan objektumot, amely implementálva IAccountContext
van a funkció állapotának kiértékeléséhez. A szolgáltatásszűrő használatakor a hívónak gondoskodnia kell arról, hogy az átadott objektum implementálva legyen IAccountContext
.
Feljegyzés
Csak egyetlen funkciószűrő felület implementálható egyetlen típussal. Ha olyan funkciószűrőt próbál hozzáadni, amely egynél több funkciószűrő felületet implementál, az eredmény egy ArgumentException
.
Környezetfüggő és nem környezetfüggő szűrők használata ugyanazzal az aliassal
IFeatureFilter
A szűrők ugyanazt az aliast használhatják és IContextualFeatureFilter
megoszthatják. Pontosabban egy szűrőaliast 0, 1 IFeatureFilter
és 0 vagy N IContextualFeatureFilter<ContextType>
oszthat meg, amennyiben legfeljebb egy szűrő használható.ContextType
Az alábbi szakasz a szűrő kiválasztásának folyamatát ismerteti, ha az azonos nevű környezetfüggő és nem környezetfüggő szűrők regisztrálva vannak egy alkalmazásban.
Tegyük fel, hogy van egy nem környezetfüggő szűrője, FilterA
valamint két környezetfüggő szűrője FilterB
, valamint a FilterC, amelyek elfogadják TypeB
, illetve TypeC
a környezeteket. Mindhárom szűrő ugyanazt az aliast SharedFilterName
használja.
Emellett rendelkezik egy funkciójelzővel MyFeature
is, amely a szolgáltatásszűrőt SharedFilterName
használja a konfigurációjában.
Ha mindhárom szűrő regisztrálva van:
- Az IsEnabledAsync("MyFeature" hívása esetén a rendszer a
FilterA
funkciójelző kiértékelésére szolgál. - Az IsEnabledAsync("MyFeature", context) hívása esetén a rendszer a környezet típusát
TypeB
FilterB
használja. Ha a környezet típusa az,FilterC
akkor aTypeC
rendszer használja. - Az IsEnabledAsync("MyFeature", context) hívása esetén a rendszer a környezet típusát
TypeF
FilterA
használja.
Beépített funkciószűrők
Van néhány funkciószűrő, amelyek a Microsoft.FeatureManagement
csomaghoz tartoznak: PercentageFilter
, TimeWindowFilter
és ContextualTargetingFilter
TargetingFilter
. A rendszer az összes szűrőt automatikusan hozzáadja, ha a TargetingFilter
szolgáltatáskezelést metódussal regisztráljákAddFeatureManagement
. A TargetingFilter
rendszer hozzáadja az WithTargeting
alábbi szakaszban részletezett Targeting
metódust.
Minden beépített funkciószűrő saját paraméterekkel rendelkezik. Íme a szolgáltatásszűrők listája a példákkal együtt.
Microsoft.Percentage
Ez a szűrő lehetővé teszi egy funkció engedélyezését egy megadott százalék alapján.
"EnhancedPipeline": {
"EnabledFor": [
{
"Name": "Microsoft.Percentage",
"Parameters": {
"Value": 50
}
}
]
}
Microsoft.TimeWindow
Ez a szűrő lehetővé teszi egy szolgáltatás időkereten alapuló engedélyezését. Ha csak End
a megadott érték van megadva, a szolgáltatás addig is be van kapcsolva. Ha csak Start
meg van adva, a szolgáltatás az adott időpont után minden ponton figyelembe lesz véve.
"EnhancedPipeline": {
"EnabledFor": [
{
"Name": "Microsoft.TimeWindow",
"Parameters": {
"Start": "Wed, 01 May 2019 13:59:59 GMT",
"End": "Mon, 01 Jul 2019 00:00:00 GMT"
}
}
]
}
Az időablak konfigurálható úgy, hogy rendszeresen ismétlődjön. Ez olyan helyzetekben lehet hasznos, amikor előfordulhat, hogy egy funkciót egy nap vagy egy hét bizonyos napjainak alacsony vagy nagy forgalmú időszakában kell bekapcsolni. Ha az egyes időablakokat ismétlődő időablakokként szeretné kibontani, az ismétlődési szabályt meg kell adni a Recurrence
paraméterben.
Feljegyzés
Start
és End
mindkettőt meg kell adni az engedélyezéshez Recurrence
.
"EnhancedPipeline": {
"EnabledFor": [
{
"Name": "Microsoft.TimeWindow",
"Parameters": {
"Start": "Fri, 22 Mar 2024 20:00:00 GMT",
"End": "Sat, 23 Mar 2024 02:00:00 GMT",
"Recurrence": {
"Pattern": {
"Type": "Daily",
"Interval": 1
},
"Range": {
"Type": "NoEnd"
}
}
}
}
]
}
A Recurrence
beállítások két részből állnak: Pattern
(milyen gyakran ismétlődik az időablak) és Range
(mennyi ideig ismétlődik az ismétlődési minta).
Ismétlődési minta
Két lehetséges ismétlődési mintatípus létezik: Daily
és Weekly
. Egy időablak például "minden nap", "három naponta", "minden hétfőn" vagy "minden második pénteken" ismétlődhet.
A típustól függően a Pattern
mezők bizonyos mezői kötelezőek, nem kötelezőek vagy figyelmen kívül hagyhatók.
Daily
A napi ismétlődési minta miatt az időablak ismétlődik az egyes előfordulások közötti napok száma alapján.
Tulajdonság Relevancia Leírás Típus Kötelező A beállításnak a Daily
következőnek kell lennie: .Intervallum Választható Az egyes előfordulások közötti napok számát adja meg. Az alapértelmezett érték 1. Weekly
A heti ismétlődési minta miatt az időablak a hét ugyanazon napján vagy napjaiban ismétlődik az egyes előfordulások között eltelt hetek száma alapján.
Tulajdonság Relevancia Leírás Típus Kötelező A beállításnak a Weekly
következőnek kell lennie: .DaysOfWeek Kötelező Megadja, hogy a hét mely napjain történjen az esemény. Intervallum Választható Az egyes előfordulások közötti hetek számát adja meg. Az alapértelmezett érték 1. FirstDayOfWeek Választható Megadja, hogy melyik nap számít a hét első napjának. Az alapértelmezett érték Sunday
.Az alábbi példa minden második hétfőn és kedden megismétli az időablakot
"Pattern": { "Type": "Weekly", "Interval": 2, "DaysOfWeek": ["Monday", "Tuesday"] }
Feljegyzés
Start
Az ismétlődési mintának megfelelő érvényes első előfordulásnak kell lennie. Emellett az időablak időtartama nem lehet hosszabb, mint amilyen gyakran előfordul. Érvénytelen például, hogy naponta 25 órás időablak ismétlődik.
Ismétlődési tartomány
Három lehetséges ismétlődési tartománytípus létezik: NoEnd
és EndDate
Numbered
.
NoEnd
A
NoEnd
tartomány miatt az ismétlődés határozatlan ideig ismétlődik.Tulajdonság Relevancia Leírás Típus Kötelező A beállításnak a NoEnd
következőnek kell lennie: .EndDate
A
EndDate
tartomány azt eredményezi, hogy az időablak minden olyan napon bekövetkezik, amely megfelel az alkalmazandó mintának a befejezési dátumig.Tulajdonság Relevancia Leírás Típus Kötelező A beállításnak a EndDate
következőnek kell lennie: .EndDate Kötelező Megadja a minta alkalmazásának leállításának dátumát. Mindaddig, amíg az utolsó előfordulás kezdő időpontja a befejezési dátum elé esik, az előfordulás záró időpontja túllépheti azt. Az alábbi példa minden nap megismétli az időkeretet, amíg az utolsó előfordulás 2024. április 1-jén meg nem történik.
"Start": "Fri, 22 Mar 2024 18:00:00 GMT", "End": "Fri, 22 Mar 2024 20:00:00 GMT", "Recurrence":{ "Pattern": { "Type": "Daily", "Interval": 1 }, "Range": { "Type": "EndDate", "EndDate": "Mon, 1 Apr 2024 20:00:00 GMT" } }
Numbered
A
Numbered
tartomány miatt az időablak rögzített számú alkalommal fordul elő (a minta alapján).Tulajdonság Relevancia Leírás Típus Kötelező A beállításnak a Numbered
következőnek kell lennie: .NumberOfOccurrences Kötelező Az előfordulások számát adja meg. A következő példa megismétli az időkeretet hétfőn és kedden, amíg három esemény nem következik be, amelyek április 1-jén (hétfő), április 2-án (kedd) és április 8-án (hétfő) történnek.
"Start": "Mon, 1 Apr 2024 18:00:00 GMT", "End": "Mon, 1 Apr 2024 20:00:00 GMT", "Recurrence":{ "Pattern": { "Type": "Weekly", "Interval": 1, "DaysOfWeek": ["Monday", "Tuesday"] }, "Range": { "Type": "Numbered", "NumberOfOccurrences": 3 } }
Ismétlődési szabály létrehozásához mindkét Pattern
Range
szabályt meg kell adnia. Bármely mintatípus bármilyen tartománytípussal használható.
Speciális: A tulajdonság időzóna-eltolása Start
az ismétlődési beállításokra lesz alkalmazva.
Microsoft.Targeting
Ez a szűrő lehetővé teszi egy szolgáltatás engedélyezését a célközönség számára. A célzás részletes magyarázatát az alábbi célzási szakasz ismerteti. A szűrőparaméterek közé tartoznak a Audience
felhasználókat, csoportokat, kizárt felhasználókat/csoportokat leíró objektumok, valamint a szolgáltatáshoz hozzáféréssel rendelkező felhasználói bázis alapértelmezett százalékos aránya. A szakaszban felsorolt csoportobjektumoknak Groups
azt is meg kell adniuk, hogy a csoport tagjainak hány százaléka rendelkezzen hozzáféréssel. Ha egy felhasználó közvetlenül vagy kizárt csoportban van megadva a Exclusion
szakaszban, a szolgáltatás le van tiltva. Ellenkező esetben, ha egy felhasználó közvetlenül a Users
szakaszban van megadva, vagy ha a felhasználó szerepel a csoport bevezetésének százalékos arányában, vagy ha a felhasználó az alapértelmezett bevezetési százalékra esik, akkor a felhasználónak engedélyezve lesz a funkció.
"EnhancedPipeline": {
"EnabledFor": [
{
"Name": "Microsoft.Targeting",
"Parameters": {
"Audience": {
"Users": [
"Jeff",
"Alicia"
],
"Groups": [
{
"Name": "Ring0",
"RolloutPercentage": 100
},
{
"Name": "Ring1",
"RolloutPercentage": 50
}
],
"DefaultRolloutPercentage": 20,
"Exclusion": {
"Users": [
"Ross"
],
"Groups": [
"Ring2"
]
}
}
}
}
]
}
Szolgáltatásszűrő aliasnévterei
Az összes beépített funkciószűrő-alias a funkciószűrő névterében Microsoft
található. Ennek célja, hogy megakadályozza az azonos aliast használó más funkciószűrőkkel való ütközéseket. A szolgáltatásszűrő-névtér szegmenseit a "." karakter osztja fel. A szolgáltatásszűrőkre hivatkozhat teljes mértékben minősített aliasa, például Microsoft.Percentage
az utolsó szegmens, amely esetében Microsoft.Percentage
az .Percentage
Célcsoportkezelés
A célzás egy funkciókezelési stratégia, amely lehetővé teszi a fejlesztők számára, hogy fokozatosan új funkciókat vezessenek be a felhasználói bázisukra. A stratégia a célközönségként ismert felhasználók egy csoportjának megcélzására épül. A célközönség meghatározott felhasználókból, csoportokból, kizárt felhasználókból/csoportokból és a teljes felhasználói bázis meghatározott százalékából áll. A közönségbe felvett csoportok további bontásban, a teljes tagok százalékos arányára bonthatók.
Az alábbi lépések egy új bétaverziós funkció fokozatos bevezetésére mutatnak be példát:
- Jeff és Alicia egyes felhasználók számára hozzáférést kapnak a bétaverzióhoz
- Egy másik felhasználó, Mark, kéri, hogy jelentkezzen be, és szerepel benne.
- A "Ring1" nevű csoport felhasználóinak húsz százaléka szerepel a bétaverzióban.
- A bétaverzióban szereplő "Ring1" felhasználók száma 100%-ra csökken.
- A felhasználói bázis öt százaléka szerepel a bétaverzióban.
- A bevezetési százalék akár 100 százalék is lehet, és a funkció teljesen ki lett adva.
A szolgáltatás üzembe helyezésének stratégiája a beépített Microsoft.Targeting funkciószűrőn keresztül van beépítve a kódtárba .
Célzás webalkalmazásban
A célzási funkciószűrőt használó webalkalmazások a FeatureFlagDemo példaprojektben érhetők el.
Az alkalmazás használatának TargetingFilter
megkezdéséhez hozzá kell adni az alkalmazás szolgáltatásgyűjteményéhez, ugyanúgy, mint bármely más funkciószűrőt. A többi beépített szűrővel ellentétben a TargetingFilter
szolgáltatás egy másik szolgáltatásra támaszkodik, amelyet hozzá kell adni az alkalmazás szolgáltatásgyűjteményéhez. Ez a szolgáltatás egy ITargetingContextAccessor
.
A szolgáltatáshoz ITargetingContextAccessor
használt implementálási típust a célzási szűrőt használó alkalmazásnak kell implementálnia. Íme egy példa a funkciókezelés webalkalmazásban való beállítására, hogy a TargetingFilter
rendszer a meghívásos HttpContextTargetingContextAccessor
implementációt ITargetingContextAccessor
használja.
services.AddFeatureManagement()
.WithTargeting<HttpContextTargetingContextAccessor>();
A célkörnyezeti tartozék, és TargetingFilter
regisztrálva van a IFeatureManagementBuilder
.WithTargeting<T>
ITargetingContextAccessor
A webalkalmazások használatához TargetingFilter
implementálásra ITargetingContextAccessor
van szükség. Ennek az az oka, hogy a célkiértékelés végrehajtásakor olyan információkra van szükség, mint például az, hogy milyen felhasználót értékelnek ki éppen. Ezt az információt célzási környezetnek nevezzük. A különböző webalkalmazások ezeket az információkat különböző helyekről nyerhetik ki. Néhány gyakori példa arra, hogy egy alkalmazás hol húzhatja le a célkörnyezetet, a kérelem HTTP-környezete vagy egy adatbázis.
A FeatureFlagDemo példaprojekt tartalmaz egy példát, amely az alkalmazás HTTP-környezetéből nyeri ki a célkörnyezet adatait. Ez a módszer az itt tárgyalt módszer használatára IHttpContextAccessor
támaszkodik.
Célzás konzolalkalmazásban
A célzási szűrő egy célzási környezetre támaszkodik annak kiértékeléséhez, hogy be kell-e kapcsolni egy funkciót. Ez a célkörnyezet olyan információkat tartalmaz, mint például a jelenleg kiértékelt felhasználó és a felhasználó csoportosítása. A konzolalkalmazásokban általában nincs olyan környezeti környezet, amely ezeket az információkat a célszűrőbe továbbíthassa, ezért közvetlenül kell továbbítani, amikor FeatureManager.IsEnabledAsync
meghívják. Ezt a ContextualTargetingFilter
. Az olyan alkalmazásoknak, amelyeknek a célkörnyezetet a funkciókezelőbe kell lebegtetnie, ezt kell használniuk ahelyett, hogy a TargetingFilter.
Mivel ContextualTargetingFilter
ez egy IContextualTargetingFilter<ITargetingContext>
olyan implementáció, amelyet ITargetingContext
át kell adni IFeatureManager.IsEnabledAsync
annak, hogy kiértékelhesse és bekapcsolhassa a funkciót.
IFeatureManager fm;
…
// userId and groups defined somewhere earlier in application
TargetingContext targetingContext = new TargetingContext
{
UserId = userId,
Groups = groups
};
await fm.IsEnabledAsync(featureName, targetingContext);
A ContextualTargetingFilter
rendszer továbbra is a Microsoft.Targeting szolgáltatásszűrő aliast használja, így a szűrő konfigurációja összhangban van az ebben a szakaszban említettekkel.
A TargetingConsoleApp példaprojektben egy konzolalkalmazásban használt ContextualTargetingFilter
példa érhető el.
A célzás kiértékelési beállításai
A beállítások segítségével testre szabhatja, hogyan történik a célértékek kiértékelése az összes funkcióban. Ezek a beállítások a funkciókezelés beállításakor konfigurálhatók.
services.Configure<TargetingEvaluationOptions>(options =>
{
options.IgnoreCase = true;
});
Célzás kizárása
Célközönség meghatározásakor a felhasználók és csoportok kizárhatók a célközönségből. Ez akkor hasznos, ha egy szolgáltatást egy felhasználói csoportnak ad ki, de néhány felhasználót vagy csoportot ki kell zárni a bevezetésből. A kizárást a felhasználók és csoportok listájának a célközönség tulajdonságához való hozzáadásával lehet definiálni Exclusion
.
"Audience": {
"Users": [
"Jeff",
"Alicia"
],
"Groups": [
{
"Name": "Ring0",
"RolloutPercentage": 100
}
],
"DefaultRolloutPercentage": 0
"Exclusion": {
"Users": [
"Mark"
]
}
}
A fenti példában a funkció engedélyezve van az elnevezett Jeff
és Alicia
a . A csoporthoz tartozó felhasználók számára is engedélyezve Ring0
van. Ha azonban a felhasználó neve el van nevezve Mark
, a szolgáltatás le van tiltva, függetlenül attól, hogy a csoportban Ring0
vannak-e, vagy sem. A kizárások elsőbbséget élveznek a célszűrő többi részével szemben.
Változatok
Amikor új funkciókat adnak hozzá egy alkalmazáshoz, előfordulhat, hogy egy funkció több különböző javasolt tervezési lehetőséggel rendelkezik. A tervezéssel kapcsolatos döntés egyik gyakori megoldása az A/B tesztelés valamilyen formája, amely magában foglalja a funkció egy másik verziójának biztosítását a felhasználói bázis különböző szegmensei számára, és a felhasználói interakciók alapján kiválasztja a verziót. Ebben a kódtárban ez a funkció egy funkció különböző konfigurációinak variánsokkal való ábrázolásával engedélyezve van.
A változatok lehetővé teszik, hogy egy funkciójelző több legyen, mint egy egyszerű be- és kikapcsolási jelző. A variánsok egy funkciójelző értékét jelölik, amely lehet sztring, szám, logikai vagy akár konfigurációs objektum is. A változatokat deklaráló funkciójelzőnek meg kell határoznia, hogy milyen körülmények között kell használni az egyes változatokat, amelyről részletesebben a Kiosztási változatok szakaszban olvashat.
public class Variant
{
/// <summary>
/// The name of the variant.
/// </summary>
public string Name { get; set; }
/// <summary>
/// The configuration of the variant.
/// </summary>
public IConfigurationSection Configuration { get; set; }
}
Változatok lekérése
Minden funkcióhoz lekérhető egy variáns a IVariantFeatureManager
"metódus" GetVariantAsync
használatával.
…
IVariantFeatureManager featureManager;
…
Variant variant = await featureManager.GetVariantAsync(MyFeatureFlags.FeatureU, CancellationToken.None);
IConfigurationSection variantConfiguration = variant.Configuration;
// Do something with the resulting variant and its configuration
A változat lekérése után a változat konfigurációja közvetlenül IConfigurationSection
használható a változat tulajdonságából Configuration
. Egy másik lehetőség, ha a konfigurációt egy objektumhoz köti a használatával. A NET konfigurációkötési mintája.
IConfigurationSection variantConfiguration = variant.Configuration;
MyFeatureSettings settings = new MyFeatureSettings();
variantConfiguration.Bind(settings);
A visszaadott variáns az éppen kiértékelt felhasználótól függ, és az információ a következő példányból származik TargetingContext
: . Ez a környezet átadható híváskor GetVariantAsync
, vagy automatikusan lekérhető annak egy implementációjából ITargetingContextAccessor
, ha van regisztrálva.
Variant Feature Flag Deklaráció
A normál funkciójelzőkhöz képest a változatfunkció-jelzők két további tulajdonsággal rendelkeznek: variants
és allocation
. A variants
tulajdonság egy tömb, amely a funkcióhoz definiált változatokat tartalmazza. A allocation
tulajdonság határozza meg, hogyan kell lefoglalni ezeket a változatokat a funkcióhoz. A normál funkciójelzők deklarálásával egy JSON-fájlban is beállíthat változatfunkció-jelzőket. Íme egy példa egy változatfunkció-jelzőre.
{
"feature_management": {
"feature_flags": [
{
"id": "MyVariantFeatureFlag",
"enabled": true,
"allocation": {
"default_when_enabled": "Small",
"group": [
{
"variant": "Big",
"groups": [
"Ring1"
]
}
]
},
"variants": [
{
"name": "Big"
},
{
"name": "Small"
}
]
}
]
}
}
Variánsok definiálása
Mindegyik változat két tulajdonsággal rendelkezik: egy névvel és egy konfigurációval. A név egy adott változatra hivatkozik, a konfiguráció pedig az adott változat értéke. A konfiguráció a tulajdonságok vagy configuration_value
a configuration_reference
tulajdonságok használatával állítható be. configuration_reference
egy sztring elérési útja, amely az aktuális konfiguráció egy szakaszára hivatkozik, amely tartalmazza a funkciójelölő deklarációját. configuration_value
egy beágyazott konfiguráció, amely lehet sztring, szám, logikai vagy konfigurációs objektum. Ha mindkettő meg van adva, configuration_value
akkor a rendszer használja. Ha egyik sincs megadva, a visszaadott változat tulajdonsága Configuration
null értékű lesz.
A tulajdonság minden egyes funkciójára vonatkozóan meg van határozva az variants
összes lehetséges változat listája.
{
"feature_management": {
"feature_flags": [
{
"id": "MyVariantFeatureFlag",
"variants": [
{
"name": "Big",
"configuration_reference": "ShoppingCart:Big"
},
{
"name": "Small",
"configuration_value": {
"Size": 300
}
}
]
}
]
},
"ShoppingCart": {
"Big": {
"Size": 600,
"Color": "green"
},
"Small": {
"Size": 300,
"Color": "gray"
}
}
}
Változatok kiosztása
A funkcióváltozatok kiosztásának folyamatát a allocation
funkció tulajdonsága határozza meg.
"allocation": {
"default_when_enabled": "Small",
"default_when_disabled": "Small",
"user": [
{
"variant": "Big",
"users": [
"Marsha"
]
}
],
"group": [
{
"variant": "Big",
"groups": [
"Ring1"
]
}
],
"percentile": [
{
"variant": "Big",
"from": 0,
"to": 10
}
],
"seed": "13973240"
},
"variants": [
{
"name": "Big",
"configuration_reference": "ShoppingCart:Big"
},
{
"name": "Small",
"configuration_value": "300px"
}
]
A allocation
funkció beállítása a következő tulajdonságokkal rendelkezik:
Tulajdonság | Leírás |
---|---|
default_when_disabled |
Megadja, hogy melyik változatot kell használni, amikor egy változatot kérnek, miközben a funkció le van tiltva. |
default_when_enabled |
Megadja, hogy melyik változatot kell használni, amikor egy változatot kérnek, miközben a funkció engedélyezve van, és nem rendeltek hozzá más változatot a felhasználóhoz. |
user |
Egy változatot és azon felhasználók listáját adja meg, akikhez a változatot hozzá kell rendelni. |
group |
Egy variánst és egy csoportlistát határoz meg. A variáns akkor lesz hozzárendelve, ha a felhasználó legalább egy csoportban van. |
percentile |
Egy variánst és egy százalékos tartományt ad meg, amelyhez a felhasználó számított százalékos aránya igazodik a hozzárendelendő változathoz. |
seed |
Az az érték, amelyre a percentile százalékos számítások alapulnak. Ha ugyanazt seed az értéket használja, az adott felhasználó százalékos kiszámítása minden szolgáltatásban azonos lesz. Ha nincs seed megadva, a rendszer létrehoz egy alapértelmezett magot a szolgáltatásnév alapján. |
A fenti példában, ha a funkció nincs engedélyezve, a funkciókezelő hozzárendeli az aktuális felhasználóhoz jelölt default_when_disabled
változatot, amely ebben az esetben van Small
.
Ha a funkció engedélyezve van, a funkciókezelő ellenőrzi a , group
és percentile
a foglalásokat abban a user
sorrendben, hogy hozzárendeljen egy változatot. Ebben a konkrét példában, ha a kiértékelt felhasználó neve el van nevezve Marsha
, a névvel ellátott Ring1
csoportban, vagy a felhasználó a 0 és a 10. percentilis közé esik, akkor a megadott változat lesz hozzárendelve a felhasználóhoz. Ebben az esetben ezek mindegyike a variánst Big
adja vissza. Ha egyik foglalás sem egyezik meg, a felhasználóhoz hozzá lesz rendelve a default_when_enabled
variáns, azaz a Small
.
A kiosztási logika hasonló a Microsoft.Targeting szolgáltatásszűrőhöz, de vannak olyan paraméterek, amelyek nem szerepelnek a kiosztásban, és fordítva. A célzás és a kiosztás eredményei nem kapcsolódnak egymáshoz.
Feljegyzés
A funkcióvariánsok kiosztásának engedélyezéséhez regisztrálnia ITargetingContextAccessor
kell. Ezt a metódus meghívásával WithTargeting<T>
teheti meg.
Engedélyezett állapot felülírása Variant használatával
A változatok használatával felülbírálhatja egy funkciójelző engedélyezett állapotát. Ez lehetőséget ad a variánsoknak egy funkciójelző kiértékelésének kiterjesztésére. Ha egy hívó ellenőrzi, hogy engedélyezve van-e egy változókat tartalmazó jelző, a szolgáltatáskezelő ellenőrzi, hogy az aktuális felhasználóhoz rendelt változat felülbírálja-e az eredményt. Ez az opcionális változattulajdonság status_override
használatával történik. Alapértelmezés szerint ez a tulajdonság be van állítva None
, ami azt jelenti, hogy a változat nem befolyásolja, hogy a jelző engedélyezve vagy letiltva van-e. Beállítás status_override
, amely lehetővé teszi, hogy Enabled
a variáns a választáskor felülbíráljon egy jelölőt. Disabled
A beállítás status_override
az ellenkező funkciót biztosítja, ezért letiltja a jelölőt a változat kiválasztásakor. Egy állapotú enabled
false
funkció nem bírálható felül.
Ha bináris változatokkal rendelkező funkciójelzőt használ, a status_override
tulajdonság nagyon hasznos lehet. Lehetővé teszi, hogy továbbra is használja az API-kat az alkalmazásban és FeatureGateAttribute
az IsEnabledAsync
alkalmazásban, miközben kihasználja a variánsokkal járó új funkciókat, például a percentilis kiosztást és a magot.
{
"id": "MyVariantFeatureFlag",
"enabled": true,
"allocation": {
"percentile": [
{
"variant": "On",
"from": 10,
"to": 20
}
],
"default_when_enabled": "Off",
"seed": "Enhanced-Feature-Group"
},
"variants": [
{
"name": "On"
},
{
"name": "Off",
"status_override": "Disabled"
}
]
}
A fenti példában a funkció mindig engedélyezve van. Ha az aktuális felhasználó a számított percentilistartományban van 10 és 20 között, akkor a rendszer visszaadja a On
variánst. Ellenkező esetben a rendszer visszaadja a Off
variánst, és mivel status_override
az egyenlő Disabled
, a funkció le lesz tiltva.
Variánsok a függőséginjektálásban
A variant funkciójelzők a függőséginjektálással együtt használhatók egy szolgáltatás különböző implementációinak felszínre hozásához a különböző felhasználók számára. Ez a felület használatával IVariantServiceProvider<TService>
történik.
IVariantServiceProvider<IAlgorithm> algorithmServiceProvider;
...
IAlgorithm forecastAlgorithm = await algorithmServiceProvider.GetServiceAsync(cancellationToken);
A fenti kódrészletben a IVariantServiceProvider<IAlgorithm>
függőséginjektálási tároló implementációját IAlgorithm
kéri le. A választott megvalósítás a következőtől függ:
- A szolgáltatás által regisztrált funkciójelző
IAlgorithm
. - A szolgáltatáshoz lefoglalt változat.
A IVariantServiceProvider<T>
hívással IFeatureManagementBuilder.WithVariantService<T>(string featureName)
elérhetővé válik az alkalmazás számára. Lásd alább egy példát.
services.AddFeatureManagement()
.WithVariantService<IAlgorithm>("ForecastAlgorithm");
A fenti hívás elérhetővé válik IVariantServiceProvider<IAlgorithm>
a szolgáltatásgyűjteményben. A megvalósításokat IAlgorithm
külön kell hozzáadni egy olyan hozzáadási módszerrel, mint a services.AddSingleton<IAlgorithm, SomeImplementation>()
. Ennek megvalósítása IAlgorithm
a IVariantServiceProvider
változat funkciójelzőtől függ ForecastAlgorithm
. Ha nincs implementáció IAlgorithm
hozzáadva a szolgáltatásgyűjteményhez, a IVariantServiceProvider<IAlgorithm>.GetServiceAsync()
rendszer null eredményt ad vissza.
{
// The example variant feature flag
"id": "ForecastAlgorithm",
"enabled": true,
"variants": [
{
"Name": "AlgorithmBeta"
},
...
]
}
Variant Service Alias attribútum
[VariantServiceAlias("Beta")]
public class AlgorithmBeta : IAlgorithm
{
...
}
A változatszolgáltató a implementációk típusneveit fogja használni a lefoglalt változatnak megfelelően. Ha egy változatszolgáltatást a rendszer a VariantServiceAliasAttribute
következővel deklarál, az attribútumban deklarált nevet kell használni a konfigurációban a változatszolgáltatásra való hivatkozáshoz.
Telemetria
Amikor üzembe helyez egy funkciójelző-módosítást, gyakran fontos elemezni az alkalmazásra gyakorolt hatását. Íme például néhány kérdés, amely felmerülhet:
- A jelzők a várt módon vannak engedélyezve/letiltva?
- A megcélzott felhasználók a várt módon férnek hozzá egy adott funkcióhoz?
- Melyik változatot látja egy adott felhasználó?
Ezekre a kérdésekre a funkciójelzők kiértékelési eseményeinek kibocsátásával és elemzésével lehet válaszolni. Ez a kódtár támogatja ezeknek az eseményeknek a telemetriai közzétevőken keresztüli kibocsájtását. Egy vagy több telemetriai közzétevő regisztrálható az események közzétételére a funkciójelzők kiértékelésekor.
Telemetria engedélyezése
Alapértelmezés szerint a funkciójelzők nem bocsátanak ki telemetriát. Egy adott funkciójelző telemetriai adatainak közzétételéhez a jelölőnek deklarálnia kell , hogy engedélyezve van a telemetriai kibocsátáshoz.
A tulajdonságban appsettings.json
definiált funkciójelzők esetében ez a telemetry
tulajdonság használatával történik.
{
"feature_management": {
"feature_flags": [
{
"id": "MyFeatureFlag",
"enabled": true,
"telemetry": {
"enabled": true
}
}
]
}
}
A fenti appsettings-kódrészlet egy olyan funkciójelölőt MyFeatureFlag
határoz meg, amely engedélyezve van a telemetriához. Ezt az telemetry
igaz értékre állító enabled
objektum jelzi. A tulajdonság értékét a enabled
jelölő telemetriájának közzétételéhez kell megadni true
.
A telemetry
funkciójelölő szakasza a következő tulajdonságokkal rendelkezik:
Tulajdonság | Leírás |
---|---|
enabled |
Megadja, hogy közzé kell-e tenni a telemetriát a funkciójelölőhöz. |
metadata |
A kulcs-érték párok szótárként modellezett gyűjteménye, amely a funkciójelző egyéni metaadatainak a kiértékelési eseményekhez való csatolására használható. |
Egyéni telemetriai közzétevők
A funkciójelző telemetriai adatainak egyéni kezelése a funkciókezelőben történő implementálással ITelemetryPublisher
és regisztrálással lehetséges. Amikor egy telemetria-kompatibilis funkciójelző kiértékelése történik, a regisztrált telemetriai közzétevőnek lehetősége lesz közzétenni a megfelelő kiértékelési eseményt.
public interface ITelemetryPublisher
{
ValueTask PublishEvent(EvaluationEvent evaluationEvent, CancellationToken cancellationToken);
}
A EvaluationEvent
típus itt található referenciaként.
A telemetriai közzétevők regisztrálása híváskor AddFeatureManagement()
történik. Íme egy példa a szolgáltatásfelügyelet beállítására a telemetriai adatok kibocsájtásához a nevesított MyTelemetryPublisher
implementációvalITelemetryPublisher
.
builder.services
.AddFeatureManagement()
.AddTelemetryPublisher<MyTelemetryPublisher>();
Application Insights telemetriai közzétevő
A Microsoft.FeatureManagement.Telemetry.ApplicationInsights
csomag egy beépített telemetriai közzétevői implementációt biztosít, amely a funkciójelző kiértékelési adatait küldi el az Application Insightsnak. Ennek kihasználásához adjon hozzá egy hivatkozást a csomaghoz, és regisztrálja az Application Insights telemetriai közzétevőt az alább látható módon.
builder.services
.AddFeatureManagement()
.AddTelemetryPublisher<ApplicationInsightsTelemetryPublisher>();
Feljegyzés
Az alapcsomag Microsoft.FeatureManagement
nem tartalmazza ezt a telemetriai közzétevőt.
A használatra példa a EvaluationDataToApplicationInsights példában található.
Előfeltétel
Ez a telemetriai közzétevő attól függ, hogy az Application Insights már telepítve van, és alkalmazásszolgáltatásként van regisztrálva. Ez például itt történik a példaalkalmazásban.
Gyorsítótárazás
A szolgáltatás állapotát a IConfiguration
rendszer biztosítja. A gyorsítótárazást és a dinamikus frissítést várhatóan a konfigurációszolgáltatók fogják kezelni. A funkciókezelő a funkció állapotának legújabb értékét kéri IConfiguration
, amikor egy funkció engedélyezve van.
Pillanatkép
Vannak olyan forgatókönyvek, amelyek megkövetelik, hogy egy szolgáltatás állapota konzisztens maradjon a kérések élettartama alatt. A szabványból IFeatureManager
visszaadott értékek változhatnak, ha a IConfiguration
lekérés forrása frissül a kérés során. Ez megelőzhető a következő használatával IFeatureManagerSnapshot
: . IFeatureManagerSnapshot
ugyanúgy kérhető le, mint IFeatureManager
a . IFeatureManagerSnapshot
implementálja a felületét IFeatureManager
, de gyorsítótárazza egy szolgáltatás első kiértékelt állapotát egy kérés során, és ugyanazt az állapotot adja vissza egy szolgáltatásnak az élettartama során.
Egyéni szolgáltatásszolgáltatók
Az egyéni szolgáltatásszolgáltató implementálása lehetővé teszi, hogy a fejlesztők lekérjenek funkciójelzőket olyan forrásokból, mint egy adatbázis vagy egy szolgáltatásfelügyeleti szolgáltatás. Az alapértelmezett szolgáltatásszolgáltató lekéri a .NET Core konfigurációs rendszeréből a funkciójelzőket. Ez lehetővé teszi, hogy a funkciók appsettings.json fájlban vagy olyan konfigurációszolgáltatókban definiálhatók, mint a Azure-alkalmazás Configuration. Ez a viselkedés helyettesíthető a funkciódefiníciók olvasásának teljes ellenőrzéséhez.
A funkciódefiníciók betöltésének testreszabásához implementálnia kell a IFeatureDefinitionProvider
felületet.
public interface IFeatureDefinitionProvider
{
Task<FeatureDefinition> GetFeatureDefinitionAsync(string featureName);
IAsyncEnumerable<FeatureDefinition> GetAllFeatureDefinitionsAsync();
}
A implementáció IFeatureDefinitionProvider
használatához hozzá kell adni a szolgáltatásgyűjteményhez a funkciókezelés hozzáadása előtt. Az alábbi példa egy elnevezett InMemoryFeatureDefinitionProvider
implementációt IFeatureDefinitionProvider
ad hozzá.
services.AddSingleton<IFeatureDefinitionProvider, InMemoryFeatureDefinitionProvider>()
.AddFeatureManagement()
Következő lépések
Ha meg szeretné tudni, hogyan használhatja a funkciójelzőket az alkalmazásokban, folytassa az alábbi rövid útmutatókkal.
A funkciószűrők használatának megismeréséhez folytassa az alábbi oktatóanyagokkal.
Ha meg szeretné tudni, hogyan futtathat kísérleteket a változatfunkció-jelzőkkel, folytassa az alábbi oktatóanyaggal.
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: