Включение поэтапного развертывания функций для определенных аудиторий

Цель — это стратегия управления функциями, которая позволяет разработчикам постепенно развертывать новые функции в своей пользовательской базе. Стратегия основана на концепции целевой аудитории для набора пользователей, известных как целевая аудитория. Аудитория состоит из определенных пользователей, групп и указанного процента всей базы пользователей.

  • Пользователи могут быть фактическими учетными записями пользователей, но они также могут быть компьютерами, устройствами или любыми уникальными сущностями, в которых требуется развернуть функцию.

  • Группы относятся к приложению для определения. Например, при выборе учетных записей пользователей можно использовать группы или группы Microsoft Entra, обозначающие расположения пользователей. При выборе целевых компьютеров их можно сгруппировать на основе этапов развертывания. Группы могут быть любыми общими атрибутами, на основе которых вы хотите классифицировать аудиторию.

В этой статье вы узнаете, как развернуть новую функцию в веб-приложении ASP.NET Core для указанных пользователей и групп, использующих TargetingFilter Конфигурация приложений Azure.

Необходимые компоненты

Создание веб-приложения с флагами проверки подлинности и компонентов

В этом разделе вы создадите веб-приложение, которое позволяет пользователям входить и использовать флаг бета-функции , созданный ранее. Большинство шагов очень похожи на то, что вы сделали в кратком руководстве.

  1. Создайте веб-приложение, которое проходит проверку подлинности в локальной базе данных с помощью следующей команды.

    dotnet new mvc --auth Individual -o TestFeatureFlags
    
  2. Добавьте ссылки на следующие пакеты NuGet.

    dotnet add package Microsoft.Azure.AppConfiguration.AspNetCore
    dotnet add package Microsoft.FeatureManagement.AspNetCore
    
  3. Сохраните строка подключения для вашего хранилища Конфигурация приложений.

    dotnet user-secrets init
    dotnet user-secrets set ConnectionStrings:AppConfig "<your_connection_string>"
    
  4. Обновите Program.cs с помощью следующего кода.

    // 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. Добавьте Beta.cshtml в каталог Views\Home и обновите его с помощью следующей разметки.

    @{
        ViewData["Title"] = "Beta Page";
    }
    
    <h1>This is the beta website.</h1>
    
  6. Откройте HomeController.cs в каталоге контроллеров и обновите его следующим кодом.

    public IActionResult Beta()
    {
        return View();
    }
    
  7. Откройте файл _ViewImports.cshtml и зарегистрируйте вспомогательный компонент диспетчера функций с помощью директивы @addTagHelper :

    @addTagHelper *, Microsoft.FeatureManagement.AspNetCore
    
  8. Откройте файл _Layout.cshtml в каталоге Views\Shared. Вставьте новый <feature> тег между элементами панели навигации " Главная " и "Конфиденциальность ".

    <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. Выполните сборку и запуск. Затем щелкните ссылку "Регистрация" в правом верхнем углу, чтобы создать новую учетную запись пользователя. Используйте адрес электронной почты test@contoso.com. На экране Подтверждение регистрации выберите Щелкните здесь, чтобы подтвердить свою учетную запись.

  10. Переключите флаг компонента в Конфигурации приложений. Проверьте, что это действие управляет видимостью элемента Beta на панели навигации.

Обновление кода веб-приложения для использования TargetingFilter

На этом этапе можно использовать флаг компонента, чтобы включить или отключить компонент Beta для всех пользователей. Чтобы включить флаг компонента для некоторых пользователей и отключить его для других, обновите код для использования TargetingFilter. В этом примере вы используете адрес электронной почты вошедшего пользователя в качестве идентификатора пользователя и часть домена адреса электронной почты в качестве группы. Вы добавляете пользователя и группу в объект TargetingContext. TargetingFilter использует этот контекст для определения состояния флага компонента для каждого запроса.

  1. Добавьте файл 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. Откройте Program.cs и добавьте ExampleTargetingContextAccessor созданный на предыдущем шаге и TargetingFilter в коллекцию служб путем вызова WithTargeting метода после существующей строки AddFeatureManagement. Он TargetingFilter будет использовать ExampleTargetingContextAccessor для определения контекста целевого объекта при каждом вычислении флага компонента.

    // 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
    // ... ...
    

    Примечание.

    Для приложений Blazor см. инструкции по включению управления функциями в качестве область служб.

Обновление флага компонента для использования TargetingFilter

  1. На портале Azure перейдите к хранилищу Конфигурации приложений и выберите Диспетчер компонентов.

  2. Выберите контекстное меню для флага компонента Beta, созданного в кратком руководстве. Выберите Изменить.

    Edit Beta feature flag

  3. На экране редактирования установите флажок Включить флаг компонента, если он еще не установлен. Затем установите флажок Использовать фильтр компонентов.

  4. Выберите кнопку Создать.

  5. Выберите фильтр целевого назначения в раскрывающемся списке типа фильтра.

  6. Выберите переопределение по группам и переопределить пользователями проверка box.

  7. Выберите следующие параметры.

    • Значение в процентах по умолчанию: 0
    • Включить группы: введите имяcontoso.com и процент50
    • Исключить группы: contoso-xyz.com
    • Включить пользователей: test@contoso.com
    • Исключите пользователей: testuser@contoso.com

    Экран фильтра функций будет выглядеть следующим образом.

    Conditional feature flag

    Эти параметры приводят к следующему поведению.

    • Флаг функции всегда отключен для пользователя, так как указан в разделе "Исключить пользователей".testuser@contoso.comtestuser@contoso.com
    • Флаг компонента всегда отключен для пользователей в contoso-xyz.comcontoso-xyz.comразделе "Исключения групп".
    • Флаг функции всегда включен для пользователя, так как указан в разделе "Включить пользователей".test@contoso.comtest@contoso.com
    • Флаг функции включен для 50% пользователей в группе contoso.com, так как contoso.com указан в разделе "Включить группы" с процентом 50.
    • Этот компонент всегда отключен для всех остальных пользователей, так как процент по умолчанию имеет значение 0.
  8. Нажмите кнопку "Добавить ", чтобы сохранить фильтр целевого назначения.

  9. Нажмите кнопку Применить, чтобы сохранить эти параметры и вернуться на экран Диспетчера компонентов.

  10. Фильтр компонентов для флага компонента теперь отображается как Назначение. Это состояние указывает, что флаг компонента включен или отключен на основе каждого запроса на основе критериев, применяемых фильтром функций целевого назначения .

TargetingFilter в действии

Чтобы увидеть влияние этого флага компонента, выполните сборку и запустите приложение. Изначально элемент Beta не отображается на панели инструментов, так как параметр Процент по умолчанию имеет значение 0.

Теперь войдите как test@contoso.com, используя пароль, заданный при регистрации. Теперь на панели инструментов отображается элемент Beta, так как test@contoso.com указан как целевой пользователь.

Теперь войдите как testuser@contoso.com, используя пароль, заданный при регистрации. Элемент бета-версии не отображается на панели инструментов, так как testuser@contoso.com указан как исключенный пользователь.

В следующем видео показано это поведение в действии.

TargetingFilter in action

Вы можете создать больше пользователей с @contoso.com адресами электронной почты и @contoso-xyz.com просмотреть поведение параметров группы.

Пользователи с contoso-xyz.com адресами электронной почты не увидят бета-элемент . Хотя 50% пользователей с @contoso.com адресами электронной почты увидят бета-элемент , остальные 50% не увидят бета-элемент .

Следующие шаги