Полное руководство по упрощению развертывания функций без повторного развертывания с помощью библиотеки 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
. Вы можете изменить состояние объектов в простом файле свойств. Вам не нужна консоль администратора, если у вас есть доступ к серверу, на котором запущено приложение.
Давайте посмотрим на пример локального рабочего каталога.
- Создайте новый файл в корневом каталоге проекта с именем
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.
Я надеюсь, что вы узнали что-то ценное из этого поста. Спасибо за чтение и удачного кодирования!