摘要:微服務(wù)中調(diào)用棧的獲取,使用的開發(fā)者會很自然想到用來攔截,但是攔截同一個類的多個方法之間的調(diào)用很不方便,有侵入性,因此并不適合。調(diào)用棧的跟蹤也提供了這個能力,可以獲得當(dāng)前方法的調(diào)用棧信息。
一、調(diào)用鏈跟蹤的作用
調(diào)用鏈跟蹤包括
1.前端到后端的調(diào)用鏈
2.單個服務(wù)內(nèi)部方法之間的調(diào)用鏈
3.微服務(wù)之間的調(diào)用鏈
4.應(yīng)用服務(wù)和數(shù)據(jù)庫之間的調(diào)用鏈
5.應(yīng)用服務(wù)和第三方服務(wù)中間的調(diào)用鏈,例如Redis,MQ
調(diào)用鏈跟蹤的作用有:
1.定位多個微服務(wù)調(diào)用故障時哪個是故障點(diǎn)。
2.性能分析
3.SQL分析
4.方法或服務(wù)調(diào)用合理性分析
5.調(diào)用邏輯和數(shù)據(jù)流分析,這點(diǎn)對于新人特別有用,看了調(diào)用鏈和執(zhí)行SQL就知道具體做了啥
二、調(diào)用鏈跟蹤的需求那么調(diào)用鏈跟蹤涉及到需求有哪些,看圖:
1.前端到后端以及多個微服務(wù)之間需要將調(diào)用信息傳遞過去,否則調(diào)用鏈會斷掉
2.每個微服務(wù)要能獲取到調(diào)用棧,注意調(diào)用棧和調(diào)用順序不同,僅僅獲取調(diào)用順序是不夠的,試比較:
左圖只體現(xiàn)了調(diào)用順序,沒有體現(xiàn)調(diào)用棧信息,而右圖既體現(xiàn)了調(diào)用順序又體現(xiàn)了調(diào)用棧信息。
3.微服務(wù)內(nèi)部的調(diào)用信息要能傳遞,并且做到無侵入
4.和數(shù)據(jù)庫交互的微服務(wù)要能獲取到調(diào)用的SQL
三、Java調(diào)用鏈跟蹤涉及的關(guān)鍵技術(shù)調(diào)用信息傳遞,這個信息可以通過http消息頭傳遞
1) 前端只要在發(fā)送請求時設(shè)置就好。不過通常一般不跟蹤前端的調(diào)用耗時,因?yàn)槟菢訒嘁淮尉W(wǎng)絡(luò)交互。
2) 對于微服務(wù)需要攔截request請求將調(diào)用鏈信息設(shè)置到消息頭中,在spring中可以通過寫RestTemplate攔截器和Fegin攔截器來實(shí)現(xiàn)。
微服務(wù)中調(diào)用棧的獲取,使用spring的開發(fā)者會很自然想到用AOP來攔截,但是spring AOP攔截同一個類的多個方法之間的調(diào)用很不方便,有侵入性,因此并不適合。最好的方式是使用javaagent,通過代碼注入的方式來攔截。
微服務(wù)內(nèi)部調(diào)用信息傳遞需要通過線程范圍的變量來傳遞,Java中的ThreadLocal已經(jīng)提供了這個能力。
調(diào)用棧的跟蹤Java也提供了這個能力,可以獲得當(dāng)前方法的調(diào)用棧信息。
SQL監(jiān)控,對于使用mybatis的會想到用mybatis的攔截器,這種方式有的情況下會不工作(原因未明),并且依賴mybatis,因此應(yīng)用更底層的方法去攔截SQL,一種方式是自行實(shí)現(xiàn)JDBC代理類,另一種方式是使用第三方開源的SQL監(jiān)控工具。
end.
加入《Java棧實(shí)戰(zhàn)營》知識星球,參與討論,更多實(shí)戰(zhàn)代碼分享,不就是幾斤蘋果,幾個榮耀道具的事嗎!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/75796.html
摘要:一網(wǎng)上關(guān)于的介紹很多,請找度娘和谷兄。唯一提的一點(diǎn)是字節(jié)碼注入比較好用的是,封裝度很高,使用簡單。二代碼樣例以下為關(guān)鍵代碼樣例,可以依樣畫瓢自行改造。加入棧實(shí)戰(zhàn)營知識星球,參與討論,更多實(shí)戰(zhàn)代碼分享,不就是幾斤蘋果,幾個榮耀道具的事嗎 一、Javaagent 網(wǎng)上關(guān)于Javaagent的介紹很多,請找度娘和谷兄。唯一提的一點(diǎn)是字節(jié)碼注入比較好用的是bytebuddy,封裝度很高,使用簡...
摘要:一監(jiān)控一般思路中監(jiān)控一般通過代理模式實(shí)現(xiàn),如下右邊是接口類。配置將項(xiàng)目下文件放到目錄下或者中,找到將類名修改為你自己的實(shí)現(xiàn)類,并去掉其他所有配置都不用修改就可以監(jiān)控到。至此,可以監(jiān)控到語句了。 一、SQL監(jiān)控一般思路 Java中SQL監(jiān)控一般通過代理模式實(shí)現(xiàn),如下: showImg(https://segmentfault.com/img/bVbvWML?w=2187&h=1090)...
摘要:除了以上級別的成員變量共享,在調(diào)用鏈跟蹤時要能識別不同分層下的多個類實(shí)例的調(diào)用是同一個請求,而這個請求的調(diào)用都在一個獨(dú)立線程內(nèi)完成,此時就要用到線程級變量共享。 一、Java類成員作用域 JAVA類成員作用域參考下圖: showImg(https://segmentfault.com/img/bVbvWlh?w=1695&h=925); Java虛擬機(jī)級作用域,通過在類成員變量前加...
摘要:一調(diào)用棧調(diào)用鏈監(jiān)控僅僅獲取調(diào)用順序是不夠的,如前所描述左邊只體現(xiàn)了順序,右邊體現(xiàn)了順序和調(diào)用棧信息。二獲取調(diào)用棧在中獲取調(diào)用棧的方法如下代碼示例輸出結(jié)果可以看到第個棧是調(diào)用的方法。 一、調(diào)用棧 調(diào)用鏈監(jiān)控僅僅獲取調(diào)用順序是不夠的,如前所描述: showImg(https://segmentfault.com/img/bVbvV9H?w=500&h=230);左邊只體現(xiàn)了順序,右邊體現(xiàn)...
閱讀 3122·2023-04-26 02:25
閱讀 2345·2023-04-25 18:05
閱讀 725·2021-09-30 09:57
閱讀 3022·2021-09-27 14:10
閱讀 1735·2019-08-30 15:44
閱讀 1078·2019-08-29 15:28
閱讀 2608·2019-08-29 14:10
閱讀 2348·2019-08-29 13:30