效能:流量回放搭建
OTDD (Online Test Driven Development的縮寫),是一個開源的流量回放系統,其主頁:https://otdd.io,github:https://github.com/otdd/release。
和傳統的流量回放相比,其最大的區別是它會自動將服務的請求/返回(inbound request / response )和其第三方依賴請求和返回(outbound requests / responses) 自動關聯起來,所以它有如下巨大的價值:
1. 可以直觀的檢查和理解線上的處理流程細節
2. 可以正確的mock掉所有第三方依賴,同時這些mock還可以編輯,極大的加快開發過程
3. 可以用線上錄製的流量精準的對開發程式碼進行測試
為什麼要用OTDD?
微服務架構主要面臨如下問題:
1. 難以線上下構造第三方依賴
眾多被依賴的服務需要在開發/測試環境啟動,且其資料狀態不一致問題突出和難以解決。
2. 難以構造複雜的測試場景
複雜的測試場景對應複雜的第三方依賴的返回,要麼手動mock,要麼構造第三方資料,特別繁瑣。
3. 測試case難以維護
微服務經常升級,測試case難以維護。
而OTDD完美的解決了這些問題
1. 所有的第三方服務會被用錄製的線上資料自動mock,完美解決第三方依賴問題。
當流量回放時,被測服務的所有outbound request通過iptables被轉發到本地的OTDD test runner,然後該runner根據線上錄製的資料返回對應的response.
2. 線上流量自動被OTDD錄製,無論場景有多複雜
3. 當有新的feature上線後,錄製的流量自動更新,不再需要手工更新test case庫
OTDD是如何工作的?
OTDD重點解決兩方面的問題
1. 線上流量的錄製
OTDD執行在kubernetes和istio之上,利用istio對所有流量的託管,通過編譯到envoy的otdd filter對流量進行特殊的處理,讓流量在單個服務上間隔一個時間gap序列的處理,利用這個時間gap來對inbound req/resp和outbound reqs/resps建立對應關係。
當應用OTDD進行流量錄製的時候,OTDD會自動建立一個redirector和recorder。該redirector和其他正常的服務pod一樣,會自動接收到正常的線上請求,然後隨機取樣間隔性的序列轉發請求到recorder。而recorder則只會接收到redirector轉發過來的序列請求。然後inbound req/resp和其對應的outbound reqs/resps將在recorder上被錄製。
2. 流量的回放
OTDD test runner
OTDD對流量的回放都發生在tcp層級。
OTDD 的test runner執行在本地,其會不斷從otddserver拉取指定的流量來回放。當一個流量被拉取到後,其inbound request會被其直接傳送到本地的被測服務,同時,通過iptables攔截該被測服務的所有outbound請求,然後用流量的outbound response來自動mock。
OTDD test runner有兩種執行模式:
a. 以一個standalone docker的方式執行
該方式適用於被測服務執行在docker裡面的場景,比如一個php docker或者nginx docker。
其會獨立啟動一個test runner docker,然後被測docker共享其網路到test runner docker實現回放。
b. 以一個service的方式執行
該方式適用於大多數傳統的linux下的開發模式。
test runner將會執行在獨立的linux使用者裡,然後將被測服務通過iptables進行網路攔截。
DDL語言
由於所有的流量都在tcp層級,為了可讀性和可編輯性,針對不同的application protocol引入了DDL語言,及其對應的encoder/decoder plugin實現。
encoder/decoder plugin主要負責:
a. 解析tcp層面的資料到DDL,使其變得humman readable,且可以編輯。
b. 將DDL encode成tcp層面的資料,使其可以回放。
由於OTDD在不斷的新增對不同application protocol的支援,所以這些ddl plugin被設計成可以在otddserver裡面去管理(安裝或者解除安裝)。目前支援的protocol有:http, thrift, redis等。
OTDD目前來看是流量回放領域裡面的一顆新星,解決了長期以來傳統的流量回放只管線上流量的無序錄制,卻無法有序管理和利用的老大難問題,目前其已經正式釋出了0.1.0版本,趕緊去試試吧!https://otdd.io/getstarted