作者 | Eugene
譯者 | 香檳超新星,責編 | 夕顏
出品 | CSDN(ID:CSDNnews)
Feature flags 技術讓軟體發布輕鬆不掉發
我可以確定的一點是,所有曾經有過向客戶發布軟體經歷的人都經歷過這樣的壓力和焦慮:你祈禱著,希望在投入生產後一切都還會像測試時那樣順利。
如果你對這種情景感到很熟悉,那麼我很高興你能讀到這篇文章,因為我將分享給你一種徹底消除這種痛苦的方法,而最棒的一點是這種方法並不複雜也不困難:它就是Feature Flags。
什麼是Feature flag?
簡而言之,可以把feature flag簡單地視為一個包圍你新功能代碼的「if」語句。如果flag被設置為on,則執行新代碼(即啟用新功能),否則就不執行。真的就是這麼簡單!
問題是,一旦開始使用feature flag,你很快就會發現,你會希望能夠以一種更加精細的方式來控制它們,而不僅僅是打開或關閉這麼粗放。
如何上手使用feature flag?
基本上來講,啟動並運行feature flag的方法有三種:
-
創建你自己的feature flag管理解決方案
-
使用開源項目
-
使用提供feature flag即服務的第三方供應商
在這篇文章中,我將與你分享有關使用feature flag即服務的事情,以及如何讓供應商把feature flag快速集成到你的開發流程中,並在同時得到你想要的那種對每個功能的精確控制。
今天我們要使用的feature flag即服務來自提供商Floodgate。Floodgate提供了開箱即用的feature flag解決方案,你很容易地就可以將其集成到代碼中,軟體發布中的風險立馬就降低了。
是時候揭開面紗了!我叫Eugene,是Floodgate的創始人。話雖這麼說,但我所提供的建議適用於上面說的任何一種實現方式。通常來說,使用feature flag都能夠降低軟體發行過程中的風險,益處多多。
準備階段
我將演示一個非常簡單的feature flag實施過程:我們將在一個名為Acme Online Store的電商網站上啟動一個新的「推薦商品」組件。通常,當我們部署代碼時,功能會立即上線,為所有客戶所見。而現在,我們將添加一個feature flag來控制何人,以及何時能看到「推薦商品」組件。
我們首先需要註冊Floodgate,然後獲得一個免費帳號。在Floodgate中,我們將需要創建一個「應用」(Application)以及一個「環境」(Environment)。你可以將這裡的「應用」視為你的項目,將「環境」視為你的代碼在開發周期中所經歷的不同環境。環境不在本文討論範圍之內,現在我們先創建一個名為「 Acme Online Store」的新應用,並使用一個名為「生產」(Production)的環境。創建後,你就能看到你的新的應用和環境了。
我希望你能注意一下上面圖上顯示的這一長串隨機字符,它叫做SDK密鑰,這是你的環境的唯一標識符,待會你在應用中配置SDK時會用到它。
創建了應用和環境後,就可以開始創建用於控制新的「推薦商品」組件的feature flag了。創建一個新flag並命名為「推薦商品組件」,你可以保留默認創建的flag密鑰(Flag Key)。
flag秘鑰是flag的唯一標識,我們將在代碼中用它來檢查flag是on還是off。我們將flag類型(Flag Type)保留為布爾值,並將默認值設置為false。
太棒了,我們現在創建出了一個應用,一個環境,以及一個Flag。現在進入我們的項目,並將feature flag添加到我們的代碼中吧。
我們需要下載並選擇一個適用於我們所選語言的Floodgates SDK,這項操作是通過你的解決方案包管理器(例如NuGet,npm等)完成的。完成安裝後,我們需要告訴SDK,從哪裡能夠獲取feature flag數據。為此,我們需要設置在上圖的環境介面上看到的Environment SDK Key。
下面是一個簡單的代碼片段,顯示了我們代碼中活躍狀態的feature flag。
在上面的代碼中,有兩點需要注意:
-
我們正在創建一個用戶對象,並在其中分配「 Plan」和「 CountryCode」等自定義屬性。你可以為用戶分配任意數量的屬性。稍後在Floodgate介面中我們會用到它們。
-
你可以看到,feature flag語句沒有什麼特別的,它只是一個簡單的「if」語句。第二個參數「false」稱為默認值,它的意思是,在嘗試評估flag時如果發生任何問題,都將返回該值。這樣,你就始終都可以寫出能涵蓋所有可能情況的代碼了。
在代碼中添加feature flag是直接明了的。現在,讓我們回到Floodgate,接下來就是見證奇蹟的時刻了!
Feature flag如何降低軟體發布中的風險?
我敢肯定,到現在你已經可以猜到了:當代碼中有一個feature flag的時候,我們就可以在部署該代碼的時候不顯示(不發布)某個功能了。我們可以通過Floodgate介面打開或關閉「推薦商品」組件,而無需重新部署應用程式。
然而,即使我們現在可以輕鬆地打開或關閉「推薦商品」組件,我們仍然面臨著很高的風險,因為它要麼是打開的要麼就是關閉的,對所有客戶都一樣。這仍然不是非常理想,因為如果有問題,那麼這個問題就能影響到每一個人。
Feature flag解決方案最強大的功能之一就是能夠同時為不同用戶打開或關閉每一個flag(每一個功能)。我們可以使用「百分比推廣」和「用戶定位」兩種方法中的一種,就能在Floodgate中實現這個目標。這就是使用現成解決方案的最大優勢,因為你能馬上就獲得這些開箱即用的功能。
百分比推廣
在Floodgate中,你能夠以應用程式中用戶的百分比為標誌來設置不同的狀態。在下面顯示的這個例子中,我將「推薦商品」組件設置為:顯示給10%的訪問該網站的用戶,而其他90%的用戶看不到它。這就使得我可以輕鬆地用10%的隨機用戶群體來測試這個「推薦商品」組件。如果結果都像我預期的那樣,那就可以慢慢增加能看到組件的用戶百分比了。
通過這種做法,我可以逐漸看到我的應用程式對於新功能的反應是怎樣的。如果檢測到有任何問題,我都可以單擊一下按鈕就將其關閉。
用戶定位
對於「誰將看到新的推薦商品組件」,我們可以使用用戶定位來實現在這一點上的非常精細的控制。用戶定位用到了我們一開始在代碼示例中設置的屬性,我們可以使用這些屬性來控制何人,以及何時能夠看到組件。
在下面的例子裡,我通過CountryCode屬性設置了僅針對英國客戶顯示「推薦商品」組件。
有了用戶定位,您可以創建多個規則,從而可以根據需要定位非常特定的用戶子集。只要你有相關的用戶數據並根據這些數據設置出Floodgate用戶屬性,就可以用它來將特定的flag定位到這些用戶了。
下面的示例展示了一個更複雜的定位策略,在其中,我可以選定是黃金或白銀會員且來自英國或電子郵件地址以@ floodgate.io結尾的用戶。
你可以將多個規則應用到單個目標上,也可以將多個目標添加到一個flag上。
總結
通過使用feature flags,你可以完全地掌控哪些人能看到你的新功能,哪些人看不到,以及何時可以看到,而無需重新部署代碼。通過僅對一小部分或少量目標用戶啟用新功能這種方法,可以大大降低發布功能過程中的風險。
如果你的功能不能正常運行,那麼起碼你知道它只影響到了你客戶中的一小部分而不是整個客戶群體。如果發現該功能出現異常並無法按你的預期運行,就可以很容易地關閉該功能。
如你所見,一旦開始學會使用feature flag,你可能會首先意識到幕後要做的事情有很多。因此,投資使用諸如Floodgate之類的feature flag即服務解決方案會是個好主意,而不是把時間和精力花費到內部開發feature flag解決方案上。
就像你會把支付處理這樣的複雜活動外包出去一樣,把相同的理念擴展到開發和部署工具也十分合理——這樣就能使你更專注於最重要的核心業務了。
原文連結:
https://hackernoon.com/how-to-release-your-software-without-losing-your-hair-feature-flags-technique-2b9r3y4m
本文為CSDN翻譯文章,轉載請註明出處。