前言
在日常的測試工作中我們或多或少總會遇到下列問題:
1)服務架構升級或重構,需要驗證原始接口邏輯,對原有的一堆接口做回歸
2)對於業務邏輯復雜的場景,每個迭代版本都需要大量的時間用於回歸測試
3)編寫自動化用例時復雜場景造數麻煩,日常自動化維護成本高
4)構造壓測模擬數據麻煩
......等等
那么從服務的所有環境來看,僅線上環境擁有場景豐富、數據真實、覆蓋全面的條件,那么我們將線上環境的請求數據獲取下來,在指定的環境中模擬用戶請求基本上可解決或者優化上面的這些問題。因此有必要需要對流量回放這項技術探究一下,首先從資料總結和自身搭建講演來講,總結流量回放的大概流程可為:流量錄制 - 數據持久化 - 回放計划 - 環境維護 - 流量回放 - 結果比對。其次,所謂工欲善其事,必先利其器,下面我們看一些常用的流量回放分類以及工具的優缺點。
工具分類
根據流量錄制的位置大致可分為:基於web服務器錄制、基於應用層錄制、基於網絡協議棧錄制。
web服務器錄制
方案:在服務上定制化代碼
優點:請求類型比較多樣
缺點:不通用,維護成本高,會占用大量線上資源
應用層錄制
方案:在網關或基於AOP切面進行錄制
優點:對代碼無侵入、實現相對比較快捷簡單
缺點:會占用線上部分資源、可能會對業務有影響
常用工具:Nginx插件-ngx_http_mirror_moudle、Java-sandbox
網絡協議棧錄制
方案:直接監聽網絡端口,復制數據包方式錄制
優點:基本對應用無影響
缺點:比較偏向底層實現成本較高
常用工具:goReplay、tcpCopy、tcpReplay
常用工具介紹
ngx_http_mirror_module
流量請求到nginx后,nginx正常轉發請求到目標應用,同時復制流量到mirror服務后不再管控。
優點:
-
原生模塊支持,在nginx 1.13.4版本后內置該模塊
-
支持配置多份鏡像放大流量
-
配置比較簡單,nginx-server將流量復制到mirror后無交集,達到對真實流量無影響目的
缺點:
-
修改配置后需要執行“nginx -s reload”命令使變更生效,線上環境不建議這么做
-
實際業務中經由nginx轉發的模塊較多,無法篩選指定請求
-
只支持錄制http流量
-
mirror為子請求,當mirror未結束時,主請求的內存無法釋放,可導致nginx性能下降甚至阻塞
TcpCopy
項目地址:https://github.com/session-replay-tools/tcpcopy
流轉示意圖:
TcpCopy主要有tcpcopy和intercept兩個模塊組成,tcpcopy模塊運行在線上機器,主要負責捕獲在線請求並修改請求頭中的目標地址和 源地址,然后使用raw socket輸出技術發送數據包到目標服務器。目標服務器上根據配置的信息將響應數據包路由到intercept輔助服務器。intercept輔助將提取的響應頭信息發送給tcpcopy。tcpcopy利用收到的信息修改捕獲的數據包屬性並發送至目標服務器。
優點:
- 使用線上的真實數據
- 適合高並發場景
- 對目標服務器基本無干擾
- 支持復制基於TCP任意層協議的流量
缺點:
- 由於只做數據包復制未做流量異常鑒別,可能導致異常數據進入目標服務器
- 無法對應用層的數據進行篩選和修改
- 可能會丟失數據包導致請求丟失
GoReplay
項目地址:https://github.com/buger/goreplay
GoReplay是基於Go語言實現與Tcpdump一樣都是依賴pcap庫,主要監聽網絡接口流量來錄制流量,支持在線和離線方式回放流量
優點:
- 輕量程序基本無需配置,環境准備簡單
- 程序資源消耗少,無侵入應用運行環境
- 提供不限制語言的插件機制,方便拓展
缺點:
- 社區版僅支持錄制http協議,且與核心邏輯耦合,應用面不廣泛
- 大公司使用少,整體成熟度不高
Jvm-sandbox-repeater
項目地址:https://github.com/alibaba/jvm-sandbox-repeater
使用jvm-sandbox沙箱技術,通過Java agent或者attach方式掛載到Java應用上。repeater模塊根據配置的規則錄制或回放數據,console模塊主要負責觸發和數據交互。
優點:
- 通過字節碼增強的方式可以直接錄制Java方法、子調用
- 對業務代碼0侵入
- 模塊功能豐富
缺點:
- 對服務運行環境有一定侵入
- 在掛載瞬間會占用較多的機器資源,當業務量大時可能會導致服務夯住
- 當前功能不完善,需要代碼開發能力
總結
通過技術方案可以方便我們利用線上真實流量驗證壓測、自動化、回歸等場景,根據自己實際的需求選擇合適的工具,但一切以不影響線上服務的穩定可用為前提。也期待后續會有更多的更完善的流量回放方案。