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

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

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

В этой статье я покажу вам, как использовать библиотеку Togglz в приложении Spring Boot для включения функций во время выполнения.

Давайте начнем!

Демонстрационный проект

Togglz — это библиотека с открытым исходным кодом, которая реализует шаблон проектирования Feature Toggle. Каждая новая функция может быть связана с переключателем.

Давайте создадим новый проект Spring Boot, чтобы увидеть, как интегрировать библиотеку.

Зависимости проекта

Я буду использовать Maven в качестве инструмента сборки для этой демонстрации.

Нам нужны следующие зависимости для файла pom.xml:

<dependency>
  <groupId>org.togglz</groupId>
  <artifactId>togglz-spring-boot-starter</artifactId>
  <version>3.1.2</version>
</dependency>

<dependency>
 <groupId>org.togglz</groupId>
 <artifactId>togglz-console</artifactId>
 <version>3.3.3</version>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
  <version>3.0.4</version>
</dependency>
  • Spring boot предоставляет стартовый пакет togglz-spring-boot-starter, включающий функции Togglz.
  • togglz-console включает консоль администратора для управления функциями пользовательского интерфейса.
  • Нам нужен spring-boot-starter-actuator для доступа к конечным точкам приложения, включая Togglz.

Настройте переключатели функций

Вы можете определить переключатели функций либо в коде Java в виде перечислений, либо в файле application.yml file.

Я буду использовать последний подход, включая этот код:

togglz:
  features:
    NEW_PRODUCT:
      enabled: false

Доступ к переключателям из кода

Давайте создадим простой RestController, чтобы продемонстрировать использование переключателей функций.

@RestController
@RequiredArgsConstructor
@Slf4j
public class DemoController {

    private final FeatureManager manager;

    public static final Feature NEW_PRODUCT = new NamedFeature("NEW_PRODUCT");

    @RequestMapping("/demo")
    public ResponseEntity<String> demo() {

        if (manager.isActive(NEW_PRODUCT)) {
            log.info("new product feature enabled");
        } else {
            log.info("running the old code");
        }
        return ResponseEntity.ok().build();
    }
}
  • Мы создали RequestMapping, доступную на конечной точке /demo.
  • FeatureManager используется для проверки того, включены ли переключатели.
  • Feature/NamedFeature относится к имени переключателя.
  • Мы проверяем, активен ли переключатель функции NEW_PRODUCT, используя метод manager.isActive(). Если это так, мы запускаем новый код. В противном случае старый.

Это довольно просто, не так ли?

Проверьте переключатели функций

В настоящее время новая функция отключена.

Запустите приложение.

Отправьте запрос GET на конечную точку /demo:

GET http://localhost:8080/demo/

Посмотрим лог приложения:

c.togglz.demo.controller.DemoController : running the old code

Правильно! Старый код работает, как и ожидалось.

Переключите тумблеры

Вы можете переключать переключатели с помощью запроса POST на конечную точку привода или консоль администратора Togglz.

Актуатор и Togglz

Мы должны включить активатор загрузки Spring и включить конечную точку togglz:

management:
  endpoints:
    web:
      exposure:
        include: 'togglz'

Запустите приложение.

Теперь мы можем получить доступ к Togglz через конечную точку привода: http://localhost:8080/actuator/togglz

Вот пример вывода:

[{"name":"NEW_PRODUCT","enabled":false,"strategy":null,"params":{},"metadata":{"label":"NEW_PRODUCT","groups":[],"enabledByDefault":true,"attributes":{}}}]

Вы можете переключать функции, выполнив запрос POST к конечной точке привода togglz.

curl -d '{"name":"NEW_PRODUCT", "enabled":"true"}' -H “Content-Type: application/json” -POST http://localhost:8080/actuator/togglz/NEW_PRODUCT

Результат:

[{"name":"NEW_PRODUCT","enabled":true,"strategy":null,"params":{},"metadata":{"label":"NEW_PRODUCT","groups":[],"enabledByDefault":true,"attributes":{}}}]

Отправьте новый запрос GET на конечную точку /demo и проверьте журнал приложения:

c.togglz.demo.controller.DemoController : new product feature enabled

Большой! Теперь новый код работает.

Консоль администратора Togglz

Если вы хотите управлять переключателями без POST запросов, вы можете использовать консоль администрирования Togglz: http://localhost:8080/togglz-console/index

Обратите внимание, что если вы не используете Spring Security, консоль будет недоступна. Это происходит потому, что приложение получает NoOpUserProvider и не может найти пользователя с ролью для доступа к консоли администратора. Чтобы преодолеть это, вы можете установить для свойства togglz.console.secured значение false. Но, конечно, это не рекомендуется для производственных сред.

Модифицированный application.yml выглядит так:

togglz:
  features:
    NEW_PRODUCT:
      enabled: false
  console:
    secured: false

management:
  endpoints:
    web:
      exposure:
        include: 'togglz'

Вот так выглядит консоль:

Вы можете изменить статус с «Включено» на «Отключено» во время выполнения. Это выгодно, потому что не требует повторного развертывания приложения.

Стратегии активации

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

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

Обратите внимание, что вы должны настроить стратегию после каждой перезагрузки! Реализация по умолчанию работает в памяти.

Сохранять изменения состояния

К счастью, есть способ сохранить изменения стратегии активации. Togglz предоставляет репозитории состояния. Например, FileBasedStateRepository, JDBCStateRepository или любой другой поддерживаемый StateRepository.

Самый простой — использовать файл FileBasedStateRepository. Вы можете изменить состояние объектов в простом файле свойств. Вам не нужна консоль администратора, если у вас есть доступ к серверу, на котором запущено приложение.

Давайте посмотрим на пример локального рабочего каталога.

  1. Создайте новый файл в корневом каталоге проекта с именем feature.properties.

2. Добавьте функцию с помощью этого фрагмента кода:

NEW_PRODUCT=true

3. См. features-file в конфигурации application.yml:

togglz:
  features:
    NEW_PRODUCT:
      enabled: false
  features-file: 'file:./feature.properties'

Теперь вы можете активировать/деактивировать состояние в feature.properties во время выполнения. Он будет сохранен после перезапуска приложения.

Обратите внимание, что состояние в файле feature.properties будет иметь приоритет над файлом application.yml !

Чтобы узнать больше о репозиториях состояний, ознакомьтесь с документацией.

Заключение

В этой статье вы узнали, почему переключатели функций полезны и как использовать библиотеку Togglz в приложении Spring Boot.

Как видите, это просто и не требует глубоких знаний для начала.

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

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

Исходный код этого руководства можно найти в моем репозитории GitHub.

Я надеюсь, что вы узнали что-то ценное из этого поста. Спасибо за чтение и удачного кодирования!