1. 程式人生 > >java微服務分布式調用鏈APM監控

java微服務分布式調用鏈APM監控

JAVA APM

幾種分布式調用鏈監控組件的比較
微服務架構下,服務按照不同的維度進行拆分,一次請求請求往往需要涉及到多個服務。互聯網應用構建在不同的軟件模塊集上,這些軟件模塊,有可能是由不同的團隊開發、可能使用不同的編程語言來實現、有可能布在了幾千臺服務器,橫跨多個不同的數據中心。因此,就需要一些可以幫助理解系統行為、用於分析性能問題的工具,以便發生故障的時候,能夠快速定位和解決問題。

分布式調用鏈監控組件在這樣的環境下產生了。最出名的是谷歌公開的論文提到的 Dapper 。開發Dapper是為了收集更多的復雜分布式系統的行為信息,然後呈現給Google的開發者們。這樣的分布式系統有一個特殊的好處,因為那些大規模的低端服務器,作為互聯網服務的載體,是一個特殊的經濟劃算的平臺。想要在這個上下文中理解分布式系統的行為,就需要監控那些橫跨了不同的應用、不同的服務器之間的關聯動作。

市面上的APM(Application Performance Management)理論模型大多都是借鑒(borrow) Google Dapper 論文,本文重點關註以下幾種APM組件:
Pinpoint
Pinpoint是一款對Java編寫的大規模分布式系統的APM工具,由韓國人開源的分布式跟蹤組件。github地址:GitHub - naver/pinpoint: Pinpoint is an open source APM (Application Performance Management) tool for large-scale distributed systems written in Java.對java領域的性能分析有興趣的朋友都應該看看這個開源項目,通過JavaAgent的機制來做字節碼代碼植入,實現加入traceid和抓取性能數據的目的。NewRelic、Oneapm之類的工具在java平臺上的性能分析也是類似的機制。

SkyWalking
github地址:wu-sheng/sky-walking這是國內一位叫吳晟的兄弟開源的,也是一個對JAVA分布式應用程序集群的業務運行情況進行追蹤、告警和分析的系統,在github上也有400多顆星了。功能相對pinpoint還是稍弱一些,插件還沒那麽豐富,不過也很難得了。

Zipkin
官網:OpenZipkin · A distributed tracing systemgithub地址:GitHub - openzipkin/zipkin: Zipkin is a distributed tracing system這個是twitter開源出來的,也是參考Dapper的體系來做的。Zipkin的java應用端是通過一個叫Brave的組件來實現對應用內部的性能分析數據采集。Brave的github地址:https://github.com/openzipkin/brave這個組件通過實現一系列的java攔截器,來做到對http/servlet請求、數據庫訪問的調用過程跟蹤。然後通過在spring之類的配置文件裏加入這些攔截器,完成對java應用的性能數據采集。用於收集服務的定時數據,以解決微服務架構中的延遲問題,包括數據的收集、存儲、查找和展現。

CAT
github地址:GitHub - dianping/cat: Central Application Tracking這個是大眾點評開源出來的,實現的功能也還是蠻豐富的,國內也有一些公司在用了。不過他實現跟蹤的手段,是要在代碼裏硬編碼寫一些“埋點”,也就是侵入式的。這樣做有利有弊,好處是可以在自己需要的地方加埋點,比較有針對性;壞處是必須改動現有系統,很多開發團隊不願意。

比較
前面三個工具裏面,我推薦的順序依次是Pinpoint—》Zipkin—》CAT。
原因很簡單,就是這三個工具對於程序源代碼和配置文件的侵入性,是依次遞增的:
Pinpoint:基本不用修改源碼和配置文件,只要在啟動命令裏指定javaagent參數即可,對於運維人員來講最為方便;
Zipkin:需要對Spring、web.xml之類的配置文件做修改,相對麻煩一些;
CAT:因為需要修改源碼設置埋點,因此基本不太可能由運維人員單獨完成,而必須由開發人員的深度參與了,而很多開發人員是比較抗拒在代碼中加入這些東西滴;相對於傳統的監控軟件(Zabbix之流)的區別,APM跟關註在對於系統內部執行、系統間調用的性能瓶頸分析,這樣更有利於定位到問題的具體原因,而不僅僅像傳統監控軟件一樣只提供一些零散的監控點和指標,就算告警了也不知道問題是出在哪裏。

java微服務分布式調用鏈APM監控