
如果您使用的是GO功能标志,请考虑将自己添加到“采用者”列表中。
这一简单的行为大大提高了该项目的可见性和信誉,从而为其进步做出了重大贡献。如果您想支持我并获得功能标志,也可以成为赞助商。
GO功能标志是一种轻巧且开源的解决方案,可提供简单而完整的功能标志实现。
该解决方案的构建是为了促进代码中功能标志的使用,并最容易设置。
最初, GO功能标志设计为专门用于GO语言的解决方案。通过OpenFeature项目对功能标志的新标准化,该解决方案现在可以通过称为“中继代理”的简单API服务器用于多种语言(支持语言列表) ,可以托管。
提示
如果您不熟悉功能标志,我写了一篇文章,说明了为什么功能标志可以固定您的迭代周期。
HTTP , S3 , Kubernetes ,请参阅完整列表)。JSON , TOML和YAML )。S3 , Google cloud storage , file ,请参阅完整列表) 。webhook和slack ) 。该演示的代码可在examples/demo存储库中获得。
重要的
在开始使用GO功能标志之前,您应该确定是否要使用打开的功能SDK,还是要使用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创建客户端并初始化它。
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秒刷新标志(如果您省略了PollingInterval,则默认值为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上找到
您可以在示例/目录中找到更多示例。
最初构建了Go Feature Flag是仅是Golang的库,但它限制了生态系统太多。
要与更多语言兼容,我们已经实现了GO功能标志继电器代理。您可以托管这项服务可以提供API来评估您的标志,可以使用HTTP调用它以获取变化。
由于我们相信标准化,我们还在实施OpenFeature提供商,以您选择的语言与此API进行交互。
(OpenFeature仍处于早期阶段,因此并非所有语言都得到支持,并期望将来会有一些变化)
目前,我们有:
| 语言 | 提供商来源 | 版本 |
|---|---|---|
| 去 | 去提供商 | |
| Java / Kotlin(服务器) | Java提供商 | |
| Android / Kotlin(客户端) | Kotlin提供商 | |
| JavaScript/tyspript(服务器) | 服务器提供商 | |
| JavaScript/tyspript(客户端) | 客户提供商 | |
| Python | Python提供商 | |
| 。网 | .NET提供商 | |
| 红宝石 | 红宝石提供商 | |
| 迅速 | Swift提供商 | |
| php | PHP提供商 |
该模块支持检索标志文件的不同方式。
可用的检索器是:
请参阅完整列表和更多信息。
GO功能标志核心功能是将您的所有功能标志集中在一个文件中,并避免托管和维护后端服务器来管理它们。
您的文件应该是带有标志列表的YAML , JSON或TOML文件(示例: YAML , JSON , TOML ) 。
创建配置文件的最简单方法是在https://editor.gofeatureflag.org上使用GO Feature Flag Editor 。
如果您愿意手动进行操作,请按照下面的说明进行操作。
标志配置看起来像这样:
# 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功能标志时,通常有必要为不同用户个性化体验。这就是目标键的概念发挥作用。定位密钥是一个唯一的标识符,它表示评估的上下文(电子邮件,会话ID,指纹或任何一致的任何内容) ,从而确保它们始终如一地暴露于功能的相同变化,即使在多次访问或会话中也是如此。
例如,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变体方法采用功能标志密钥,评估上下文和默认值。
为什么我们需要默认值?如果在评估标志期间有任何错误,我们将返回默认值,您将始终从函数中获得一个值返回,我们将永远不会丢弃错误。
在示例中,如果您的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周发起一次社区会议,是讨论Go Feature Flag的未来并帮助您充分利用它的理想场所。
| 姓名 | 会议时间 | 会议笔记 | 讨论 |
|---|---|---|---|
| 去功能旗社区会议 | 每隔一个星期四,美国东部时间10:00 AM / 16:00 CET | Google文档 | VC链接(见面) |
非常感谢我们的贡献者。
成为赞助商,并向您的支持来获得功能标志。
这些是我们非常酷的赞助商!

如果您使用的go-feature-flag ,我们鼓励您将公司的名称包括在此列表中。这一简单的行为大大提高了该项目的可见性和信誉,从而为其进步做出了重大贡献。为此,请将自己加入收养者。
这是采用者的清单。