99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

解析 Sermant 熱插拔能力:服務(wù)運(yùn)行時(shí)動(dòng)態(tài)掛載 JavaAgent 和插件

王程 ? 來(lái)源:jf_75796907 ? 作者:jf_75796907 ? 2024-02-18 10:09 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、概述

Sermant 是基于 Java 字節(jié)碼增強(qiáng)技術(shù)的無(wú)代理服務(wù)網(wǎng)格,其利用 Java 字節(jié)碼增強(qiáng)技術(shù),為宿主應(yīng)用程序提供服務(wù)治理功能,以解決大規(guī)模微服務(wù)場(chǎng)景中的服務(wù)治理問(wèn)題,通過(guò) Java 字節(jié)碼增強(qiáng)技術(shù),可以非侵入的提供服務(wù)治理能力。在以往版本中,Sermant 通過(guò)配置 - javaagent 指令在微服務(wù)啟動(dòng)時(shí)接入服務(wù)治理能力,當(dāng)需要接入及卸載 Sermant 時(shí)都需要通過(guò)重新啟動(dòng)微服務(wù)來(lái)完成。但從 1.2.0 版本開(kāi)始,Sermant 實(shí)現(xiàn)了在服務(wù)不停機(jī)狀態(tài)下進(jìn)行安裝和卸載的能力,為服務(wù)治理能力帶來(lái)全新接入體驗(yàn)。本文將會(huì)對(duì)這種動(dòng)態(tài)接入的機(jī)制,從技術(shù)基礎(chǔ)到 Sermant 設(shè)計(jì)進(jìn)行一次深入分析。

二、JavaAgent 加載方式

首先介紹一下 JavaAgent 的不同接入方式,這是 Sermant 實(shí)現(xiàn)動(dòng)態(tài)接入能力的技術(shù)基礎(chǔ)。Java 中 Instrumentation API 提供了一種修改字節(jié)碼的機(jī)制,利用該 API,可以通過(guò)修改字節(jié)碼的方式來(lái)改變程序的行為,而不用觸及程序的源碼。JavaAgent 為 Instrumentation API 的客戶端,通過(guò) JavaAgent 可以調(diào)用 API 進(jìn)行字節(jié)碼的操作,其提供了兩種加載方式給開(kāi)發(fā)者重載:

靜態(tài)加載:利用 premain,在應(yīng)用程序啟動(dòng)時(shí)加載 JavaAgent 稱為靜態(tài)加載,靜態(tài)加載會(huì)在啟動(dòng)時(shí)在執(zhí)行任何代碼之前修改字節(jié)碼。

wKgZomXPLDiAOeKFAACU6YF6H-4790.pngwKgZomXPK9uAWf__AACU6YF6H-4998.png

靜態(tài)加載時(shí),字節(jié)碼增強(qiáng)是在類加載時(shí)發(fā)生的,當(dāng) Java 程序啟動(dòng)時(shí),類加載過(guò)程中所有被加載的類都會(huì)經(jīng)過(guò) JavaAgent 所定義的類文件轉(zhuǎn)換器的處理。

動(dòng)態(tài)加載:利用 agentmain 通過(guò) Java Attach API 將 JavaAgent 加載到已運(yùn)行的 JVM 中,動(dòng)態(tài)加載可以通過(guò)字節(jié)碼重轉(zhuǎn)換的方式在運(yùn)行時(shí)修改字節(jié)碼。

wKgaomXPLDmAOjbwAACZQB7Vbyo997.pngwKgZomXPK--AcDYZAACZQB7Vbyo681.png

動(dòng)態(tài)加載時(shí),和靜態(tài)加載不同的是,此時(shí) JVM 已在運(yùn)行,目標(biāo)類已被加載,就不能像靜態(tài)加載時(shí)一樣觸發(fā)字節(jié)碼增強(qiáng)過(guò)程,在使用動(dòng)態(tài)加載的過(guò)程中,往。往會(huì)通過(guò) Instrumentation API 來(lái)觸發(fā)目標(biāo)類(當(dāng)然也可以指定所有已被加載的類)的重轉(zhuǎn)換過(guò)程,在重轉(zhuǎn)換過(guò)程中就會(huì)觸發(fā)到 Agent 構(gòu)建的類文件轉(zhuǎn)換器,從而完成字節(jié)碼增強(qiáng)過(guò)程。

動(dòng)態(tài)加載方式為 JavaAgent 提供了在 JVM 運(yùn)行時(shí)接入的能力,但通過(guò)類重轉(zhuǎn)換來(lái)觸發(fā)字節(jié)碼增強(qiáng)相對(duì)于在類加載時(shí)增強(qiáng)有一定的局限性,例如不能在增強(qiáng)時(shí)修改類的繼承關(guān)系,不能為類添加靜態(tài)代碼塊,不能增強(qiáng)內(nèi)存中和資源文件中字節(jié)碼不一致的類等,這些也是在使用動(dòng)態(tài)加載和多 JavaAgent 場(chǎng)景中常見(jiàn)的問(wèn)題,綜上,兩種加載方式各有利弊,可以在使用時(shí)按照業(yè)務(wù)場(chǎng)景選擇。

三、Sermant 熱插拔能力關(guān)鍵問(wèn)題剖析

在了解技術(shù)基礎(chǔ)后,我們能輕易的想到,理論上基于 JavaAgent 的動(dòng)態(tài)加載方式,只需要在使用 Sermant 時(shí),將通過(guò) premain 方式啟動(dòng)改為通過(guò) agentmain 方式啟動(dòng),就可以將微服務(wù)治理能力動(dòng)態(tài)的接入到微服務(wù)中,做到微服務(wù)零侵入、微服務(wù)不停機(jī)的狀態(tài)下接入服務(wù)治理能力,但通往前方的路上總是充滿了障礙:

3.1 如何保證動(dòng)態(tài)安裝過(guò)程中重轉(zhuǎn)換可順利執(zhí)行?

這個(gè)問(wèn)題的出現(xiàn),根源在于 JavaAgent 通過(guò) agentmain 方式加載到已運(yùn)行的 JVM 中時(shí),不同于靜態(tài)加載,會(huì)在類初次被加載時(shí)完成字節(jié)碼的轉(zhuǎn)換,動(dòng)態(tài)加載時(shí)一些需要被字節(jié)碼增強(qiáng)類已經(jīng)完成了類加載過(guò)程,這時(shí)候需要使用 Instrumentation 提供的類重轉(zhuǎn)換(retransform classes)能力來(lái)修改字節(jié)碼,在 Instrumentation 的 Javadoc 中關(guān)于這個(gè)能力有這樣一段描述:

“The retransformation must not add, remove or rename fields or methods, change the signatures of methods, or change inheritance.(重轉(zhuǎn)換過(guò)程中,我們不能新增、刪除或者重命名字段和方法,不能更改方法的簽名,不能更改類的繼承。)”

從中可以看出,在引入動(dòng)態(tài)加載能力前,優(yōu)先要保證字節(jié)碼增強(qiáng)時(shí),不可以有上述內(nèi)容中所描述的限制操作。

不過(guò) Sermant 不太需要擔(dān)心這個(gè)問(wèn)題,因?yàn)檫@種限制不僅僅在動(dòng)態(tài)加載時(shí)會(huì)觸發(fā),在多個(gè) JavaAgent 同時(shí)使用時(shí)也可能會(huì)觸發(fā),可以參考 Sermant 團(tuán)隊(duì)的另一篇文章:《記一次多個(gè) JavaAgent 同時(shí)使用的類增強(qiáng)沖突問(wèn)題及分析》。為了保證在多 Agent 場(chǎng)景下的兼容性,Sermant 的字節(jié)碼增強(qiáng)模板嚴(yán)格遵循 Instrumentation API 的限制,因此 Sermant 在兼容性上的不斷改進(jìn)過(guò)程中無(wú)心插柳,幫助動(dòng)態(tài)加載能力鋪平了路。

3.2 如何保證在服務(wù)治理插件安裝和卸載時(shí)不互相影響?

Sermant 的設(shè)計(jì)中,通過(guò)字節(jié)碼增強(qiáng)引入的服務(wù)治理能力,是通過(guò)在目標(biāo)方法上添加服務(wù)治理功能切面來(lái)完成的,每一個(gè)服務(wù)治理插件,通過(guò)一系列切面的配合來(lái)達(dá)成最終的服務(wù)治理效果。不同的服務(wù)治理功能,可能會(huì)對(duì)同一個(gè)目標(biāo)方法進(jìn)行處理。但并不會(huì)對(duì)同一個(gè)方法進(jìn)行多次字節(jié)碼增強(qiáng),而是通過(guò)一次字節(jié)碼增強(qiáng)織入調(diào)度切面(onMethodEnter、onMethodExit 等),通過(guò)該切面對(duì)相關(guān)的服務(wù)治理能力(通過(guò)攔截器實(shí)現(xiàn),每一個(gè)切面會(huì)對(duì)應(yīng)一個(gè)攔截器的列表)進(jìn)行調(diào)度:

wKgZomXPLDmALI3hAACenH9Ro5I964.pngwKgaomXPK_6AAENeAACenH9Ro5I795.png

對(duì)于服務(wù)治理能力的調(diào)度邏輯我們?cè)诹硪黄恼隆堕_(kāi)發(fā)者能力機(jī)制解析,玩轉(zhuǎn) Sermant 開(kāi)發(fā)》有講過(guò),本篇不再贅述。

基于框架的基本設(shè)計(jì),就需要考慮兩個(gè)問(wèn)題,當(dāng)插件在動(dòng)態(tài)安裝時(shí),如何保證不重復(fù)字節(jié)碼增強(qiáng)?當(dāng)插件卸載時(shí),如何保證不會(huì)導(dǎo)致有相同目標(biāo)方法的插件失效。

安裝時(shí)如何保證不重復(fù)執(zhí)行字節(jié)碼增強(qiáng)?

在字節(jié)碼增強(qiáng)開(kāi)發(fā)過(guò)程中,類文件轉(zhuǎn)換器(ClassFileTransformer)是一定會(huì)接觸到的概念,開(kāi)發(fā)者需要基于該轉(zhuǎn)換器來(lái)進(jìn)行字節(jié)碼的處理。在大多數(shù)的字節(jié)碼增強(qiáng)框架中,都會(huì)對(duì)其進(jìn)行封裝,用于降低字節(jié)碼處理的難度。Sermant 基于 ByteBuddy 提供的類文件轉(zhuǎn)換器實(shí)現(xiàn)了一種可重入的類轉(zhuǎn)換器,在插件動(dòng)態(tài)安裝時(shí),雖然目標(biāo)方法已經(jīng)被已安裝的插件增強(qiáng)過(guò)了,但此時(shí)還是會(huì)觸發(fā)類文件轉(zhuǎn)換(因?yàn)閯?dòng)態(tài)安裝插件的過(guò)程是獨(dú)立的),當(dāng)觸發(fā)類文件轉(zhuǎn)換時(shí),所有相關(guān)的類文件轉(zhuǎn)換器都會(huì)被喚醒,再次觸發(fā)類文件轉(zhuǎn)換過(guò)程。每次可重入類轉(zhuǎn)換器被喚醒時(shí),將發(fā)生以下行為:

wKgaomXPLDqAPjSxAAJmM8E6Ha0534.pngwKgZomXPLBGARfotAAJmM8E6Ha0706.png

在 Sermant 中維護(hù)了一個(gè)針對(duì)目標(biāo)方法的字節(jié)碼增強(qiáng)鎖(AdviceKey 鎖),即針對(duì)每一個(gè)目標(biāo)方法,維護(hù)了 1 個(gè)信號(hào)量當(dāng)做鎖,用于讓各類文件轉(zhuǎn)換器來(lái)檢查目標(biāo)方法的字節(jié)碼增強(qiáng)狀態(tài),當(dāng)目標(biāo)方法對(duì)應(yīng)的類被類轉(zhuǎn)換時(shí),就會(huì)觸發(fā) Sermant 所提供的類文件轉(zhuǎn)換器,此時(shí)類文件轉(zhuǎn)換器將嘗試獲取針對(duì)目標(biāo)方法的信號(hào)量,如果能獲取信號(hào)量,則執(zhí)行對(duì)目標(biāo)方法的字節(jié)碼增強(qiáng),如果不能獲取,則不執(zhí)行字節(jié)碼增強(qiáng)。

基于字節(jié)碼增強(qiáng)鎖,在轉(zhuǎn)換器觸發(fā)時(shí),主要有兩條路徑可以走,類文件轉(zhuǎn)換器會(huì)通過(guò)目標(biāo)方法的 AdviceKey(類名 + 方法 hash+ 類加載器組成的一個(gè)唯一表示,用于表示字節(jié)碼增強(qiáng)的目標(biāo)) 來(lái)檢查其所關(guān)聯(lián)的鎖,判斷當(dāng)前目標(biāo)方法是否已被 Sermant 進(jìn)行過(guò)字節(jié)碼增強(qiáng)(織入攔截器調(diào)度的切面):

1.能獲取鎖,說(shuō)明未被增強(qiáng):則當(dāng)前文件轉(zhuǎn)換器獲取當(dāng)前 AdviceKey 所關(guān)聯(lián)的鎖,將其獲取的鎖通過(guò)其對(duì)應(yīng)的插件來(lái)維護(hù),并且執(zhí)行字節(jié)碼增強(qiáng),將服務(wù)治理所需的攔截器放入該 AdviceKey 所對(duì)應(yīng)的攔截器列表;

2.不能獲取鎖,說(shuō)明已被增強(qiáng):則只將攔截器放入該 AdviceKey 對(duì)應(yīng)的攔截器列表中,不執(zhí)行字節(jié)碼增強(qiáng)。
通過(guò)上述機(jī)制,就可以保證 Sermant 在安裝不同服務(wù)治理插件時(shí),不會(huì)進(jìn)行重復(fù)的字節(jié)碼增強(qiáng),避免無(wú)端的性能和資源損耗。

卸載時(shí)如何保證不會(huì)導(dǎo)致其他插件失效?

當(dāng)插件需要卸載時(shí),會(huì)再次觸發(fā)相關(guān)目標(biāo)類的重轉(zhuǎn)換,與安裝時(shí)不同的是,這次需要被卸載的插件釋放自身已經(jīng)持有的 AdviceKey 鎖。釋放鎖后,觸發(fā)目標(biāo)類重轉(zhuǎn)換時(shí),目標(biāo)類所對(duì)應(yīng)的各個(gè)插件的類文件轉(zhuǎn)換器將會(huì)再次觸發(fā)和安裝時(shí)相同的流程:

wKgZomXPLDuAJYdJAAJ4ZuzkUMQ275.pngwKgaomXPLCSABj97AAJ4ZuzkUMQ731.png

在這個(gè)過(guò)程中,未被卸載的插件所提供的對(duì)目標(biāo)類的類文件轉(zhuǎn)換器,會(huì)在目標(biāo)類重轉(zhuǎn)換時(shí),再次觸發(fā),并且只會(huì)經(jīng)歷獲取鎖和字節(jié)碼增強(qiáng)的過(guò)程。這樣就保證,如果還有插件需要對(duì)該目標(biāo)方法進(jìn)行字節(jié)碼增強(qiáng)時(shí),可以獲得目標(biāo)方法所對(duì)應(yīng)的鎖,不會(huì)因?yàn)槟繕?biāo)方法的交集而導(dǎo)致其他插件能力失效。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 轉(zhuǎn)換器
    +關(guān)注

    關(guān)注

    27

    文章

    9065

    瀏覽量

    151853
  • 熱插拔
    +關(guān)注

    關(guān)注

    2

    文章

    251

    瀏覽量

    38512
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2989

    瀏覽量

    109810
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    NI發(fā)布全新PXI機(jī)箱,全面提高系統(tǒng)正常運(yùn)行時(shí)

      在NI PXIe-1066DC機(jī)全新機(jī)箱中,NI為PXI平臺(tái)系列增加了冗余、熱插拔和前端接入功能,顯著增加了系統(tǒng)的正常運(yùn)行時(shí)
    發(fā)表于 05-28 09:08 ?2317次閱讀

    如何縮短Vivado的運(yùn)行時(shí)

    在Vivado Implementation階段,有時(shí)是有必要分析一下什么原因?qū)е?b class='flag-5'>運(yùn)行時(shí)間(runtime)過(guò)長(zhǎng),從而找到一些方法來(lái)縮短運(yùn)行時(shí)間。
    的頭像 發(fā)表于 05-29 14:37 ?1.5w次閱讀
    如何縮短Vivado的<b class='flag-5'>運(yùn)行時(shí)</b>間

    基于PCIe-Native機(jī)制的熱插拔

    熱插拔即帶電插拔,在虛擬化場(chǎng)景下,熱插拔就是在虛擬機(jī)運(yùn)行過(guò)程中對(duì)磁盤網(wǎng)卡等設(shè)備進(jìn)行動(dòng)態(tài)調(diào)整。
    的頭像 發(fā)表于 09-06 10:32 ?4941次閱讀

    如何檢查L(zhǎng)inux服務(wù)器的運(yùn)行時(shí)

    Linux 中的 uptime 用于查看系統(tǒng)啟動(dòng)后的運(yùn)行時(shí)間。它是一個(gè)比較簡(jiǎn)單的 Linux 命令,可以不帶參數(shù)直接運(yùn)行。
    發(fā)表于 11-25 15:25 ?1.6w次閱讀
    如何檢查L(zhǎng)inux<b class='flag-5'>服務(wù)</b>器的<b class='flag-5'>運(yùn)行時(shí)</b>間

    熱插拔是什么?熱插拔有哪些特點(diǎn)?

    恢復(fù)能力、擴(kuò)展性和靈活性等,例如一些面向高端應(yīng)用的磁盤鏡像系統(tǒng)都可以提供磁盤的熱插拔功能。具體用學(xué)術(shù)的說(shuō)法就是:熱替換(Hot replacement)、熱添加(hot expansion)和熱升級(jí)
    發(fā)表于 12-13 10:53

    即插即用和熱插拔的區(qū)別

    閉系統(tǒng),不切斷電源的情況下取出和更換損壞的硬盤、電源或板卡等部件,從而提高了系統(tǒng)對(duì)災(zāi)難的及時(shí)恢復(fù)能力、擴(kuò)展性和靈活性等,例如一些面向高端應(yīng)用的磁盤鏡像系統(tǒng)都可以提供磁盤的熱插拔功能。 具體用學(xué)術(shù)的說(shuō)法
    發(fā)表于 10-23 10:26

    通過(guò)測(cè)試的2V輸出60A熱插拔控制器完整設(shè)計(jì)

    描述此電路為熱插拔設(shè)計(jì),使用具有功率限制功能的 TPS2490 熱插拔控制器和兩個(gè) 30V CSD17570Q5B NexFET。此系統(tǒng)可用于安全服務(wù)器中,允許在系統(tǒng)正常運(yùn)行時(shí)插入線路
    發(fā)表于 11-16 16:50

    采用1.4 代NexFET的12V輸出60A熱插拔控制器參考設(shè)計(jì)

    描述此電路為熱插拔設(shè)計(jì),使用具有功率限制功能的 TPS2490 熱插拔控制器和兩個(gè) 30V CSD17570Q5B NexFET。此系統(tǒng)可用于安全服務(wù)器中,允許在系統(tǒng)正常運(yùn)行時(shí)插入線路
    發(fā)表于 09-26 07:26

    紫金橋組態(tài)軟件新的功能_運(yùn)行時(shí)組態(tài)

    運(yùn)行時(shí)組態(tài)是組態(tài)軟件新近提出的新的概念。運(yùn)行時(shí)組態(tài)是在運(yùn)行環(huán)境下對(duì)已有工程進(jìn)行修改,添加新的功能。它不同于在線組態(tài),在線組態(tài)是在工程運(yùn)行的同時(shí),進(jìn)入組態(tài)環(huán)境,在組態(tài)環(huán)境中對(duì)工程進(jìn)行修改
    發(fā)表于 10-13 16:17 ?2次下載
    紫金橋組態(tài)軟件新的功能_<b class='flag-5'>運(yùn)行時(shí)</b>組態(tài)

    Go運(yùn)行時(shí):4年之后

    自 2018 年以來(lái),Go GC,以及更廣泛的 Go 運(yùn)行時(shí),一直在穩(wěn)步改進(jìn)。近日,Go 社區(qū)總結(jié)了 4 年來(lái) Go 運(yùn)行時(shí)的一些重要變化。
    的頭像 發(fā)表于 11-30 16:21 ?1060次閱讀

    ch32v307記錄程序運(yùn)行時(shí)

    ch32v307記錄程序運(yùn)行時(shí)間 在程序開(kāi)發(fā)中,很重要的一項(xiàng)任務(wù)就是對(duì)程序的運(yùn)行時(shí)間進(jìn)行評(píng)估。對(duì)于大型的程序系統(tǒng)來(lái)說(shuō),它們通常需要處理大量的數(shù)據(jù)或進(jìn)行復(fù)雜的計(jì)算操作。因此,如果程序的運(yùn)行時(shí)間過(guò)長(zhǎng)
    的頭像 發(fā)表于 08-22 15:53 ?1284次閱讀

    Xilinx運(yùn)行時(shí)(XRT)發(fā)行說(shuō)明

    電子發(fā)燒友網(wǎng)站提供《Xilinx運(yùn)行時(shí)(XRT)發(fā)行說(shuō)明.pdf》資料免費(fèi)下載
    發(fā)表于 09-14 10:01 ?0次下載
    Xilinx<b class='flag-5'>運(yùn)行時(shí)</b>(XRT)發(fā)行說(shuō)明

    如何保證它們?nèi)萜?b class='flag-5'>運(yùn)行時(shí)的安全?

    緊密耦合的容器運(yùn)行時(shí)繼承了主機(jī)操作系統(tǒng)的安全態(tài)勢(shì)和攻擊面。運(yùn)行時(shí)或主機(jī)內(nèi)核中的任何漏洞及其利用都會(huì)成為攻擊者的潛在切入點(diǎn)。
    的頭像 發(fā)表于 11-03 15:24 ?993次閱讀

    熱插拔和非熱插拔的區(qū)別

    熱插拔和非熱插拔的區(qū)別? 熱插拔和非熱插拔是指電子設(shè)備或組件在工作狀態(tài)下是否可以進(jìn)行插拔操作的一種分類。
    的頭像 發(fā)表于 12-28 10:01 ?3932次閱讀

    熱插拔是什么意思

    于計(jì)算機(jī)、服務(wù)器、存儲(chǔ)設(shè)備以及各類電子設(shè)備的連接管理中,極大地提高了系統(tǒng)的可靠性、靈活性、可維護(hù)性和災(zāi)難恢復(fù)能力。以下是對(duì)熱插拔技術(shù)的詳細(xì)解析。
    的頭像 發(fā)表于 10-29 17:49 ?5539次閱讀