『互聯(lián)網(wǎng)架構(gòu)』JDBC和RestApi調(diào)用埋點(diǎn)(114)

原創(chuàng)文章,歡迎轉(zhuǎn)載。轉(zhuǎn)載請(qǐng)注明:轉(zhuǎn)載自IT人故事會(huì),謝謝!
原文鏈接地址:『互聯(lián)網(wǎng)架構(gòu)』JDBC和RestApi調(diào)用埋點(diǎn)(114)

JDBC做過(guò)java開(kāi)發(fā)的都知道JDBC是干什么的,RestApi其實(shí)就是http的調(diào)用,http的調(diào)用就是調(diào)用第三方的服務(wù)的時(shí)候,第三方的服務(wù)并不是在自己的系統(tǒng)范圍內(nèi),如果出現(xiàn)不穩(wěn)定掛掉,對(duì)自身來(lái)說(shuō)是不可控了,所以第三方服務(wù)而言對(duì)我們而言是非常的明感的。JDBC和RestApi的監(jiān)控對(duì)系統(tǒng)來(lái)講意義很大,數(shù)據(jù)庫(kù)得多重要,在系統(tǒng)的內(nèi)部進(jìn)行監(jiān)控更能良好的反應(yīng)sql的執(zhí)行性能。
源碼:https://github.com/limingios/netFuture/tree/master/源碼/『互聯(lián)網(wǎng)架構(gòu)』調(diào)?鏈系統(tǒng)工程結(jié)構(gòu)(111)

(一)JDBC調(diào)用攔截

  • JDBC插樁目的

哪些監(jiān)控懟開(kāi)發(fā)運(yùn)維來(lái)說(shuō)最有用的。

  1. SQL語(yǔ)句、SQL參數(shù)、用了多長(zhǎng)時(shí)間、SQL類型、結(jié)果集大小、返回字段、規(guī)范、Join次數(shù)
  2. 攔截監(jiān)聽(tīng)SQL語(yǔ)句
  3. 找出慢查詢語(yǔ)句
  • 模型結(jié)構(gòu)
字段 類型 描述
sql text sql語(yǔ)句
params json 參數(shù)
resultSize int 結(jié)果大小
url varchar 數(shù)據(jù)庫(kù)連接路徑
userName varchar 數(shù)據(jù)庫(kù)用戶名
error text 異常堆棧
useTime int 用時(shí)
  • JDBC插樁位置

這些user,框架,連接池,驅(qū)動(dòng)都依賴jdbc,jdbc是一個(gè)什么東西?jdbc是一種規(guī)范,一堆接口組成的規(guī)范j2se,由驅(qū)動(dòng)來(lái)實(shí)現(xiàn)的。servlet也是一種接口規(guī)范,是j2ee的規(guī)范,由tomcat,jetty等容器實(shí)現(xiàn)的。任任何一層都可以做為插樁的切入點(diǎn),但是選用User 層、框架層、連接池&數(shù)據(jù)源層、驅(qū)動(dòng)層其實(shí)現(xiàn)是多樣的,無(wú)法做到普適性。所以在此選用JDBC 作為插樁切入 點(diǎn)。

  • JDBC插樁機(jī)制


從上圖可以分析出JDBC執(zhí)行過(guò)程

1.從驅(qū)動(dòng)獲取連接(Connection)
2.基于連接構(gòu)建預(yù)處理對(duì)象(prepareStatement)
3.執(zhí)行SQL
4.讀取結(jié)果集(ResultSet)
5.關(guān)閉釋放連接。
其中涉及對(duì)象構(gòu)建邏輯如下:
Driver==》Connection==》prepareStatement==》ResultSet

(二)Http調(diào)用攔截

  • Http埋點(diǎn)目的

很多時(shí)候我們會(huì)調(diào)用第三方API。比如:消息推送、短信發(fā)送、第三方支付接口等,因?yàn)榉?wù)是第三方提供,如果服務(wù)出現(xiàn)性能或可用性問(wèn)題對(duì)于我方而言不可控,所以這類接口的穩(wěn)定性是我們需要重點(diǎn)關(guān)注的對(duì)象。
通常這類接口會(huì)基于Http協(xié)議實(shí)現(xiàn),所對(duì)Htpp協(xié)議監(jiān)控,即實(shí)現(xiàn)了對(duì)第三方接口的監(jiān)控。

  • Http埋點(diǎn)位置

1.user層:無(wú)法判斷User具體執(zhí)行方法,基于配置又做不到普適性。
2.Http協(xié)議層:能找到具體方法,也能做到普適性。需要對(duì)Http協(xié)議進(jìn)行全面解析,而且Http協(xié)議為文本協(xié)議,解析難度更大,實(shí)現(xiàn)成本居高。
3.專有SDK、與自定義封裝的Http工具包,跟具體業(yè)務(wù)偶合同樣無(wú)法做到普適應(yīng)。
4.java net URL 與 HttpClient 都是Http client 基于二者實(shí)現(xiàn)可以在一定程度上達(dá)成我們的目標(biāo)。

  • Http埋點(diǎn)機(jī)制(java.net.URL)

URL常用寫(xiě)法:


URL url = new URL("https://www.baidu.com");
URLConnection conn = url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
OutputStream output = conn.getOutputStream();
output.write("a=c&b=1".getBytes());
InputStream input = conn.getInputStream();
byte[] bytes = IOUtils.readFully(input, -1, false);
System.out.println(new String(bytes));

URL 裝載執(zhí)行過(guò)程:

  1. URL 基于protocol 構(gòu)建對(duì)應(yīng) UrlStreamHandler
  2. UrlStreamHandler.openConnection() 打開(kāi)連接,返回URlConnection
  3. URlConnection 設(shè)置連接屬性
  4. URlConnection 打開(kāi) outPutStream 寫(xiě)入?yún)?shù)
  5. URlConnection 打開(kāi) inPutStream讀取結(jié)果

其中涉及對(duì)象構(gòu)建邏輯如下:

URL==》URLStreamHandler==》URLConnection==》outPutStream、InputStream。

如果上述過(guò)程加一層<u>靜態(tài)代理</u>即可監(jiān)控這些對(duì)象所有的執(zhí)行過(guò)程從而得到所需監(jiān)控?cái)?shù)據(jù):

URL==》Proxy(URLStreamHandler)==》Proxy(URLConnection)==》Proxy(outPutStream)、Proxy(InputStream)。

  • URL的類結(jié)構(gòu)

怎么樣才能加上這層代理呢?其關(guān)鍵方法在于 通過(guò)靜態(tài)代理的方式。 <u>java.net.URL#setURLStreamHandlerFactory。</u>該方法允許用戶自定義URL協(xié)議實(shí)現(xiàn).

PS:太復(fù)雜了,看源碼debug看比較好,jdbc和restApi通過(guò)的proxy代理的方式。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、簡(jiǎn)歷準(zhǔn)備 1、個(gè)人技能 (1)自定義控件、UI設(shè)計(jì)、常用動(dòng)畫(huà)特效 自定義控件 ①為什么要自定義控件? Andr...
    lucas777閱讀 5,396評(píng)論 2 54
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,697評(píng)論 1 32
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    草里有只羊閱讀 18,566評(píng)論 0 85
  • JDBC基礎(chǔ)知識(shí) 一、采用JDBC訪問(wèn)數(shù)據(jù)庫(kù)的基本步驟: A.載入JDBC驅(qū)動(dòng)程序 B.定義連接URL ...
    91數(shù)據(jù)閱讀 4,100評(píng)論 0 20
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,039評(píng)論 0 11

友情鏈接更多精彩內(nèi)容