
如果您使用的是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 ,我們鼓勵您將公司的名稱包括在此列表中。這一簡單的行為大大提高了該項目的可見性和信譽,從而為其進步做出了重大貢獻。為此,請將自己加入收養者。
這是採用者的清單。