
หากคุณใช้ ธงฟีเจอร์ GO โปรดพิจารณาเพิ่มตัวเองในรายการผู้ใช้
การกระทำที่เรียบง่ายนี้ช่วยเพิ่มการมองเห็นและความน่าเชื่อถือของโครงการอย่างมีนัยสำคัญทำให้มีส่วนร่วมอย่างมากต่อความก้าวหน้าหากคุณต้องการสนับสนุนฉันและไปฟีเจอร์ธงคุณสามารถเป็นสปอนเซอร์ได้
GO Feature Flag เป็นโซลูชันที่มีน้ำหนักเบาและโอเพ่นซอร์สที่ให้การใช้งานการตั้งค่าสถานะคุณสมบัติที่เรียบง่ายและสมบูรณ์
โซลูชันถูกสร้างขึ้นเพื่ออำนวยความสะดวกในการใช้ธงฟีเจอร์ในรหัสของคุณด้วยการตั้งค่าที่ง่ายที่สุดเท่าที่จะเป็นไปได้
เดิมที ธงฟีเจอร์ Go ได้รับการออกแบบเป็นโซลูชันเฉพาะสำหรับภาษา GO ด้วยมาตรฐานใหม่ของ Feature Flags โดยโครงการ OpenFeature ทำให้โซลูชันพร้อมใช้งานสำหรับหลายภาษา (รายการภาษาที่รองรับ) ผ่านเซิร์ฟเวอร์ API อย่างง่ายที่เรียกว่ารีเลย์พร็อกซีซึ่งสามารถโฮสต์ได้
เคล็ดลับ
หากคุณไม่คุ้นเคยกับธงฟีเจอร์ฉันได้เขียนบทความซึ่งอธิบายว่าทำไมธงฟีเจอร์จึงสามารถยึดวงจรการวนซ้ำของคุณได้
HTTP , S3 , Kubernetes , ดูรายการเต็ม )JSON , TOML และ YAML )S3 , Google cloud storage , file ดู รายการทั้งหมด )webhook และ slack ) รหัสของการสาธิตนี้มีอยู่ใน examples/demo
สำคัญ
ก่อนที่จะเริ่มใช้ ธงฟีเจอร์ Go คุณควรตัดสินใจว่าคุณต้องการใช้ SDK แบบเปิดหรือหากคุณต้องการใช้ Feature Flag เป็นโมดูล 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 วินาที (หากคุณละเว้นการสำรวจความคิดเห็นค่าเริ่มต้นคือ 60 วินาที)
ℹข้อมูล
นี่คือการกำหนดค่าพื้นฐานในการทดสอบในเครื่องในการผลิตจะเป็นการดีกว่าที่จะใช้สถานที่ระยะไกลเพื่อจัดเก็บไฟล์การกำหนดค่าธงฟีเจอร์ของคุณ
ดูรายการตัวเลือกที่มีอยู่ในหน้า จัดเก็บไฟล์ FATIAL FLAG FILE
ตอนนี้คุณสามารถประเมินธงของคุณได้ทุกที่ในรหัสของคุณ
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/typeScript (เซิร์ฟเวอร์) | ผู้ให้บริการเซิร์ฟเวอร์ | |
| JavaScript/typeScript (ไคลเอนต์) | ผู้ให้บริการลูกค้า | |
| งูหลาม | ผู้ให้บริการ Python | |
| .สุทธิ | . NET ผู้ให้บริการ | |
| ทับทิม | ผู้ให้บริการทับทิม | |
| ฉับพลัน | ผู้ให้บริการที่รวดเร็ว | |
| PHP | ผู้ให้บริการ PHP |
โมดูลรองรับวิธีที่แตกต่างกันในการดึงไฟล์ FLAG
Retrievers ที่มีอยู่คือ:
ดูรายการทั้งหมดและข้อมูลเพิ่มเติม
ฟีเจอร์ฟีเจอร์ฟีเจอร์ฟีเจอร์ ฟีเจอร์หลักคือการรวมศูนย์คุณสมบัติทั้งหมดของคุณไว้ในไฟล์เดียวและเพื่อหลีกเลี่ยงการโฮสต์และบำรุงรักษาเซิร์ฟเวอร์แบ็กเอนด์เพื่อจัดการ
ไฟล์ของคุณควรเป็นไฟล์ 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 มักจะจำเป็นต้องปรับแต่งประสบการณ์สำหรับผู้ใช้ที่แตกต่างกัน นี่คือที่แนวคิดของคีย์ การกำหนดเป้าหมาย เข้ามาเล่น คีย์การกำหนดเป้าหมายเป็นตัวระบุที่ไม่ซ้ำกันซึ่งแสดงถึงบริบทของการประเมินผล (อีเมล, ID เซสชัน, ลายนิ้วมือหรืออะไรก็ตามที่สอดคล้องกัน) เพื่อให้แน่ใจว่าพวกเขาจะสัมผัสกับการเปลี่ยนแปลงของคุณสมบัติเดียวกันอย่างต่อเนื่องแม้กระทั่งในการเยี่ยมชมหรือการประชุมหลายครั้ง
ตัวอย่างเช่น Feature Flag ทำให้มั่นใจได้ว่าในกรณีที่คุณลักษณะกำลังถูกเปิดตัวเป็นเปอร์เซ็นต์ของผู้ใช้ตามคีย์การกำหนดเป้าหมายพวกเขาจะเห็นการเปลี่ยนแปลงเดียวกันในแต่ละครั้งที่พวกเขาพบกับธงฟีเจอร์
คีย์การกำหนดเป้าหมายเป็นส่วนพื้นฐานของบริบทการประเมินผลเนื่องจากมีผลโดยตรงต่อการพิจารณาว่าตัวแปรคุณลักษณะใดที่ให้บริการแก่ผู้ใช้เฉพาะและรักษาความต่อเนื่องไว้ตลอดเวลา หากต้องการทำธงฟีเจอร์ให้ทำแฮชเพื่อกำหนดว่าธงสามารถนำไปใช้กับบริบทการประเมินนี้หรือไม่
เราขอแนะนำให้ใช้แฮชถ้าเป็นไปได้
การกำหนดเป้าหมายการตั้งค่าสถานะและการเปิดตัวทั้งหมดจะถูกกำหนดโดยผู้ใช้ที่คุณส่งผ่านไปยังการโทรประเมินผลของคุณ
ในบางกรณีคุณอาจต้องใช้กับผู้ใช้ ตาม คีย์ที่แตกต่างกันเช่น 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 ไม่มีคุณลักษณะ Key ไม่มีอยู่ผลลัพธ์จะเป็น false
โปรดทราบว่าผลลัพธ์จะให้ค่าที่ใช้งานได้เสมอ
ส่วนสำคัญของการเปิดตัวฟีเจอร์ใหม่ทุกครั้งคือการจัดตารางการเปิดตัวจริงระหว่างทีมงานวิศวกรรมและทีมการตลาด
การส่งมอบประสบการณ์ผู้ใช้ที่ทรงพลังมักจะต้องมีทีมงานซอฟต์แวร์ในการจัดการการเปิดตัวที่ซับซ้อนและทำการอัปเดตด้วยตนเองในเวลาที่ไม่สะดวก
แต่ไม่จำเป็นต้องมีกลยุทธ์ การเปิดตัว ที่ซับซ้อนช่วยให้คุณมีวงจรชีวิตสำหรับธงของคุณ
หากคุณต้องการได้รับการแจ้งเมื่อธงมีการเปลี่ยนแปลงคุณสามารถกำหนดค่า ตัวแจ้งเตือน
ผู้แจ้งเตือนจะส่งการแจ้งเตือนหนึ่งครั้งไปยังระบบเป้าหมายเพื่อแจ้งให้ทราบว่ามีการโหลดการกำหนดค่าธงใหม่แล้ว
ธงฟีเจอร์ GO สามารถจัดการผู้แจ้งเตือนได้มากกว่าหนึ่งครั้ง
ผู้แจ้งเตือนที่มีอยู่คือ:
GO Feature Flag ช่วยให้คุณส่งออกข้อมูลเกี่ยวกับการใช้ธงของคุณ
มันรวบรวมเหตุการณ์การเปลี่ยนแปลงทั้งหมดและสามารถบันทึกเหตุการณ์เหล่านี้ในหลายสถานที่:
ขณะนี้เราสนับสนุนกิจกรรมคุณสมบัติเท่านั้น
มันแสดงถึงการประเมินค่าสถานะของแต่ละบุคคลและถือว่าเป็นเหตุการณ์ "ความจงรักภักดีเต็มรูปแบบ"
ตัวอย่างคุณลักษณะตัวอย่างด้านล่าง:
{
"kind" : " feature " ,
"contextKind" : " anonymousUser " ,
"userKey" : " ABCD " ,
"creationDate" : 1618228297 ,
"key" : " test-flag " ,
"variation" : " Default " ,
"value" : false ,
"default" : false ,
"source" : " SERVER "
}รูปแบบของข้อมูลอธิบายไว้ในเอกสาร มีการรวบรวมเหตุการณ์และส่งเป็นกลุ่มเพื่อหลีกเลี่ยงการส่งสแปมผู้ส่งออกของคุณ
เครื่องมือบรรทัดคำสั่งสามารถช่วยให้คุณผ้าสำลีไฟล์กำหนดค่าของคุณ: go-flag-flag-lint
โครงการนี้ยินดีต้อนรับการมีส่วนร่วมจากชุมชน หากคุณสนใจที่จะมีส่วนร่วมให้ดูคู่มือผู้ร่วมให้ข้อมูลสำหรับเคล็ดลับที่เป็นประโยชน์
เนื่องจากเสียงของทุกคนมีความสำคัญเราจึงต้องการรับฟังความคิดเห็นจากชุมชน
ด้วยเหตุนี้เราจึงเปิดตัวการประชุมชุมชนทุก 2 สัปดาห์และเป็นสถานที่ที่เหมาะสำหรับการหารือเกี่ยวกับอนาคตของธงฟีเจอร์ GO และช่วยให้คุณใช้งานได้อย่างเต็มที่
| ชื่อ | เวลาประชุม | บันทึกการประชุม | การอภิปราย |
|---|---|---|---|
| ไปพบกับการประชุมชุมชนธง | ทุกวันพฤหัสบดีเวลา 10:00 น. ET / 16:00 CET | Google Doc | ลิงค์ VC (พบ) |
ขอบคุณมากสำหรับผู้มีส่วนร่วมของเรา
เป็นสปอนเซอร์และแสดงการสนับสนุนของคุณเพื่อไปธงฟีเจอร์
นี่คือสปอนเซอร์ที่ยอดเยี่ยมของเราจริงๆ!

หากคุณใช้ go-feature-flag เราขอแนะนำให้คุณรวมชื่อ บริษัท ของคุณไว้ในรายการนี้ การกระทำที่เรียบง่ายนี้ช่วยเพิ่มการมองเห็นและความน่าเชื่อถือของโครงการอย่างมีนัยสำคัญทำให้มีส่วนร่วมอย่างมากต่อความก้าวหน้า หากต้องการทำเช่นนั้นโปรดเพิ่มตัวเองให้กับผู้ใช้
นี่คือรายการของผู้ใช้