如何幫助業務絲滑配置?阿里巴巴用了 11 年的“功能開關” 是什麼?
作者:蘇宇(流士)
我們業務常見的配置問題
通常業務程式碼中包含許多的配置項,這些配置項用於控制各種各樣的業務邏輯,例如一個 bool 型別的變數控制某個功能是否開啟,一個 list 控制訪問白名單或黑名單,一個 String 控制提示資訊。但是在常規的微服務架構應用的配置過程中,會碰到以下的配置問題與挑戰。
針對上述問題,開發者通常希望可以動態、實時地去檢視和修改配置項,並且期望不需要編寫額外的程式碼來管理,此時就可以利用 AHAS 功能開關來實時修改和檢視對應的配置項。與傳統的配置中心不同,開發者使用 AHAS 功能開關時,無需關注配置項的解析邏輯,只需宣告對應的變數,加上 AHAS 功能開關的註解即可在功能開關控制檯對配置進行動態管理。
什麼是 AHAS 功能開關?
AHAS 功能開關是一個輕量級的動態配置框架,通過功能開關可以動態管理程式碼中的配置項,根據需求為某個應用開啟或關閉部分功能,或設定某個效能指標的閾值。功能開關通常用於設定黑白名單、執行時動態調整日誌級別、降級業務功能等場景。
利用 AHAS 功能開關,可以幫助企業構建完善的線上運維手段,作為流量防護等常規運維手段的有力補充,功能開關可針對特定業務場景實現定向止損,及時保障應用系統穩定性;對不同業務場景下的配置項具體內容可靈活變更,隨時調整;AHAS 功能開關可將原生 Spring 配置項自動轉化為功能開關項,真正做到零改造。
AHAS 功能開關實現邏輯
通過 AHAS 控制檯管理和推送配置項,應用重啟或擴容階段可讀取持久化配置。
市場中現有的配置管理服務在某些配置管理核心環節存在嚴重不足,具體現象可簡述如下:
• 靈活性差
現有配置管理服務多基於檔案方式或需手動設定配置項方能生效,過程較為複雜,且容易出錯;AHAS 功能開關可自動支援原生 Spring 配置項,極大解放業務人員生產力。
• 配置型別缺少校驗
現有配置管理服務在推送階段大多未實現型別校驗,可能導致嚴重線上故障,引發資損;AHAS 功能開關對配置型別進行強校驗,把問題暴露在控制檯層面,避免由於人員操作失誤引發的問題。
• 持久化資料丟失
現有配置管理服務多基於本地檔案或資料庫進行持久化,SLO 難以保障;AHAS 功能開關依託於集團持久化產品保障開關持久化的可靠性。
• 侵入性強
現有配置管理服務對程式碼侵入性較強,引入使用需做大量改造,耗費較多精力;AHAS 功能開關提供 Agent 接入方式,對應用完全無侵入,對某些需自定義開關場景可按需引入 SDK。
和業界常見產品的差別是什麼?
對 switch 社群版及國內外使用較為廣泛的開關配置產品,從配置在微服務運維的各個階段及維度展開進行比較。AHAS 在應用接入的成本、配置推送的可操作性以及配置持久化方面都有較大的優勢:
• 應用接入
應用通過 Agent 方式接入 AHAS,連線功能開關服務,無需對應用做任何改造,真正做到無侵入。
• 配置推送
通過 AHAS 控制檯即可對應用的配置項進行管理,按需推送配置項,支援按節點推送與全域性推送方式。
• 配置持久化
通過 ACM 元件持久化配置項,保障配置項高可靠性。應用在重啟或擴容階段可讀取持久化配置。
詳細內容見下表:
除此之外,AHAS 功能開關相較於其他競品還具備如下差異化優勢:
• 強型別校驗
使用者無需在業務層面對接收到的配置進行型別及格式的校驗,校驗工作由平臺承擔,應用僅需關注業務。
• 無侵入式接入
對 SpringCloud 應用支援一鍵接入,自動識別應用中配置項,可通過控制檯實時修改並進行持久化等操作。
• 複雜配置項支援
在複雜資料型別支援方面較為完善,無需遵守較為繁瑣的配置項規則。
• 開箱即用功能
支援日誌級別動態調整,獲取不同級別日誌,方便問題分析、故障定位。
業務中開關配置常見的應用場景有哪些?
動態調整日誌級別
在開發 Java 程式時,我們經常會用到各種各樣的日誌框架。為了避免在程式正常執行時輸出不必要的資訊,可以針對性地動態調整日誌級別,以便輸出更多的日誌資訊排查線上問題,或是減少日誌列印帶來的效能消耗。功能開關提供了在應用執行時動態修改日誌級別的功能,在不同的應用場景下,您可以隨時調整日誌的級別,得到更有效的日誌資訊。(注:支援的日誌框架:Log4j、Log4j2、Logback。)
配置項組合更新
在實際的業務執行場景下,可按不同場景批量更新組合配置項。所謂組合配置項指具有一組相互關聯業務語義的配置項,如頁面公告中時間、標題、內容等,商品特殊優惠配置中價格、優惠折扣等。
下圖以'商品優惠配置'為例進行說明。'商品優惠配置'在不同場景下優惠物件、優惠折扣及價格等各不相同,將'商品優惠配置'涉及的配置項組合,在不同場景下設定不同內容,可在不同場景下快速切換,同時省去繁瑣校驗過程,避免出錯。
開關驅動開發
以開關方式控制程式碼執行邏輯,用於新功能快速驗證,在出現問題時可及時回退。相比複雜的系統釋出,投入成本較低,可結合 DevOps 機制進行實踐。
如下圖所示,當執行邏輯觸發時訪問對應的開關配置檢視配置是否開啟,從而決定是否執行新功能。可用於 A/B 測試、環境隔離等場景。
金絲雀(灰度)釋出
確保應用釋出的可觀測,可灰度,可回滾,使用金絲雀釋出進行小流量驗證,驗證通過後再全量升級,實時檢視流量的分配情況。
怎麼配置 AHAS 開關?
步驟一 :環境準備
• 功能開關 Agent 方式接入,與流量防護共用 Agent,
配置-Dahas.switch.agent.plugin.group.enabled=true
• 應用配置 SDK 方式接入,參考使用 SDK 接入[1]
• 應用配置 Spring Boot Starter 方式接入,參考使用 Spring Boot Starter 接入[2]
步驟二:配置操作
以開箱即用功能日誌動態修改為例。
進入目標應用的開關列表頁面。在開關列表頁面搜尋到 SYSTEM_LOG_CONFIG 開關,即日誌級別開關。
推送值格式:Key 為 LoggerName,Value 為日誌級別。如需修改全域性日誌級別,LoggerName 為 root,如下所示。
{
"root": "ERROR"
}
步驟三:配置效果
修改後即可生效,具體效果如下。
相關連結
[1] 使用 SDK 接入
https://help.aliyun.com/document_detail/156225.html
[2] 使用 Spring Boot Starter 接入
https://help.aliyun.com/document_detail/155940.html
歡迎掃碼進群聯絡我們:
釋出雲原生技術最新資訊、彙集雲原生技術最全內容,定期舉辦雲原生活動、直播,阿里產品及使用者最佳實踐釋出。與你並肩探索雲原生技術點滴,分享你需要的雲原生內容。
關注【阿里巴巴雲原生】公眾號,獲取更多雲原生實時資訊!