
Если вы используете флаг функции GO, пожалуйста, подумайте о том, чтобы добавить себя в список усыновителей.
Этот простой акт значительно повышает видимость и доверие проекта, внося существенный вклад в его продвижение.Если вы хотите поддержать меня и флаг функции Go, вы также можете стать спонсором.
Флаг функции Go-это легкое решение и решение с открытым исходным кодом, которое обеспечивает простую и полную реализацию флага функций.
Решение было создано для облегчения использования флагов функций в вашем коде с самой легкой настройкой.
Первоначально флаг функции GO был разработан как решение исключительно для языка GO . Благодаря новой стандартизации флагов функций с помощью проекта OpenFeature, решение теперь доступно для нескольких языков (список поддерживаемых языков) через простой API -сервер, который называется прокси -реле, который может быть размещен.
Кончик
Если вы не знакомы с флагами функций, я написал статью, в которой объясняется, почему флаги функций могут закрепить ваш цикл итерации.
HTTP , S3 , Kubernetes , см. Полный список ).JSON , TOML и YAML ).S3 , Google cloud storage , file , см. В полном списке ) .webhook и slack ) . Код этой демонстрации доступен в examples/demo репозитории .
Важный
Перед началом использования флаг функции Go вы должны решить, хотите ли вы использовать Open Fecute SDKS или если вы хотите использовать флаг функции GO в качестве модуля GO.
Мы рекомендуем использовать реле-прокси для решения для управления и оценкой центрального управления флагами, оно обеспечивает поддержку с несколькими языками и легко интегрируется с SDK с открытыми функциями.
Это лучший способ получить полный потенциал флага функции GO.
Если ваш проект находится исключительно в Go, модуль GO является вариантом. Он выполнит оценку флага непосредственно в вашем коде GO.
Создайте новый файл YAML , содержащий вашу первую конфигурацию флага.
# 20% of the users will use the variation "my-new-feature"
test-flag :
variations :
my-new-feature : true
my-old-feature : false
defaultRule :
percentage :
my-new-feature : 20
my-old-feature : 80 Этот флаг разделил использование этого флага, 20% будут использовать вариацию my-new-feature и 80% вариации my-old-feature .
Создайте новый файл YAML , содержащий конфигурацию вашего реле.
listen : 1031
pollingInterval : 1000
startWithRetrieverError : false
retriever :
kind : file
path : /goff/flag-config.yaml
exporter :
kind : log И мы запустим реле прокси локально, чтобы сделать API доступным.
Порт по умолчанию будет 1031 .
# Launch the container
docker run
-p 1031:1031
-v $( pwd ) /flag-config.yaml:/goff/flag-config.yaml
-v $( pwd ) /goff-proxy.yaml:/goff/goff-proxy.yaml
gofeatureflag/go-feature-flag:latest
Если вы не хотите использовать Docker для установки реле, вы можете следить за другими способами его установки в документацию.
В этом примере мы используем Nodejs SDK , но вы можете проверить другие языки здесь.
npm i @openfeature/server-sdk @openfeature/go-feature-flag-providerВ инициализации вашего приложения вы должны создать клиента, используя SDK Open и инициализировать его.
const { OpenFeature } = require ( "@openfeature/server-sdk" ) ;
const { GoFeatureFlagProvider } = require ( "@openfeature/go-feature-flag-provider" ) ;
// init Open Feature SDK with GO Feature Flag provider
const goFeatureFlagProvider = new GoFeatureFlagProvider ( {
endpoint : 'http://localhost:1031/' // DNS of your instance of relay proxy
} ) ;
OpenFeature . setProvider ( goFeatureFlagProvider ) ;
const featureFlagClient = OpenFeature . getClient ( 'my-app' ) Теперь вы можете оценить свои флаги в любом месте вашего кода, используя этого клиента.
// Context of your flag evaluation.
// With GO Feature Flag you MUST provide a targetingKey that is a unique identifier of the user.
const evaluationContext = {
targetingKey : '1d1b9238-2591-4a47-94cf-d2bc080892f1' , // user unique identifier (mandatory)
firstname : 'john' ,
lastname : 'doe' ,
email : '[email protected]' ,
admin : true , // this field is used in the targeting rule of the flag "flag-only-for-admin"
// ...
} ;
const adminFlag = await featureFlagClient . getBooleanValue ( 'flag-only-for-admin' , false , evaluationContext ) ;
if ( adminFlag ) {
// flag "flag-only-for-admin" is true for the user
console . log ( "new feature" ) ;
} else {
// flag "flag-only-for-admin" is false for the user
}go get github.com/thomaspoignant/go-feature-flag Создайте новый файл YAML , содержащий вашу первую конфигурацию флага.
# 20% of the users will use the variation "my-new-feature"
test-flag :
variations :
my-new-feature : true
my-old-feature : false
defaultRule :
percentage :
my-new-feature : 20
my-old-feature : 80 Этот флаг разделил использование этого флага, 20% будут использовать вариацию my-new-feature и 80% вариации my-old-feature .
Во -первых, вам нужно инициализировать ffclient с расположением вашего бэкэнд -файла.
err := ffclient . Init (ffclient. Config {
PollingInterval : 3 * time . Second ,
Retriever : & fileretriever. Retriever {
Path : "flag-config.goff.yaml" ,
},
})
defer ffclient . Close ()Этот пример будет загружать файл с вашего локального компьютера и обновлять флаги каждые 3 секунды (если вы опускаете опрос, значение по умолчанию составляет 60 секунд).
ℹ Информация
Это базовая конфигурация для тестирования локально, в производстве лучше использовать удаленное место для хранения файла конфигурации флага функций.
Посмотрите на список доступных параметров на странице «Хранить файл флага» .
Теперь вы можете оценить свои флаги в любом месте вашего кода.
user := ffcontext . NewEvaluationContext ( "user-unique-key" )
hasFlag , _ := ffclient . BoolVariation ( "test-flag" , user , false )
if hasFlag {
// flag "test-flag" is true for the user
} else {
// flag "test-flag" is false for the user
} Полная документация доступна на https://docs.gofeatureflag.org
Вы можете найти больше примеров в примерах/ каталоге.
Первоначально флаг POST FLACK был построен, чтобы быть библиотекой только GOLANG, но он слишком сильно ограничивает экосистему.
Чтобы быть совместимым с большим количеством языков, мы внедрили прокси -сервер функций Go. Это сервис, который вы можете размещать, которая предоставляет API для оценки ваших флагов, вы можете позвонить в него, используя HTTP, чтобы получить вариант.
Поскольку мы верим в стандартизацию, мы также внедряем поставщиков открытых функций для взаимодействия с этим API на языке по вашему выбору.
(OpenFeature все еще находится на ранней стадии, поэтому не все языки поддерживаются и ожидают некоторых изменений в будущем)
На данный момент у нас есть поставщики для:
| Язык | Источник провайдера | Версия |
|---|---|---|
| Идти | Go Provider | |
| Java / Kotlin (сервер) | Java -провайдер | |
| Android / Kotlin (клиент) | Котлин поставщик | |
| JavaScript/TypeScript (сервер) | Провайдер сервера | |
| JavaScript/TypeScript (клиент) | Клиент -поставщик | |
| Питон | Поставщик Python | |
| .Сеть | .NET Provider | |
| Рубин | Рубиновый провайдер | |
| Быстрый | Swift Provider | |
| PHP | PHP -провайдер |
Модуль поддерживает различные способы извлечения файла флага.
Доступные ретриверы:
Смотрите полный список и дополнительную информацию.
Основная функция флага GO для централизации всех ваших функций в одном файле и, чтобы избежать хостинга и поддержания сервера для управления ими.
Ваш файл должен быть файлом YAML , JSON или TOML со списком флагов (примеры: YAML , JSON , TOML ) .
Самый простой способ создания файла конфигурации - использовать редактор функций Go по адресу https://editor.gofeatureflag.org.
Если вы предпочитаете делать это вручную, следуйте инструкции ниже.
Конфигурация флага выглядит следующим образом:
# This is your configuration for your first flag
first-flag :
variations : # All possible return value for your feature flag
A : false
B : true
targeting : # If you want to target a subset of your users in particular
- query : key eq "random-key"
percentage :
A : 0
B : 100
defaultRule : # When no targeting match we use the defaultRule
variation : A
# A second example of a flag configuration
second-flag :
variations :
A : " valueA "
B : " valueB "
defaultValue : " a default value "
targeting :
- name : notkey_rule
query : key eq "not-a-key"
percentage :
A : 10
B : 90
defaultRule :
variation : defaultValue
version : " 12 "
experimentation :
start : 2021-03-20T00:00:00.1-05:00
end : 2021-03-21T00:00:00.1-05:00{
"first-flag" : {
"variations" : {
"A" : false ,
"B" : true
},
"targeting" : [
{
"query" : " key eq " random-key " " ,
"percentage" : {
"A" : 0 ,
"B" : 100
}
}
],
"defaultRule" : {
"variation" : " A "
}
},
"second-flag" : {
"variations" : {
"A" : " valueA " ,
"B" : " valueB " ,
"defaultValue" : " a default value "
},
"targeting" : [
{
"name" : " notkey_rule " ,
"query" : " key eq " not-a-key " " ,
"percentage" : {
"A" : 10 ,
"B" : 90
}
}
],
"defaultRule" : {
"variation" : " defaultValue "
},
"version" : " 12 " ,
"experimentation" : {
"start" : " 2021-03-20T05:00:00.100Z " ,
"end" : " 2021-03-21T05:00:00.100Z "
}
}
}[ first-flag . variations ]
A = false
B = true
[[ first-flag . targeting ]]
query = ' key eq "random-key" '
[ first-flag . targeting . percentage ]
A = 0
B = 100
[ first-flag . defaultRule ]
variation = " A "
[ second-flag ]
version = " 12 "
[ second-flag . variations ]
A = " valueA "
B = " valueB "
defaultValue = " a default value "
[[ second-flag . targeting ]]
name = " notkey_rule "
query = ' key eq "not-a-key" '
[ second-flag . targeting . percentage ]
A = 10
B = 90
[ second-flag . defaultRule ]
variation = " defaultValue "
[ second-flag . experimentation ]
start = 2021-03-20T05:00:00.100Z
end = 2021-03-21T05:00:00.100ZДля получения подробной информации о полях, необходимых для создания флага, пожалуйста, обратитесь к документации.
Формат запроса основан на библиотеке nikunjy/rules .
Все операции могут быть записаны в капитализированном или строчном положении (пример: eq или EQ можно использовать).
Логические операции поддерживаются AND OR .
Сравните выражение и их определения ( a|b означает, что вы можете использовать один из двух a или b ):
eq|==: equals to
ne|!=: not equals to
lt|<: less than
gt|>: greater than
le|<=: less than equal to
ge|>=: greater than equal to
co: contains
sw: starts with
ew: ends with
in: in a list
pr: present
not: not of a logical expression
key eq "[email protected]"anonymous ne trueuserId eq "12345" Контекст оценки в системе помещения функции имеет решающее значение для определения вывода оценки флага признаков. Это набор соответствующих данных об условиях, при которых проводится оценка. Эти данные могут быть предоставлены через сочетание статической информации (имя сервера, IP и т. Д.) и динамических входов (информация о пользователе, выполняющем действие и т. Д.), А также с информацией о состоянии, которая неявно переносится посредством выполнения программы.
При использовании функции GO, часто необходимо персонализировать опыт для разных пользователей. Здесь вступает концепция ключа целевого . Ключ для таргетирования - это уникальный идентификатор, который представляет контекст оценки (электронная почта, идентификатор сеанса, отпечаток пальца или что -либо, что является последовательным) , гарантируя, что они постоянно подвергаются одному и тому же изменению функции, даже во многих посещениях или сеансах.
Например, флаг функции GO гарантирует, что в тех случаях, когда функция развертывается до процента пользователей, основываясь на ключке нацеливания, они будут видеть одинаковые вариации каждый раз, когда сталкиваются с флагом объектов.
Ключ для таргетирования является фундаментальной частью контекста оценки, поскольку он непосредственно влияет на определение того, какой вариант функции обслуживается конкретному пользователю, и он поддерживает эту непрерывность во времени. Чтобы сделать это флаг, чтобы сделать хэш, чтобы определить, может ли флаг применить этот контекст оценки или нет.
Мы рекомендуем использовать хэш, если это возможно.
Таргетирование и развертывание флага и развертывание определяются пользователем, которого вы передаете на свои оценки.
В некоторых случаях вам может потребоваться ведет пользователей на основе другого ключа, например, teamId , чтобы пользователи в одной команде подвергались воздействию одного и того же вариации флага и получают постоянный опыт.
Это может быть достигнуто путем определения поля bucketingKey в конфигурации флага. При наличии значения, соответствующего bucketingKey будет извлечено из атрибутов, и это значение, используемое для хэширования и определения результата вместо targetingKey .
Вариации являются различными значениями, возможными для флага признаков.
Флаг функции GO может управлять большим, чем просто boolean значения; Значение вашего флага может быть любым из следующих типов:
boolintfloatstringjson arrayjson object Boolean result = featureFlagClient . getBooleanValue ( "your.feature.key" , false , userContext );
// this example is using the java SDK
// result is now true or false depending on the setting of this boolean feature flagМетоды вариации принимают ключ флага функции, контекст оценки и значение по умолчанию .
Зачем нам значение по умолчанию? Если у нас есть какие -либо ошибки во время оценки флага, мы вернем значение по умолчанию, вы всегда получите возвращение значения от функции, и мы никогда не вынесем ошибки.
В примере, если флаг your.feature.key не существует, результат будет false .
Обратите внимание, что результат всегда будет обеспечивать полезное значение.
Критической частью каждого нового выпуска функций является оркестровая график запуска между командами продукта, инженерии и маркетинга.
Предоставление мощного опыта пользователей, как правило, требует, чтобы программные команды управляли сложными выпусками и делали ручные обновления в неудобные времена.
Но это не должно, чтобы иметь сложную стратегию развертывания позволяет вам иметь жизненный цикл для ваших флагов.
Если вы хотите быть проинформированным, когда флаг изменился, вы можете настроить уведомление .
Уведомление отправит одно уведомление в целевую систему, чтобы сообщить им, что новая конфигурация флага была загружена.
Флаг функции Go может обрабатывать более одного уведомления за раз.
Доступные уведомления:
Флаг функции Go позволяет экспортировать данные об использовании ваших флагов.
Он собирает все события вариации и может сохранить эти события в нескольких местах:
В настоящее время мы поддерживаем только события функций.
Он представляет индивидуальные оценки флага и считается событиями «полной верности».
Пример функционального события ниже:
{
"kind" : " feature " ,
"contextKind" : " anonymousUser " ,
"userKey" : " ABCD " ,
"creationDate" : 1618228297 ,
"key" : " test-flag " ,
"variation" : " Default " ,
"value" : false ,
"default" : false ,
"source" : " SERVER "
}Формат данных описан в документации. События собираются и отправляются оптом, чтобы избежать спама вашего экспортера.
Доступен инструмент командной строки, который поможет вам пробиться в файл конфигурации: Go-Feature-Flag-Lint.
Этот проект приветствует вклад сообщества. Если вы заинтересованы в соревнованиях, см. Руководство участников для некоторых полезных советов.
Поскольку у всех очень важен голос, мы хотим услышать от сообщества.
По этой причине мы проводим встречу сообщества каждые 2 недели, и это идеальное место для обсуждения флага Future of Go и помогать вам использовать его в полном потенциале.
| Имя | Время встречи | Примечания встречи | Обсуждения |
|---|---|---|---|
| Go Feature Flag Meeting Community Meeting | Каждый четверг в 10:00 по восточному времени / 16:00. | Google Doc | Ссылка VC (встретиться) |
Большое спасибо нашим участникам.
Станьте спонсором и покажите свою поддержку, чтобы флаг функции Go.
Это наши действительно крутые спонсоры!

Если вы используете go-feature-flag , мы рекомендуем вам включить имя вашей компании в этот список. Этот простой акт значительно повышает видимость и доверие проекта, внося существенный вклад в его продвижение. Для этого любезно добавьте себя к усыновителям.
Вот список усыновителей.