溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何基于IDEA插件開發(fā)和字節(jié)碼插樁技術(shù),實現(xiàn)研發(fā)交付質(zhì)量自動分析

發(fā)布時間:2021-10-19 11:50:32 來源:億速云 閱讀:124 作者:iii 欄目:web開發(fā)

本篇內(nèi)容介紹了“如何基于IDEA插件開發(fā)和字節(jié)碼插樁技術(shù),實現(xiàn)研發(fā)交付質(zhì)量自動分析”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

一、前言

如何保證代碼質(zhì)量?

如何基于IDEA插件開發(fā)和字節(jié)碼插樁技術(shù),實現(xiàn)研發(fā)交付質(zhì)量自動分析

業(yè)務提需求,產(chǎn)品定方案,研發(fā)做實現(xiàn),測試驗流程。四種角色的相互配合是確保一個需求上線的必備條件。在整個需求的交付質(zhì)量級別劃分中,研發(fā)與測試是非常重的一環(huán),如果研發(fā)提測的代碼質(zhì)量不高,就會出現(xiàn)不同級別的修BUG、返工甚至重做的風險。

那么,怎么來提高代碼質(zhì)量呢?一般我們都會要求研發(fā)在開發(fā)代碼的過程中編寫單元測試,驗證自己的代碼邏輯。如果最終單元測試覆蓋度不足,可以由測試拒絕研發(fā)提測。

但是,整個需求實現(xiàn)的代碼是在全部開發(fā)完成后提測的,也就是臨近上線的最后一環(huán),大家才知道某個研發(fā)的某個功能域的實現(xiàn)是否具備提測條件。如果這個時候代碼質(zhì)量不高,那么接下來就是項目風險的時候。壓測試時間、調(diào)上線時間,總之有病拖著最后成大病了!

當然,你可以在項目開發(fā)期間定期排查代碼,或者在日會進度反饋等等手段??蛇@樣需要耗費大量時間1拖1的開發(fā)排查方式很難滿足復雜流程的較大型項目開發(fā),而且對于項目風險把控也是不可預估的。

如何基于IDEA插件開發(fā)和字節(jié)碼插樁技術(shù),實現(xiàn)研發(fā)交付質(zhì)量自動分析

所以,我們希望采集研發(fā)在開發(fā)過程中的執(zhí)行動作,把風險判斷提前。實際操作舉例就是,當你開發(fā)完成一個接口,開始測試運行時,我們的插件就可以采集到這個接口的全部信息,包括:接口名稱、入?yún)㈩愋秃蛢?nèi)容、出參類型和內(nèi)容、異常信息、調(diào)用關(guān)系鏈等。而再把這些信息匯總提交到服務端,生成本次需求代碼分支下的全部接口動作,以及各系統(tǒng)間的關(guān)系鏈路,并附帶隨時生成最新的接口文檔和一鍵測試驗證功能。后期測試人員介入時就可以參考研發(fā)在編碼過程中的全部測試用例,也可以查看整個功能的覆蓋程度,此外測試人員測試過程中的數(shù)據(jù)也會被保留下?,F(xiàn)在擁有這些數(shù)據(jù)信息以后,就可以完整的生成一套研發(fā)測試質(zhì)量交付全覽圖,讓整個工程開發(fā)交付質(zhì)量評估透明化。

接下來我們就按照以上的描述性內(nèi)容,實踐開發(fā)一個案例體會下。走起!

二、技術(shù)實現(xiàn)準備

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 字節(jié)碼插樁,因為我們需要采集到接口執(zhí)行信息,那么就需要使用字節(jié)碼插樁組件給接口方法增強。這個實現(xiàn)有點類似谷歌的Dapper,大規(guī)模分布式架構(gòu)的非入侵監(jiān)控。只不過我們需要采集的描述性信息更多。關(guān)于字節(jié)碼插樁,可以了解ASM、Javassist、Byte-Buddy,它們都可以做此項工作。

  3. IDEA  插件開發(fā),因為我們需要在研發(fā)人員開發(fā)過程中進行采集,也不破壞研發(fā)的操作習慣。那么最好的方式就是嵌入到啟動運行中,只要在開發(fā)過程中有運行代碼的動作,就采集相應的接口信息。

  4. 最后就是數(shù)據(jù)的傳輸和處理,傳輸可以使用MQ或者直接用Netty。而處理數(shù)據(jù)的過程會相對比較復雜,在這個過程需要分析出有價值的數(shù)據(jù),同類的數(shù)據(jù),合并一條執(zhí)行鏈路的數(shù)據(jù),以及生成相關(guān)的接口文檔和工程服務地圖。

三、對字節(jié)碼插樁

這里我們使用的字節(jié)碼插樁組件是 Byte-buddy,它是一個代碼生成和操作庫,用于在Java 應用程序運行時創(chuàng)建和修改 Java  類,而無需編譯器的幫助。除了 Java 類庫附帶的代碼生成實用程序外,Byte Buddy  還允許創(chuàng)建任意類,并且不限于實現(xiàn)用于創(chuàng)建運行時代理的接口。此外,Byte Buddy 提供了一種方便的 API,可以使用 Java  代理或在構(gòu)建過程中手動更改類。

  • 無需理解字節(jié)碼指令,即可使用簡單的 API 就能很容易操作字節(jié)碼,控制類和方法。

  • 已支持Java 11,庫輕量,僅取決于Java字節(jié)代碼解析器庫ASM的訪問者API,它本身不需要任何其他依賴項。

  • 比起JDK動態(tài)代理、cglib、Javassist,Byte Buddy在性能上具有一定的優(yōu)勢。

1. 方法入口

public static void premain(String agentArgs, Instrumentation inst) {     AgentBuilder.Transformer transformer = (builder, typeDescription, classLoader, javaModule) -> {         return builder                 .method(ElementMatchers.any()) // 攔截任意方法                 .intercept(MethodDelegation.to(MonitorMethod.class));     };     new AgentBuilder             .Default()             .type(ElementMatchers.nameStartsWith(agentArgs))              .transform(transformer)             .installOn(inst); }

如果你接觸過 Javaagent 開發(fā),那么對于 premain  會比較熟悉。如果不清楚你可以把它理解為,它是程序啟動的時的方法入口,你可以從這個入口中攔截到你需要的方法,之后對它進行字節(jié)碼增強。其實也就是動態(tài)寫代碼,在方法中添加你的代碼,來收集方法信息。

2. 采集信息

@RuntimeType public static Object intercept(@Origin Method method, @SuperCall Callable<?> callable, @AllArguments Object[] args) throws Exception {     long start = System.currentTimeMillis();     Object resObj = null;     try {         resObj = callable.call();         return resObj;     } finally {         System.out.println("方法名稱:" + method.getName());         System.out.println("入?yún)€數(shù):" + method.getParameterCount());         for (int i = 0; i < method.getParameterCount(); i++) {             System.out.println("入?yún)?nbsp;Idx:" + (i + 1) + " 類型:" + method.getParameterTypes()[i].getTypeName() + " 內(nèi)容:" + args[i]);         }         System.out.println("出參類型:" + method.getReturnType().getName());         System.out.println("出參結(jié)果:" + resObj);         System.out.println("方法耗時:" + (System.currentTimeMillis() - start) + "ms");     } }

這個就是使用 Byte-Buddy  可以采集的信息,你可以通過注解入?yún)?,獲取到一個方法的全部信息。方法名稱、入?yún)€數(shù)、入?yún)㈩愋秃蛢?nèi)容、出參類型和結(jié)果以及還能計算方法執(zhí)行耗時。

四、IDEA 插件開發(fā)

關(guān)于 IDEA  插件開發(fā)的知識內(nèi)容較多,可以從GitHub搜索一些資料和查閱官方文檔:https://plugins.jetbrains.com/docs/intellij/gradle-build-system.html?from=jetbrains.org

此處演示案例關(guān)于插件開發(fā)的內(nèi)容比較簡單,主要是繼承com.intellij.execution.impl.DefaultJavaProgramRunner,Override  doExecute 方法,添加自己需要的內(nèi)容即可。

這部分添加的內(nèi)容核心就是在程序啟動時添加我們的字節(jié)碼插樁程序,如下:

@Override protected RunContentDescriptor doExecute(@NotNull RunProfileState state, @NotNull ExecutionEnvironment env) throws ExecutionException {     JavaParameters parameters = ((JavaCommandLine) state).getJavaParameters();     // 信息獲取     PsiFile psiFile = env.getDataContext().getData(LangDataKeys.PSI_FILE);     String packageName = ((PsiJavaFileImpl) psiFile).getPackageName();     // 添加字節(jié)碼插裝     ParametersList parametersList = parameters.getVMParametersList();     parametersList.add("-javaagent:" + this.getClass().getResource("/").getPath().substring(1) + "ProjectProbe.jar=" + packageName);     return super.doExecute(state, env); }

此處最核心的就是 -javaagent 把 ProjectProbe.jar 工程探針程序的Jar包加載進去。其他的就是一些關(guān)于 PsiFile API  的使用,感興趣可以閱讀官方文檔中的介紹。

五、效果演示

安裝插件

如何基于IDEA插件開發(fā)和字節(jié)碼插樁技術(shù),實現(xiàn)研發(fā)交付質(zhì)量自動分析

安裝插件就和我們正常安裝一樣,不過目前這個插件在開發(fā)階段,所以需要本地安裝。

運行效果

如何基于IDEA插件開發(fā)和字節(jié)碼插樁技術(shù),實現(xiàn)研發(fā)交付質(zhì)量自動分析

  • 上圖就是運行效果的案例演示,我們把運行時接口的信息完整的輸出到控制臺。

  • 在實際使用的過程中,會把這部分信息傳回服務端,由服務端分析處理后,展示在頁面上。

“如何基于IDEA插件開發(fā)和字節(jié)碼插樁技術(shù),實現(xiàn)研發(fā)交付質(zhì)量自動分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI