【最佳實踐】利用 OpenNJet 實現(xiàn)灰度發(fā)布

在應用的新版本測試發(fā)布過程中,經常需要先使用部分選定的賬號進行驗證,待驗證完成后,再逐步將業(yè)務流量切換到新版本,直至所有流量均切換到新的集群。
測試賬號的檢測可以使用多種方式,如通過?Header?中字段,Cookie?中的值,或者?URL?中的參數(shù)等方式。
在之后章節(jié)的配置及場景中,將使用?HTTP Header?中的?staffid?字段做為測試賬號的判斷依據(jù),7xxxx?的賬號將被認定為測試工號。
初始靜態(tài)配置
初始配置中,將設置兩組?upstream:?backendA , backendB?,?并通過?split_clients?指令設置使用?header?中的?staffid?值做為流量配比依據(jù),并設置?100%?的流量將指向后端?backendA。
完整配置如下:
灰度發(fā)布步驟
動態(tài)添加?location
當新版本已經部署到?backendB?集群后,?通過動態(tài)?location?提供的?API?添加一個條件?location, location?中設置所有的?7xxxx?測試工號將訪問到?backendB。Njet?提供的條件表達式中,可以使用?$http_*?獲取到請求?header?中的值,?$http_staffid? ~* "7.*"?表達式將匹配所有?header?中?staffid?為?7xxxx?的請求。

使用測試工號測試
通過上一個步驟添加條件?location?后,?所有非?7xxxx?的工號將繼續(xù)訪問到集群?backendA,?所有?7xxxx?做為測試工號,將訪問到集群?backendB。
刪除表達式?location
當測試完成后,可以使用動態(tài)?API?刪除條件?location。
刪除條件?location?后,所有的流量均指向?backendA,?包括?7xxxx?的測試工號。
逐步調整分流比例直至?100%
使用模塊提供的動態(tài)配置?API,?逐步調整分流比例。
如調整到?50:50?的比例時:
最后調整到?0:100?的比例,?所有的流量將指向?backendB

這時,應用的新版本已經完成部署和切換?(A => B ),?當下一個版本發(fā)布時,可以使用相同的步驟,完成?(B => A)?的切換。?


OpenNJet 最早是基于 NGINX1.19 基礎 fork 并獨立演進,隨著 NGINX 版本迭代,吸收上游 NGINX 的更新,已經同步更新到 NGINX1.23.1 版本,OpenNJet 具有高性能、穩(wěn)定、易擴展的特點,同時也解決了 NGINX 長期存在的難于動態(tài)配置、管理功能影響業(yè)務等問題。
作為底層引擎,OpenNJet 利用動態(tài)加載機制可以實現(xiàn)不同的產品形態(tài),如 API 網(wǎng)關、消息代理、出入向代理,負載均衡,WAF 等等。在云原生架構中,OpenNJet 除了提供南北向通信網(wǎng)關的功能以外,還提供了服務網(wǎng)格中東西向通信、透明流量劫持、熔斷、遙測與故障注入等新功能特性。
傳送門:https://gitee.com/njet-rd?