Włączanie etapowego wdrażania funkcji dla docelowych odbiorców

Określanie wartości docelowej to strategia zarządzania funkcjami, która umożliwia deweloperom stopniowe wdrażanie nowych funkcji w bazie użytkowników. Strategia jest oparta na koncepcji określania celu grupy użytkowników znanej jako docelowa grupa odbiorców. Odbiorcy składają się z określonych użytkowników, grup i wyznaczonego procentu całej bazy użytkowników.

  • Użytkownicy mogą być rzeczywistymi kontami użytkowników, ale mogą być również maszynami, urządzeniami lub dowolnymi unikatowymi jednostkami, do których chcesz wdrożyć funkcję.

  • Grupy są aż do aplikacji do zdefiniowania. Na przykład w przypadku określania docelowych kont użytkowników można użyć grup lub grup firmy Microsoft oznaczających lokalizacje użytkowników. Podczas określania wartości docelowych maszyn można grupować je na podstawie etapów wdrażania. Grupy mogą być dowolnymi typowymi atrybutami, na podstawie których chcesz kategoryzować odbiorców.

Z tego artykułu dowiesz się, jak wdrożyć nową funkcję w aplikacji internetowej platformy ASP.NET Core dla określonych użytkowników i grup przy użyciu aplikacja systemu Azure TargetingFilter Configuration.

Wymagania wstępne

Tworzenie aplikacji internetowej z flagami uwierzytelniania i funkcji

W tej sekcji utworzysz aplikację internetową, która umożliwia użytkownikom logowanie się i korzystanie z flagi funkcji beta utworzonej wcześniej. Większość kroków jest bardzo podobna do tego, co zostało wykonane w przewodniku Szybki start.

  1. Utwórz aplikację internetową, która uwierzytelnia się w lokalnej bazie danych przy użyciu następującego polecenia.

    dotnet new mvc --auth Individual -o TestFeatureFlags
    
  2. Dodaj odwołania do następujących pakietów NuGet.

    dotnet add package Microsoft.Azure.AppConfiguration.AspNetCore
    dotnet add package Microsoft.FeatureManagement.AspNetCore
    
  3. Zapisz parametry połączenia dla sklepu App Configuration.

    dotnet user-secrets init
    dotnet user-secrets set ConnectionStrings:AppConfig "<your_connection_string>"
    
  4. Zaktualizuj Program.cs przy użyciu następującego kodu.

    // Existing code in Program.cs
    // ... ...
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Retrieve the App Config connection string
    string AppConfigConnectionString = builder.Configuration.GetConnectionString("AppConfig");
    
    // Load configuration from Azure App Configuration
    builder.Configuration.AddAzureAppConfiguration(options =>
    {
        options.Connect(AppConfigConnectionString);
        options.UseFeatureFlags();
    });
    
    // Add Azure App Configuration middleware to the container of services
    builder.Services.AddAzureAppConfiguration();
    
    // Add feature management to the container of services
    builder.Services.AddFeatureManagement();
    
    // The rest of existing code in Program.cs
    // ... ...
    
    // Existing code in Program.cs
    // ... ...
    
    var app = builder.Build();
    
    // Use Azure App Configuration middleware for dynamic configuration refresh
    app.UseAzureAppConfiguration();
    
    // The rest of existing code in Program.cs
    // ... ...
    
  5. Dodaj plik Beta.cshtml w katalogu Views\Home i zaktualizuj go za pomocą następującego znacznika.

    @{
        ViewData["Title"] = "Beta Page";
    }
    
    <h1>This is the beta website.</h1>
    
  6. Otwórz HomeController.cs w katalogu Controllers i zaktualizuj go przy użyciu następującego kodu.

    public IActionResult Beta()
    {
        return View();
    }
    
  7. Otwórz plik _ViewImports.cshtml i zarejestruj pomocnika tagów menedżera funkcji przy użyciu @addTagHelper dyrektywy :

    @addTagHelper *, Microsoft.FeatureManagement.AspNetCore
    
  8. Otwórz plik _Layout.cshtml w katalogu Views\Shared. Wstaw nowy <feature> tag między elementami paska nawigacyjnego Strona główna i Prywatność .

    <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
        <ul class="navbar-nav flex-grow-1">
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
            </li>
            <feature name="Beta">
                <li class="nav-item">
                    <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Beta">Beta</a>
                </li>
            </feature>
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
            </li>
        </ul>
        <partial name="_LoginPartial" />
    </div>
    
  9. Skompiluj i uruchom. Następnie wybierz link Zarejestruj w prawym górnym rogu, aby utworzyć nowe konto użytkownika. Użyj adresu e-mail .test@contoso.com Na ekranie Zarejestruj potwierdzenie wybierz pozycję Kliknij tutaj, aby potwierdzić swoje konto.

  10. Przełącz flagę funkcji w usłudze App Configuration. Sprawdź, czy ta akcja kontroluje widoczność elementu beta na pasku nawigacyjnym.

Aktualizowanie kodu aplikacji internetowej do użycia TargetingFilter

W tym momencie możesz użyć flagi funkcji, aby włączyć lub wyłączyć Beta funkcję dla wszystkich użytkowników. Aby włączyć flagę funkcji dla niektórych użytkowników podczas wyłączania jej dla innych, zaktualizuj kod, aby używał polecenia TargetingFilter. W tym przykładzie użyjesz adresu e-mail zalogowanego użytkownika jako identyfikatora użytkownika, a część nazwy domeny adresu e-mail jako grupy. Dodasz użytkownika i grupę do elementu TargetingContext. Ten TargetingFilter kontekst służy do określania stanu flagi funkcji dla każdego żądania.

  1. Dodaj plik ExampleTargetingContextAccessor.cs .

    using Microsoft.AspNetCore.Http;
    using Microsoft.FeatureManagement.FeatureFilters;
    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    
    namespace TestFeatureFlags
    {
        public class ExampleTargetingContextAccessor : ITargetingContextAccessor
        {
            private const string TargetingContextLookup = "ExampleTargetingContextAccessor.TargetingContext";
            private readonly IHttpContextAccessor _httpContextAccessor;
    
            public ExampleTargetingContextAccessor(IHttpContextAccessor httpContextAccessor)
            {
                _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
            }
    
            public ValueTask<TargetingContext> GetContextAsync()
            {
                HttpContext httpContext = _httpContextAccessor.HttpContext;
                if (httpContext.Items.TryGetValue(TargetingContextLookup, out object value))
                {
                    return new ValueTask<TargetingContext>((TargetingContext)value);
                }
                List<string> groups = new List<string>();
                if (httpContext.User.Identity.Name != null)
                {
                    groups.Add(httpContext.User.Identity.Name.Split("@", StringSplitOptions.None)[1]);
                }
                TargetingContext targetingContext = new TargetingContext
                {
                    UserId = httpContext.User.Identity.Name,
                    Groups = groups
                };
                httpContext.Items[TargetingContextLookup] = targetingContext;
                return new ValueTask<TargetingContext>(targetingContext);
            }
        }
    }
    
  2. Otwórz Program.cs plik i dodaj utworzony ExampleTargetingContextAccessor we wcześniejszym kroku oraz TargetingFilter do kolekcji usług, wywołując metodę WithTargeting po istniejącym wierszu AddFeatureManagement. Użyje TargetingFilter elementu , ExampleTargetingContextAccessor aby określić kontekst określania wartości docelowej za każdym razem, gdy flaga funkcji jest oceniana.

    // Existing code in Program.cs
    // ... ...
    
    // Add feature management to the container of services
    builder.Services.AddFeatureManagement()
                    .WithTargeting<ExampleTargetingContextAccessor>();
    
    // The rest of existing code in Program.cs
    // ... ...
    

    Uwaga

    Aby uzyskać informacje o aplikacjach Platformy Blazor, zobacz instrukcje dotyczące włączania zarządzania funkcjami jako usług o określonym zakresie.

Aktualizowanie flagi funkcji w celu używania elementu TargetFilter

  1. W witrynie Azure Portal przejdź do sklepu App Configuration i wybierz pozycję Menedżer funkcji.

  2. Wybierz menu kontekstowe flagi funkcji beta utworzonej w przewodniku Szybki start. Zaznacz Edytuj.

    Edit Beta feature flag

  3. Na ekranie Edycja zaznacz pole wyboru Włącz flagęfunkcji, jeśli nie zostało jeszcze zaznaczone. Następnie zaznacz pole wyboru Użyj filtru funkcji.

  4. Zaznacz przycisk Utwórz.

  5. Wybierz filtr Określanie wartości docelowej na liście rozwijanej Typ filtru.

  6. Zaznacz pole wyboru Przesłoń według grup i przesłoń według użytkowników.

  7. Wybierz następujące opcje.

    • Wartość procentowa domyślna: 0
    • Uwzględnij grupy: wprowadź nazwęcontoso.com i wartość procentową50
    • Wyklucz grupy: contoso-xyz.com
    • Uwzględnij użytkowników: test@contoso.com
    • Wyklucz użytkowników: testuser@contoso.com

    Ekran filtru funkcji będzie wyglądać następująco.

    Conditional feature flag

    Te ustawienia powodują następujące zachowanie.

    • Flaga funkcji jest zawsze wyłączona dla użytkownika testuser@contoso.com, ponieważ testuser@contoso.com jest wyświetlana w sekcji Wykluczanie użytkowników .
    • Flaga funkcji jest zawsze wyłączona dla użytkowników w programie contoso-xyz.com, ponieważ contoso-xyz.com jest wyświetlana w sekcji Wykluczanie grup .
    • Flaga funkcji jest zawsze włączona dla użytkownika test@contoso.com, ponieważ test@contoso.com jest wyświetlana w sekcji Dołączanie użytkowników .
    • Flaga funkcji jest włączona dla 50% użytkowników w grupie contoso.com, ponieważ contoso.com jest wymieniona w sekcji Dołączanie grup z wartością procentową 50.
    • Funkcja jest zawsze wyłączona dla wszystkich innych użytkowników, ponieważ wartość procentowa domyślna jest ustawiona na 0.
  8. Wybierz pozycję Dodaj , aby zapisać filtr określania wartości docelowej.

  9. Wybierz pozycję Zastosuj , aby zapisać te ustawienia i wrócić do ekranu Menedżera funkcji.

  10. Filtr Funkcji dla flagi funkcji jest teraz wyświetlany jako Określanie wartości docelowej. Ten stan wskazuje, że flaga funkcji jest włączona lub wyłączona dla poszczególnych żądań na podstawie kryteriów wymuszanych przez filtr funkcji Określanie wartości docelowej .

TargetFilter w akcji

Aby wyświetlić efekty tej flagi funkcji, skompiluj i uruchom aplikację. Początkowo element beta nie jest wyświetlany na pasku narzędzi, ponieważ opcja Wartość procentowa domyślna jest ustawiona na 0.

Teraz zaloguj się jako test@contoso.com, używając hasła ustawionego podczas rejestrowania. Element beta jest teraz wyświetlany na pasku narzędzi, ponieważ test@contoso.com jest określony jako docelowy użytkownik.

Teraz zaloguj się jako testuser@contoso.com, używając hasła ustawionego podczas rejestrowania. Element beta nie jest wyświetlany na pasku narzędzi, ponieważ testuser@contoso.com jest określony jako wykluczony użytkownik.

W poniższym filmie wideo pokazano to zachowanie w akcji.

TargetingFilter in action

Aby zobaczyć zachowanie ustawień grupy, możesz utworzyć więcej użytkowników z adresami @contoso.com e-mail i @contoso-xyz.com adresami e-mail.

Użytkownicy z adresami contoso-xyz.com e-mail nie zobaczą elementu beta . Chociaż 50% użytkowników z adresami @contoso.com e-mail zobaczy element beta , pozostałe 50% nie będzie widzieć elementu beta .

Następne kroki