百度服務虛擬化:Terminator
問題
在開發/測試一個復雜系統的時候我們經常遇到開發/測試中的模塊依賴其它服務的情況。比如一個系統有兩個模塊A和B,A模塊依賴于B模塊提供的服務:
- B部分功能還未完成開發導致A模塊開發被阻塞;
- B模塊有些數據不好構造,開發時無法自測到所有情況;
- 對A模塊進行集成測試時,寫了一些自動化用例。但由于B模塊不可控,B模塊的數據經常變動導致返回給A模塊的數據也變化了,這時候依賴B模塊返回數據的斷言將失敗;
- B模塊不是自己團隊維護,經常出現不穩定,導致開發環境中整個系統不穩定。
解決方案
服務虛擬化指的就是虛擬出不穩定、不可用、未開發完全的服務。通常有兩種方法:
- 針對協議的通用樁,可以預先設置請求對應的返回值以及匹配條件,這樣系統未開發完之前可以使用這個樁來代替真實的服務;
- 錄制回放方式,在第三方服務可用的時候將鏈路上的數據錄制下來,當不穩定或者不可用時,回放當時錄制的數據。
其中方案1主要針對問題一和二,方案2主要針對問題三和四。Terminator(寓意:明暗交界線)實現了以上兩種方式。
Terminator中每個鏈路可以看成是一個代理,運行在兩個服務之間,現在支持四種工作模式:
TUNNEL:隧道模式,鏈路服務負責接收和轉發鏈路上的數據,但不做任何存儲,相當于通透狀態;
RECORD:錄制模式,鏈路服務將鏈路上的請求和響應存儲下來,并記錄請求響應的對應關系;
REPLAY:回放模式,鏈路服務不會連接后端的依賴服務,當請求過來時當符合某些條件時直接返回當時錄制的響應;
STUB:通用樁模式,鏈路服務能夠預設返回結果與匹配規則,當請求過來時符合匹配規則即返回預設結果。
整體架構
- 網絡通信:主要在TCP層建立Socket收發鏈路上的通信數據,這里采用的是netty框架;
- 協議編解碼器:主要將二進制數據包解析為協議數據或者反過來將協議數據轉化為二進制數據,netty本身提供了HTTP、SSL/TLS、WebSockets、Google Protocol Buffer的編解碼器,如果需要擴展可以自己定義協議編解碼器;
- 工作模式處理器:本系統的核心,現在提供的錄制回放、通用樁都是這里實現的。這里提供了較多的擴展接口,可以基于定制化需求實現新的模式, 比如當后端服務down掉的情況下啟動之前的錄制數據。另外對于錄制回放模式,簽名類是一個核心組件,它的作用是如何標識一個請求,對于不同系統可能有不 一樣的實現;對于通用樁模式,抽取類是一個核心組件,他的作用是如何提取一個請求,涉及到如何設置匹配條件,對于不同系統(特別是協議)也可能有不一樣的 實現。所以這些都是系統提供的可擴展接口。
- APIs:為了使用上的方便(比如持續集成),系統基本所有的功能都通過REST API提供。
https://github.com/BaiduQA/terminator
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!