微服務是Devops場景下熱門的開發框架,在大型項目中被普遍採用。它把一個大型的單個應用程序和服務拆分爲數十個的支持微服務,獨立部署、互相隔離,經過擴展組件來處理功能瓶頸問題,比傳統的應用程序更能有效利用計算資源。微服務之間無需關心對方的模型,它經過事先約定好的接口進行數據流轉,使業務能夠高效響應市場變化。但微服務一個明顯的表象就是隨着服務的增多,傳統的測試模式受到很大制約,沒法有效進行下去,威脅到總體系統質量。全部J2EE代碼層白盒採集工具都沒法區分覆蓋和具體功能的對應關係,只能之後臺模式「籠統「的採集一個階段的總的覆蓋,沒法知足對於Devops下對於故障定位、深度測試分析以及敏捷發佈算法的要求。算法
星雲測試(www.teststars.cc) 發佈分佈式微服務精準測試解決方案,是目前市場上惟一可達到在複雜分佈式系統中,跨多個服務器進行代碼白盒級分析、實現請求分佈式追蹤的測試平臺。其中產品內的穿透模塊,能夠支持各類主流微服務通訊架構。例如httpclient,springcloud微服務架構、阿里dubbo微服務架構,以及消息隊列,將併發訪問場景下跨多個服務多組代碼邏輯分離並重建追蹤出來。實現業務邏輯的代碼在開發層面經過微服務離散後,在測試階段則能夠反向復原整個完整代碼執行視圖。精準測試裏面的穿線概念(Threadingtest)增長了第三層含義,即針對的分佈式服務的穿透能力。spring
微服務場景下,一個完整請求會跨多個計算(服務)節點,而對於以節點爲剖面的各類測試和監控手段都變得不那麼直接和有效。一個請求鏈路的失效和性能故障等問題,從一個計算節點剖面去分析是很困難的,由於在一個計算節點剖面上的數據是混合型數據,而沒法區分這裏面的數據來自於那個請求。原始的方法沒法將一個調用鏈路上的全部信息完整的從新刻畫出來。業界流行的APM技術能夠某種程度實現這種調用鏈路分析,該項技術主要用於監控,體現的數據是組件級的,並且爲了性能考慮還常常抽取樣 本,沒法達到測試要求的代碼級的分析。瀏覽器
微服務採用的「分而治之」的策略,而精準測試對於微服務的測試和運營管控上採用的是「概覽全局」的策略。精準測試在編譯階段,從新將微服務全部模塊視爲一個完整項目,統一編譯和插裝,通過插裝後的代碼從新部署到原有節點上。在微服務的啓動過程當中附加上分佈式追蹤所須要的agent啓動,便可完成微服務場景下達到測試用例級的代碼全調用路徑分析。因爲微服務有多個程序模塊,星雲測試平臺支持模塊級增量編譯模式,即每次編譯替換某一個模塊就能夠生成一個新的版本,而無需將全部微服務模塊全新編譯。服務器
穿透和分佈式追蹤的原理,這裏要重點將如下星雲測試JavaEE應用服務器agent的能力。agent提供了一個虛擬jsp的技術,經過agent啓動的被測應用,都附加了一個虛擬jsp,地址相似於http://www.appundertest.com/teststars.jsp 訪問這個頁面能夠用來指本機的用戶,通常這個設置和精準測試示波器的登陸用戶須要一致。設置完成後,對被測試應用的請求將附加上一個用戶標識的cookie信息,這個信息會在微服務的多層架構中一直攜帶和穿透。例如從瀏覽器發起的一個帶着用戶標識信息的請求,到了應用服務的處理線程中,這個線程執行的全部代碼將附加上這個用戶信息,若是應用在向後調用其餘的節點的服務,則這個用戶信息會繼續向後傳遞,直到最後的執行節點。因爲每一個節點的代碼均有精準測試系統插裝的代碼,會自動的向用戶請求發起端的示波器回饋數據,那麼就能夠實現將整個調用鏈路上的代碼邏輯發送給示波器。示波器收到數據後,將動態數據和代碼編譯階段的程序靜態數據結合起來,便可展現全鏈路的程序調用路徑信息。從另外角度,當微服務系統有多個請求同時並行的時候,那麼每一個示波器收到的是本身對應的請求代碼的全鏈路執行狀況,而其餘示波器用戶和其餘普通用戶的數據則不會被收錄進來。cookie
上圖是一個spring cloud微服務架構下兩個節點的調用圖。當從第一層入口組件訪問後,入口組件向後調用下一層節點的時候,後一層節點的運行線程自動取到了前一層節點的用戶信息,而且加入到了第二層節點的運行線程控件。這樣,經過精準測試示波器(登陸用戶標識和請求標識一致)就能夠收到兩個節點的數據。實現多個用戶同時訪問分佈式應用的時候,不一樣用戶出發的數據自動分離,路由到對應的示波器,最終對應到用例上。架構