Флаги функций позволяют постепенно развертывать функции, а не делать рискованный запуск большого взрыва, и чрезвычайно полезны при использовании в условиях непрерывной интеграции и непрерывной доставки.
В Optimizely мы обычно используем флаги функций, чтобы уменьшить риск сложных развертываний, таких как развертывание новых API.
Создание системы маркировки функций обычно не является основной сферой деятельности вашей компании и может отвлекать от других усилий по разработке.
Я Аса, адвокат разработчика Optimizely. В этой статье, состоящей из восьми шагов, я покажу, как получить значение мощных флагов функций, разворачивая функцию «клиент-клиент» в Express, используя Optimizely Rollouts — совершенно бесплатный продукт.
Вам также может понравиться: Руководство по использованию флагов Ultimate Feature: что это такое, как их использовать и как начать работу.
Примечание. Если у вас нет приложения Express, мы рекомендуем создать его с помощью Express-Generator .
Шаги по развертыванию функции
1. Настройте интерфейс флага функции
Создайте бесплатный аккаунт Optimizely Rollouts здесь .
В интерфейсе развертывания перейдите к пункту «Функции> Создать новую функцию» и создайте флаг функции под названием «hello_world».
Чтобы подключить функцию hello_world к вашему приложению, найдите ключ SDK. Перейдите в «Настройки> Файл данных» и скопируйте значение ключа SDK.
2. Установите промежуточное программное обеспечение Optimizely Rollouts Express
Промежуточное программное обеспечение Node Express позволяет вам настраивать переключатели функций из вашей кодовой базы, используя JavaScript.
Используя npm:
npm install --save @optimizely/express
или используя пряжу:
yarn add @optimizely/express
Используйте промежуточное программное обеспечение Express, предварительно настроив SDK в начале вашего экспресс-сервера. Мы рекомендуем размещать его рядом с другими импортами в верхней части файла app.js или index.js. Кроме того, не забудьте заменить <Your_SDK_Key> на ключ SDK, который вы нашли выше.
JavaScript
xxxxxxxxxx
1
const optimizelyExpress = require('@optimizely/express');
2
const optimizely = optimizelyExpress.initialize({
3
sdkKey: '<Your_SDK_Key>',
4
datafileOptions: {
5
autoUpdate: true, // Indicates feature flags will be auto-updated based on UI changes
6
updateInterval: 1*1000 // 1 second in milliseconds
7
},
8
logLevel: 'info', // Controls console logging. Can be 'debug', 'info', 'warn', or 'error'
9
});
- Автообновление: указывает, что ваши флаги функций будут автоматически обновляться после изменений, внесенных в пользовательский интерфейс Optimizely.
- UpdateInterval: указывает, как часто промежуточное ПО Optimizely Express будет запрашивать изменения. Мы рекомендуем увеличить интервал опроса при развертывании этого кода в рабочей среде.
Используйте промежуточное ПО, добавив следующее перед вашими экспресс-маршрутами:
app.use(optimizely.middleware);
Полный пример кода вашей установки теперь должен выглядеть примерно так:
JavaScript
xxxxxxxxxx
1
const express = require('express');
2
const app = express();
3
const HOST = process.env.HOST || '0.0.0.0';
5
const PORT = process.env.PORT || 8080;
6
const optimizelyExpress = require('@optimizely/express');
8
const optimizely = optimizelyExpress.initialize({
9
sdkKey: '<Your_SDK_Key>',
10
datafileOptions: {
11
autoUpdate: true, // Indicates feature flags will be auto-updated based on UI changes
12
updateInterval: 1*1000 // 1 second in milliseconds
13
},
14
logLevel: 'info', // Controls console logging. Can be 'debug', 'info', 'warn', or 'error'
15
});
16
app.use(optimizely.middleware);
18
app.get('/', function(req, res, next) {
20
res.send('Optimizely Express Example')
21
});
22
app.listen(PORT, HOST);
24
console.log(`Example App Running on http://${HOST}:${PORT}`);
25
module.exports = app;
3. Реализовать функцию
В дополнение к поддержанию конфигурации вашего флага функции в актуальном состоянии с изменениями, внесенными в пользовательский интерфейс , вышеуказанная установка добавляет следующий объект к каждому объекту экспресс-запроса:
Простой текст
xxxxxxxxxx
1
req.optimizely = {
2
datafile: A representation of all of your feature flags and
3
experiments as defined in Optimizely
4
client: The Optimizely SDK client instance which has methods like
5
for isFeatureEnabled, activate, track, etc. }
Чтобы реализовать функцию «hello_world», мы будем использовать isFeatureEnabled в клиентском поле этого объекта: найдите маршрут, к которому вы хотите добавить переключатель функции. Используйте API isFeatureEnabled, обойдя функциональный ключ hello_world к первому параметру isFeatureEnabled:
JavaScript
xxxxxxxxxx
1
app.get('/', function(req, res, next) {
2
const isEnabled = req.optimizely.client.isFeatureEnabled(
3
'hello_world', // Feature key connecting feature to UI
4
'user123', // String ID used for random percentage-based rollout
5
{
6
customerId: 123, // Attributes used for targeted audience-based rollout
7
isVip: true,
8
}
9
);
10
res.send('Optimizely Express Example: ' + (isEnabled ? 'You got the hello world feature!' : 'Feature off.'))
12
});
Параметры для isFeatureEnabled (featureKey, userId, userAttributes) следующие:
- FeatureKey : имя функции для подключения этого метода к интерфейсу Optimizely.
- UserId : Используется для выбора случайного процента пользователей, мы не будем использовать этот параметр в этом посте, пока оставим непустую строку.
- UserAttributes : используется для целевого развертывания среди ваших пользователей. Вы будете использовать эти атрибуты, чтобы настроить свою функцию для определенных групп пользователей, начиная с шага 5.
Возвращаемое значение isEnabled является логическим значением, указывающим, была ли функция включена или не включена для этих входов.
Ваш пример полного кода теперь выглядит следующим образом:
JavaScript
xxxxxxxxxx
1
const express = require('express');
2
const app = express();
3
const HOST = process.env.HOST || '0.0.0.0';
5
const PORT = process.env.PORT || 8080;
6
const optimizelyExpress = require('@optimizely/express');
8
const optimizely = optimizelyExpress.initialize({
9
sdkKey: '<Your_SDK_Key>',
10
datafileOptions: {
11
autoUpdate: true, // Indicates feature flags will be auto-updated based on UI changes
12
updateInterval: 1*1000 // 1 second in milliseconds
13
},
14
logLevel: 'info', // Controls console logging. Can be 'debug', 'info', 'warn', or 'error'
15
});
16
app.use(optimizely.middleware);
18
app.get('/', function(req, res, next) {
20
const isEnabled = req.optimizely.client.isFeatureEnabled(
21
'hello_world', // Feature key connecting feature to UI
22
'user123', // String ID used for random percentage-based rollout
23
{
24
customerId: 123, // Attributes used for targeted audience-based rollout
25
isVip: true,
26
}
27
);
28
res.send('Optimizely Express Example: ' + (isEnabled ? 'You got the hello world feature!' : 'Feature off.'))
30
});
31
app.listen(PORT, HOST);
33
console.log(`Example App Running on http://${HOST}:${PORT}`);
34
module.exports = app;
4. Включите функцию Toggle!
Если вы запустите свой сервер сейчас и откроете маршрут в браузере, вы заметите, что вы не получили эту функцию. Это потому, что эта функция не включена, что означает, что она отключена для всех посетителей вашего приложения.
Чтобы включить функцию:
- Перейдите к функциям.
- Нажмите на функцию «hello_world».
- Включите эту функцию и убедитесь, что она установлена на 100% (см. Скриншот ниже).
- Нажмите Сохранить, чтобы сохранить изменения.
Менее чем за минуту, не перезагружая работающий сервер, отправьте новый запрос на сервер, чтобы увидеть, как ваши изменения Optimizely вступают в силу. Ваше приложение должно теперь показать включенную функцию, и вы должны увидеть «У вас есть функция hello_world !!».
Вы успешно запустили свою функцию за флагом функции, но она доступна для всех. Следующим шагом является включение таргетинга, чтобы показать вашу функцию только определенному подмножеству пользователей, чтобы обеспечить истинную ценность развертывания функции от клиента к клиенту.
5. Создайте атрибут для CustomerId
Чтобы настроить таргетинг своей функции на основе атрибутов userAttributes, которые вы предоставили API isFeatureEnabled на шаге 3, вам нужно будет создать эти userAttributes в пользовательском интерфейсе Rollouts. Сделайте это с атрибутом customerId, чтобы начать:
- Перейдите к Аудитории -> Атрибуты.
- Нажмите «Создать новый атрибут…»
- Назовите ключ атрибута «customerId».
- Нажмите «Сохранить атрибут», чтобы сохранить изменения.
6. Создайте и добавьте бета-аудиторию
Теперь давайте создадим аудиторию, чтобы указать, какие customerIds получат доступ к вашей функции.
- Перейдите к функциям.
- Нажмите на свой hello_world.
- Прокрутите вниз до Аудитории.
- Нажмите «Создать новую аудиторию…»
- Назовите аудиторию «[hello_world] Beta Users».
- Перетащите свой атрибут customerId в условия аудитории.
- Измените раскрывающийся список «имеет любое значение» на «Число равно» со значением 123.
- Нажмите «Сохранить аудиторию».
Добавьте аудиторию к своей функции, нажав кнопку + рядом с вновь созданной аудиторией. Затем прокрутите вниз и нажмите «Сохранить».
Теперь, когда вы добавили аудиторию к своей функции, бета-версия запущена и работает. На данный момент ваша функция отображается только для клиентов с customerId 123, который вы предоставили API isFeatureEnabled в параметре userAttributes.
В качестве теста для проверки вы можете изменить свой customerId на 456, сохранить и посмотреть, как функция отключится, потому что вы не соответствуете условиям таргетинга.
7. Добавить пользователей в бета-версию
Чтобы добавить больше клиентов в свою бета-аудиторию, измените определение аудитории, чтобы добавить или удалить пользователей из бета-версии:
- Нажмите на знак «+» и сохраните, чтобы добавить бета-пользователей .
- Нажмите на знак «х» и сохраните его, чтобы удалить бета-пользователей.
В следующем примере скриншота три бета-версии были добавлены. Клиенты с идентификаторами: 123, 456 и 789 теперь будут иметь доступ к функции hello_world.
8. Запустите функцию
После включения вашей функции для достаточного количества клиентов, чтобы насладиться новым пользовательским интерфейсом, вы можете решить, что безопасно запускать эту функцию для всех клиентов.
Когда вы будете готовы запустить свою функцию из бета-версии, выполните следующие действия:
- Удалить аудиторию из вашей функции.
- Убедитесь, что развертывание настроено на 100%.
- Сохраните функцию.
Эта функция теперь доступна каждому, и вы успешно развернули функцию «hello_world» для каждого клиента, используя бесплатные флаги функций от Optimizely Rollouts в Node Express!
Следующие шаги
Несмотря на то, что в этой статье рассматриваются развертывания от клиента к клиенту, флаги функций включают дополнительные варианты использования, такие как не полагаться на долгоживущие ветви функций, создавать систему разрешений или включать A / B-тестирование на основе продукта в бэкэнде.
В Optimizely мы используем флаги функций для всех этих и других случаев.
Надеюсь, это было полезно! Оставьте отзыв, если есть. Я надеюсь, что мне удалось сэкономить некоторые ресурсы разработки вашей команды, позволив вам использовать всю мощь флагов функций с помощью нашего бесплатного продукта для маркировки функций: Optimizely Rollouts .
Дальнейшее чтение
Функциональные флаги как услуга: единственный способ, которым вы хотите функциональные флаги