Spring5-WebClient之java探針開發(fā)總結(jié)復(fù)盤

WeClient請求適配

本文主要是對WeClient適配過程的一個(gè)總結(jié)尖坤,適配思路和注意點(diǎn)記錄下來,以便后續(xù)開發(fā)锥忿。

1. 澄清需求

1.1. 需求描述

需要添加一個(gè)適配Springflux框架中的webClient季惩,上報(bào)其請求相關(guān)調(diào)用鏈路以及參數(shù)。

1.2. 需求環(huán)境

webClient是Spring5框架相關(guān)的伊磺,jdk環(huán)境適配環(huán)境為:1.8及以上

使用依賴包:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webflux</artifactId>
  <version>5.2.9.RELEASE</version>
</dependency>

1.3. 需求詳情及基礎(chǔ)了解

WebClient是從Spring WebFlux 5.0版本開始提供的一個(gè)非阻塞的基于響應(yīng)式編程的進(jìn)行Http請求的客戶端工具。它的響應(yīng)式編程的基于Reactor的删咱。WebClient中提供了標(biāo)準(zhǔn)Http請求方式對應(yīng)的get屑埋、post、put痰滋、delete等方法摘能,可以用來發(fā)起相應(yīng)的請求。

可以參考HttpClient相關(guān)代碼去獲取對應(yīng)的信息敲街。

2. 適配開發(fā)思路

  1. 構(gòu)建兩個(gè)類InboundWrapper团搞、InboundWrapper 分別去獲取請求頭(header)信息以及響應(yīng)信息,這兩個(gè)類分別實(shí)現(xiàn)InboundHeaders多艇、InboundWrapper逻恐,使用裝飾器模式,去包裝源碼框架中包含請求頭信息和響應(yīng)信息的類峻黍。
  1. 找要適配的框架中執(zhí)行發(fā)出請求的真正方法以及能夠獲取到請求頭信息的和響應(yīng)信息的類复隆。webClient框架中發(fā)出請求的入口只有一個(gè),就是RequestHeadersSpec.exchange()
  2. 整體插碼結(jié)構(gòu)如下圖所示 2-3:

圖2-3:


補(bǔ)充說明: 正常在入口類都會(huì)有請求頭等姆涩,響應(yīng)信息的入?yún)ⅰebClient封裝的比較特殊骨饿,需要在這兩個(gè)類中獲取到對應(yīng)的uri入口信息绒北。

這里我們可以看到了储藐,所以我們在OutboundWrapper類中獲取請求頭信息的包裝類就是WebClient$RequestHeadersSpec蛛碌。

步驟四(核心):

插碼的邏輯:

1.獲取trace跟蹤,跟蹤方法,需要方法的類的字節(jié)碼

ExitTracer tracer = AgentBridge.instrumentation.createTracer(this, WebClientUtils.exchangeMethod, null, TracerFlags.BACKEND_CALL | TracerFlags.LEAF);

2.獲取跨容器狀態(tài)

CrossProcessState crossProcessState = AgentBridge.getAgent().getCrossProcessState();

3.上報(bào)后端請求信息(tracer矾湃、當(dāng)前調(diào)用鏈路(URI)信息)

WebClientUtils.report((BackendCall) tracer, brURI);

4.記錄跨容器信息、trace信息

WebClientUtils.processOutboundHeader(crossProcessState, (BackendCall) tracer, (WebClient.RequestHeadersSpec) this);

5: 執(zhí)行源代碼邏輯

6.結(jié)束Trace探測

7.上報(bào)響應(yīng)的信息

WebClientUtils.processResponse(crossProcessState, (BackendCall) tracer, response.block());
  1. trace返回 return;

    
    if (tracer != null) {
        tracer.finish(177/* RETURN */, response);
    }
    
  2. 返回源代碼方法返回的值或者void

上報(bào)后端調(diào)用鏈路邏輯

注意(webClient 框架一般是記錄http或者h(yuǎn)ttps)

拼接訪問uri以及協(xié)議類型后,上報(bào)記錄到trace

BackendCallParameter becp =
        BackendCallParameter.create(Backend.createBackend(BackendType.BACKEND_TYPE_HTTP, "HTTP", host, port, connURL), uri, uri);
backendCallTracer.reportBackendCall(becp);

把調(diào)用uri以及適配的類型加入到HTTP_URL矮男、COMPONENT

執(zhí)行響應(yīng)信息處理

  1. 判斷是否有響應(yīng)

  2. 記錄響應(yīng)狀態(tài)

    1. 小于400猪瞬,則正常返回幌甘。 設(shè)置狀態(tài)碼http.status_code :
  3. 構(gòu)建該類 InboundWrapper進(jìn)行包裝鞍泉。獲取響應(yīng)的請求頭,判斷

    1. 解析服務(wù)端返回得響應(yīng)頭

代碼:

?

執(zhí)行請求頭信息處理

解析請求端的請求頭。

3. 遇到的問題

  1. 對webClient框架沒接觸過睦刃,不夠了解其原理以及使用砚嘴。
     2. 不熟悉使用,寫代碼時(shí)眯勾,對于代碼調(diào)用的邏輯考慮不夠枣宫,導(dǎo)致寫代碼時(shí)考慮的可能導(dǎo)致問題的點(diǎn)不夠。
     3. 對于插碼@BrWeave的使用還需要更深入的理解和多閱讀server源碼吃环。
     4. 沒有考慮線程安全并發(fā)修改的問題也颤,導(dǎo)致阻塞在一個(gè)uri的獲取上時(shí)間很久。
     5. 測試項(xiàng)目沒有相關(guān)代碼郁轻,需自己重新搭建一個(gè)翅娶。
     6. 查找webClient項(xiàng)目源代碼,并找到相關(guān)入口好唯。
  1. 壓測遇到的問題竭沫。
  2. agent日志查找是否weave,插碼骑篙、打印等相關(guān)問題蜕提。

4.遇到問題的解決

  1. 網(wǎng)站找最好官網(wǎng)去找例子,以及相關(guān)資料靶端。

  2. 可以去gitlab上面找已經(jīng)部署的項(xiàng)目使用webClient的例子谎势,熟悉webClient相關(guān)的使用凛膏,思考編寫時(shí)需要注意的問題。

  3. 對閱讀關(guān)于@BrWeave的使用脏榆,平時(shí)多看看項(xiàng)目代碼猖毫。

  4. 因?yàn)榫帉懙氖翘峁┓剑枰紤]一些線程安全的情況须喂。

  5. 在github上面查找吁断。

  6. 在官網(wǎng)下載源代碼以及相關(guān)依賴。

  7. 開發(fā)完需要多多進(jìn)行多種調(diào)用場景的壓測坞生。

  8. 借此多熟悉日志的使用仔役,可以查看該項(xiàng)目下apm_proto 去找對應(yīng)的信息打印。

建議的開發(fā)思路

  1. 先去找找server項(xiàng)目中是否有類似的例子或者同產(chǎn)品中的源代碼是己,理解相關(guān)的插碼思路骂因。
  2. 熟悉要開發(fā)或者要適配的框架,相關(guān)原理以及使用例子赃泡。
  3. 編寫前寒波,先把整體適配邏輯寫出來。
  4. 找要適配的框架的要進(jìn)行插碼的入口以及需要或許相關(guān)信息的入口
  5. 整合起來后升熊,把整體思路在理一遍俄烁,進(jìn)行編寫。
  6. 開發(fā)完级野,在測試項(xiàng)目中進(jìn)行跑一遍页屠,同時(shí)壓測下。在agent日志以及測試平臺(tái)查看相關(guān)打印信息蓖柔。
  7. 整理相關(guān)報(bào)告辰企。

最重要的還是復(fù)盤: 提高開發(fā)效率。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末况鸣,一起剝皮案震驚了整個(gè)濱河市牢贸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镐捧,老刑警劉巖潜索,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異懂酱,居然都是意外死亡竹习,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門列牺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來整陌,“玉大人,你說我怎么就攤上這事∶诒瑁” “怎么了并炮?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長甥郑。 經(jīng)常有香客問我,道長荤西,這世上最難降的妖魔是什么澜搅? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮邪锌,結(jié)果婚禮上勉躺,老公的妹妹穿的比我還像新娘。我一直安慰自己觅丰,他們只是感情好饵溅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妇萄,像睡著了一般蜕企。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冠句,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天轻掩,我揣著相機(jī)與錄音,去河邊找鬼懦底。 笑死唇牧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的聚唐。 我是一名探鬼主播丐重,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼杆查!你這毒婦竟也來了扮惦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亲桦,失蹤者是張志新(化名)和其女友劉穎径缅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烙肺,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纳猪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桃笙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氏堤。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鼠锈,到底是詐尸還是另有隱情闪檬,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布购笆,位于F島的核電站粗悯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏同欠。R本人自食惡果不足惜样傍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铺遂。 院中可真熱鬧衫哥,春花似錦、人聲如沸襟锐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粮坞。三九已至蚊荣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間莫杈,已是汗流浹背妇押。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姓迅,地道東北人敲霍。 一個(gè)月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像丁存,于是被迫代替她去往敵國和親肩杈。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355