溫小斌 張達(dá) 諸映晴
摘要:分布式追蹤是為了解決微服務(wù)環(huán)境下服務(wù)調(diào)用的可觀(guān)察性問(wèn)題。鑒于目前追蹤系統(tǒng)存在的各種不足之處,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)輕量級(jí)的分布式追蹤系統(tǒng),實(shí)現(xiàn)了服務(wù)調(diào)用鏈、調(diào)用頻次、響應(yīng)時(shí)間等觀(guān)察指標(biāo)的追蹤?;贘ava agent和字節(jié)碼編輯技術(shù)實(shí)現(xiàn)追蹤代理程序,生成追蹤圖數(shù)據(jù),并通過(guò)gRPC發(fā)送到監(jiān)控中心。追蹤系統(tǒng)做到了對(duì)應(yīng)用系統(tǒng)的零侵入,并且實(shí)現(xiàn)了OpenTracing標(biāo)準(zhǔn),能夠方便地與各種運(yùn)維監(jiān)控系統(tǒng)集成。
關(guān)鍵詞:分布式追蹤;微服務(wù);運(yùn)維;監(jiān)控;OpenTracing
中圖分類(lèi)號(hào):TP319
文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1006-8228(2020)09-64-04
Design and implementation of lightweight distributed tracing system
Wen Xiaobin, Zhang Da, Zhu Yingqing
(Ningbo Hadlinks IoT Technology Co., Ltd., Ningbo, Zhejiang 315000, China)
Abstract: Distributed tracing system is to make service call observable in microservice context. To overcome the shortcomings ofcurrent systems, a lightweight distributed tracing system is designed and implemented. It makes metrics in application observable.including chain of service dependencies, calling frequency and response time. Based on Java agent and byte-code editor. a tracingagent is programmed to create tracing data with graph structure, and send the data to monitoring center via gRPC. The tracingsystem achieves zero intrusion into the application, and conforms to OpenTracing standard, it can be easily integrated with variousoperation and maintenance monitoring systems.
Key words: distribLLted tracing; microservice; operation and maintenance; monitoring; OpenTracinii
0引言
微服務(wù)架構(gòu)已經(jīng)成為廣泛使用的架構(gòu)模式,它把復(fù)雜而龐大的業(yè)務(wù)系統(tǒng)拆分成一些粒度更小而且可以獨(dú)立部署的服務(wù)進(jìn)程,實(shí)現(xiàn)了業(yè)務(wù)的解耦與復(fù)用,方便部署、擴(kuò)展和維護(hù)[1]。分布式追蹤技術(shù)[2]就是在這種背景下誕生的,它主要解決服務(wù)調(diào)用的可觀(guān)察性問(wèn)題,包括服務(wù)調(diào)用鏈、調(diào)用頻次、響應(yīng)時(shí)間、異常調(diào)用等觀(guān)察指標(biāo)。為此業(yè)界進(jìn)行了一系列的研究,開(kāi)發(fā)出了各種分布式追蹤系統(tǒng),企業(yè)界的典型代表有谷歌的Dapper[3]、阿里巴巴的EagleEye[4],學(xué)術(shù)界的研究成果有MTracer[5],開(kāi)源社區(qū)的代表性項(xiàng)目有Zipkin和SkyWalking。
然而這些系統(tǒng)存在以下幾個(gè)方面的問(wèn)題:①這些系統(tǒng)普遍龐大而復(fù)雜,過(guò)于重量級(jí),對(duì)應(yīng)用環(huán)境的依賴(lài)程度高,難以實(shí)現(xiàn)和使用;②對(duì)業(yè)務(wù)系統(tǒng)的侵入性太強(qiáng),需要在業(yè)務(wù)代碼中穿插大量追蹤代碼,破壞了業(yè)務(wù)代碼的連貫性和整體性;③自成體系,難以與其他監(jiān)控系統(tǒng)相結(jié)合。
為了解決上述問(wèn)題,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)輕量級(jí)的分布式追蹤系統(tǒng)?;贘avaagent和字節(jié)碼編輯技術(shù),做到了對(duì)業(yè)務(wù)系統(tǒng)的零侵入,并且遵循OpenTracing標(biāo)準(zhǔn),能夠方便地集成到其他運(yùn)維監(jiān)控系統(tǒng)。
1設(shè)計(jì)目標(biāo)
對(duì)系統(tǒng)進(jìn)行設(shè)計(jì)的時(shí)候,主要以如下目標(biāo)作為出發(fā)點(diǎn):
1)功能上,需要實(shí)現(xiàn)服務(wù)調(diào)用鏈、調(diào)用頻次、響應(yīng)時(shí)間、異常調(diào)用等觀(guān)察指標(biāo)的追蹤。
(2)輕量級(jí)。對(duì)應(yīng)用環(huán)境的依賴(lài)少,使用方便。
(3)對(duì)業(yè)務(wù)系統(tǒng)零侵入。不會(huì)對(duì)業(yè)務(wù)系統(tǒng)產(chǎn)生功能和性能上的影響,無(wú)需對(duì)業(yè)務(wù)系統(tǒng)代碼做任何修改。
(4)分布式追蹤作為運(yùn)維內(nèi)容的一部分,能夠方便地集成到各種運(yùn)維監(jiān)控系統(tǒng)中。
(5)支持主流的微服務(wù)開(kāi)發(fā)框架,包括ApacheDubbo和SpringCloud。
2追蹤圖
追蹤圖用于記錄分布式調(diào)用鏈的拓?fù)潢P(guān)系,它本質(zhì)上是一個(gè)有向圖數(shù)據(jù)結(jié)構(gòu)。一個(gè)追蹤圖對(duì)應(yīng)一個(gè)完整的調(diào)用鏈,使用唯一的traceID表示。調(diào)用鏈由若干個(gè)追蹤段segment組成,segment代表分布式系統(tǒng)中的一個(gè)應(yīng)用進(jìn)程,在圖中用頂點(diǎn)表示。一個(gè)segment會(huì)生成若干個(gè)span,span代表最終的調(diào)用單元,比如調(diào)用某個(gè)RPC方法,在圖中用有向邊表示。表1列出了追蹤圖中各信息的ID和含義。
圖1展示了一個(gè)實(shí)際追蹤圖的示例,描述了追蹤圖的創(chuàng)建過(guò)程。
(1)用戶(hù)向Web應(yīng)用發(fā)起一個(gè)請(qǐng)求,追蹤程序首先為該請(qǐng)求創(chuàng)建一個(gè)追蹤段(sengmentID=seg_w),如果traceID不存在,則會(huì)創(chuàng)建一個(gè)traceID。
(2)Web應(yīng)用向Dubbo服務(wù)A發(fā)起請(qǐng)求時(shí),會(huì)創(chuàng)建一個(gè)span(spanID=1),同理,Web應(yīng)用向Dubbo服務(wù)B發(fā)起請(qǐng)求時(shí),也會(huì)創(chuàng)建一個(gè)span(spanID=2)。在同一個(gè)段中,spanID是依次遞增的,代表調(diào)用的先后順序。
(3) Dubbo服務(wù)A收到請(qǐng)求后,追蹤程序同樣會(huì)創(chuàng)建一個(gè)追蹤段(segmentID=seg_a),同時(shí)會(huì)接收到調(diào)用者傳遞過(guò)來(lái)的參數(shù)traceID、callerSegmentID和spanID。
(4)其他服務(wù)的調(diào)用也遵循上述步驟。最終,通過(guò)traceID、callerSegmentID、segmentID等數(shù)據(jù),可以將調(diào)用信息關(guān)聯(lián)起來(lái),形成一個(gè)完整的追蹤圖。
3追蹤代理
追蹤代理用于獲取追蹤圖相關(guān)的數(shù)據(jù),在整個(gè)系統(tǒng)中承擔(dān)數(shù)據(jù)采集的任務(wù)。追蹤代理程序的設(shè)計(jì)和實(shí)現(xiàn),主要基于Javaagent和字節(jié)碼編輯兩項(xiàng)技術(shù),前者用于監(jiān)聽(tīng)類(lèi)的加載,攔截并獲取類(lèi)文件的信息,后者用于編輯class文件,在其中加入分布式追蹤相關(guān)的代碼。圖2展示了追蹤代理程序的工作原理。
在類(lèi)加載時(shí),JVM會(huì)觸發(fā)ClassFileLoadHook事件,這是一個(gè)JVMTI事件,被觸發(fā)后會(huì)調(diào)用ClassFileTransformer接口,該接口是一個(gè)class文件轉(zhuǎn)換器,需要實(shí)現(xiàn)接口中的transform()方法,在該方法中對(duì)傳入的Java字節(jié)碼進(jìn)行重新編輯。追蹤相關(guān)的功能邏輯均在transform()方法中實(shí)現(xiàn),包括匹配需要監(jiān)控的Java類(lèi)和方法,獲取并記錄traceID、segmentID、spanID等追蹤圖的數(shù)據(jù),并把這些數(shù)據(jù)發(fā)送到監(jiān)控中心。
追蹤代理程序最終編譯成一個(gè)tracing-agent.jar文件,放入到各個(gè)應(yīng)用和服務(wù)程序中,沒(méi)有其他依賴(lài),非常輕量級(jí)。應(yīng)用和服務(wù)的業(yè)務(wù)代碼,不需要做任何修改,即追蹤代理對(duì)應(yīng)用層的代碼是零侵入的。
4系統(tǒng)實(shí)現(xiàn)
4.1系統(tǒng)架構(gòu)
如圖3所示,整個(gè)追蹤系統(tǒng)采用分布式架構(gòu),主要由追蹤代理和監(jiān)控中心兩部分組成。追蹤代理通過(guò)gRPC,往監(jiān)控中心發(fā)送探測(cè)到的追蹤數(shù)據(jù),數(shù)據(jù)格式遵循OpenTracing標(biāo)準(zhǔn)。監(jiān)控中心接收到這些追蹤數(shù)據(jù)后,負(fù)責(zé)數(shù)據(jù)的解析、存儲(chǔ)以及可視化展示。
追蹤代理和監(jiān)控中心完全解耦,這樣便于把追蹤功能集成到各種運(yùn)維監(jiān)控系統(tǒng)之中。本文的監(jiān)控中心基于Galileo系統(tǒng)實(shí)現(xiàn)。Galileo是一個(gè)專(zhuān)門(mén)針對(duì)物聯(lián)網(wǎng)系統(tǒng)的自動(dòng)化運(yùn)維監(jiān)控系統(tǒng)[6],本文把分布式追蹤功能作為其中的一個(gè)功能模塊對(duì)其進(jìn)行擴(kuò)展開(kāi)發(fā)。
4.2關(guān)鍵技術(shù)
除了前述的Javaagent和字節(jié)碼編輯技術(shù)以外,還有以下幾個(gè)關(guān)鍵技術(shù)點(diǎn),對(duì)系統(tǒng)的實(shí)現(xiàn)至關(guān)重要,決定了系統(tǒng)的可擴(kuò)展性和并發(fā)性能。
(1) OpenTracing
OpenTracing是一套通用的、標(biāo)準(zhǔn)的追蹤數(shù)據(jù)定義接口,規(guī)范了追蹤數(shù)據(jù)的數(shù)據(jù)模型和實(shí)現(xiàn)流程。這套規(guī)范由三個(gè)方面組成:標(biāo)準(zhǔn)化的span管理API;標(biāo)準(zhǔn)化的追蹤數(shù)據(jù)的跨進(jìn)程傳播API;標(biāo)準(zhǔn)化的active span管理API。實(shí)現(xiàn)這套規(guī)范意味著數(shù)據(jù)采集方只需專(zhuān)注于如何追蹤系統(tǒng)的運(yùn)行流程,而無(wú)需關(guān)注追蹤數(shù)據(jù)的定義和格式。諸如Galileo這樣的運(yùn)維監(jiān)控平臺(tái)可以根據(jù)OpenTracing標(biāo)準(zhǔn)來(lái)解析接收到的數(shù)據(jù),方便系統(tǒng)之間的集成。
(2)gRPC
追蹤代理與監(jiān)控中心之間的網(wǎng)絡(luò)通訊,采用gRPC技術(shù)。gRPC是一個(gè)高效的RPC框架,基于HTTP/2.0協(xié)議,傳輸?shù)氖荘rotobuf格式的數(shù)據(jù)。與傳統(tǒng)的HTTP/1.1相比,它使用了TCP長(zhǎng)連接和多路復(fù)用技術(shù),具有更好的性能表現(xiàn),相同并發(fā)量下消耗更少的資源。另外,gRPCClient向gRPCServer發(fā)送數(shù)據(jù)的時(shí)候,使用獨(dú)立的線(xiàn)程池異步發(fā)送,不影響業(yè)務(wù)代碼的執(zhí)行。
5結(jié)束語(yǔ)
針對(duì)微服務(wù)調(diào)用的可觀(guān)察性,本文沒(méi)計(jì)并實(shí)現(xiàn)了一個(gè)輕量級(jí)的分布式追蹤系統(tǒng),實(shí)現(xiàn)了服務(wù)的調(diào)用鏈、調(diào)用頻次、響應(yīng)時(shí)間、異常調(diào)用等觀(guān)察指標(biāo)的追蹤,并應(yīng)用到多個(gè)正式商用的物聯(lián)網(wǎng)項(xiàng)目,取得了不錯(cuò)的效果。下一步的研究工作,是計(jì)劃把分布式追蹤擴(kuò)展到數(shù)據(jù)庫(kù)調(diào)用方面,包括MySQL、MongoDB、Redis等數(shù)據(jù)庫(kù)的連接池調(diào)用的追蹤。
參考文獻(xiàn)(References):
[1]Chris Richardson. Microservices Patterns: With Examplesin Java[M]. Manning Publications, 2019.
[2]Yuri Shkuro. Mastering Distributed Tracing[M]. PacktPublishing,2019.
[3] B. H. Sigelman, L. A. Barroso, M. Burrows, P.Stephenson, M. Plakal, et al.Dapper, a Large-ScaleDistributed Systems Tracing Infrastructure[R]. GoogleTechnical Report,Googlelnc, 20 10.
[4]鐘華,企業(yè)IT架構(gòu)轉(zhuǎn)型之道:阿里巴巴中臺(tái)戰(zhàn)略思想與架構(gòu)實(shí)戰(zhàn)[M].機(jī)械工業(yè)出版社,2017.
[5]J. Zhou,Z.Chen,H.Mi,J.Wang. MTracer:A Trace-Oriented Monitoring Framework for Medium-ScaleDistributed Systems[Al. IEEE 8th International Sympo-sium on Service Oriented System Engineering[C],2014:266-271
[6]溫小斌.物聯(lián)網(wǎng)系統(tǒng)自動(dòng)化監(jiān)控的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)時(shí)代,2019.6:34-36
收稿日期:2020-05-14
作者簡(jiǎn)介:溫小斌(1981-),男,江西贛州人,碩士,主要研究方向:物聯(lián)網(wǎng)、分布式系統(tǒng)。