Поделиться через


Флаги функций

Подсказка

Это фрагмент из электронной книги «Архитектура облачных нативных приложений .NET для Azure», доступен на .NET Docs или как бесплатный загружаемый PDF-файл, который можно прочитать в автономном режиме.

Миниатюра обложки электронной книги Azure с Cloud Native .NET приложениями.

В главе 1 мы подтвердили, что облачные технологии в основном связаны со скоростью и гибкостью. Пользователи ожидают быстрое реагирование, инновационные функции и нулевое время простоя. Feature flags — это современный метод развертывания, который помогает повысить гибкость для облачных приложений. Они позволяют развертывать новые функции в рабочей среде, но ограничивать их доступность. Щелкнув переключатель, вы можете активировать новую функцию для конкретных пользователей, не перезагрузив приложение или развернув новый код. Они отделяют выпуск новых функций от развертывания кода.

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

К другим вариантам использования флагов функций относятся:

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

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

Реализация флагов компонентов

В основном флаг функции — это ссылка на простую decision object. Он возвращает логическое состояние on или off. Флаг обычно упаковывает блок кода, который инкапсулирует возможность функции. Состояние флага определяет, выполняется ли этот блок кода для заданного пользователя. На рисунке 10–11 показана реализация.

if (featureFlag) {
    // Run this code block if the featureFlag value is true
} else {
    // Run this code block if the featureFlag value is false
}

Рис. 10-11 — реализация простого флага функции.

Обратите внимание, что этот подход отделяет логику принятия решений от кода функции.

В главе 1 мы обсудили тему Twelve-Factor App. Рекомендации по поддержанию параметров конфигурации вне исполняемого кода приложения. При необходимости параметры можно считывать из внешнего источника. Значения конфигурации флага компонента также должны быть независимыми от базы кода. При внешней настройке флага в отдельном репозитории можно изменить состояние флага без изменения и повторного развертывания приложения.

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

Флаги функций можно легко реализовать в службе ASP.NET Core. Установка библиотек управления функциями .NET и поставщика конфигурации приложений позволяет декларативно добавлять флаги компонентов в код. Они активируют атрибуты FeatureGate, так что вам не нужно вручную писать условные конструкции по всему коду.

После настройки в классе Startup, можно добавить функциональность переключения функций на уровне контроллера, действия или на уровне промежуточного слоя. Рис. 10-12 представляет реализацию контроллера и действия:

[FeatureGate(MyFeatureFlags.FeatureA)]
public class ProductController : Controller
{
    ...
}
[FeatureGate(MyFeatureFlags.FeatureA)]
public IActionResult UpdateProductStatus()
{
    return ObjectResult(ProductDto);
}

Рис. 10-12 - Реализация флага функций в контроллере и действии.

Если флаг компонента отключен, пользователь получит код состояния 404 (не найден) без текста ответа.

Флаги функций также можно внедрить непосредственно в классы C#. На рис. 10-13 показано внедрение фича-флага:

public class ProductController : Controller
{
    private readonly IFeatureManager _featureManager;

    public ProductController(IFeatureManager featureManager)
    {
        _featureManager = featureManager;
    }
}

Рис. 10-13 . Внедрение флага компонента в класс.

Библиотеки управления функциями управляют жизненным циклом флага компонента за кулисами. Например, чтобы свести к минимуму большое количество вызовов в хранилище конфигурации, состояния флагов библиотек кэшируются в течение определённого периода времени. Они могут гарантировать неизменность состояний флагов во время выполнения запроса. Они также предлагают Point-in-time snapshot. Вы можете восстановить историю любого ключевого значения и указать его последнее значение в любой момент в течение предыдущих семи дней.