JVM-SANDBOX

JVM-SANDBOX的核心功能是什么?

實時無侵入AOP框架

在常見的AOP框架實現方案中,有靜態(tài)編織和動態(tài)編織兩種。

靜態(tài)編織

靜態(tài)編織發(fā)生在字節(jié)碼生成時根據一定框架的規(guī)則提前將AOP字節(jié)碼插入到目標類和方法中,實現AOP;

動態(tài)編織

動態(tài)編織則允許在JVM運行過程中完成指定方法的AOP字節(jié)碼增強.常見的動態(tài)編織方案大多采用重命名原有方法,再新建一個同簽名的方法來做代理的工作模式來完成AOP的功能(常見的實現方案如CgLib),但這種方式存在一些應用邊界:

侵入性

對被代理的目標類需要進行侵入式改造。比如:在Spring中必須是托管于Spring容器中的Bean

固化性

目標代理方法在啟動之后即固化,無法重新對一個已有方法進行AOP增強

熱部署特性

還有一些實現AOP的方式是通過類似熱部署的方式完成,但現有的熱部署實現方案也存在一些應用邊界:

性能折損巨大

對JVM存在侵入性

必須啟動時顯式開啟

基于此我通過JDK6所提供的Instrumentation-API實現了利用HotSwap技術在不重啟JVM的情況下實現對任意方法的AOP增強。而且性能開銷還在可以接受的范圍之內。

動態(tài)可插拔容器

為了實現沙箱模塊的動態(tài)熱插拔,容器客戶端和沙箱動態(tài)可插拔容器采用HTTP協議進行通訊,底層用Jetty8作為HTTP服務器。

JVM-SANDBOX能做什么?

在JVM沙箱(以下簡稱沙箱)的世界觀中,任何一個Java方法的調用都可以分解為BEFORE、RETURN和THROWS三個環(huán)節(jié),由此在三個環(huán)節(jié)上引申出對應環(huán)節(jié)的事件探測和流程控制機制。

// BEFOREtry { /* * do something... */ // RETURN return;} catch (Throwable cause) { // THROWS}

基于BEFORE、RETURN和THROWS三個環(huán)節(jié)事件,可以完成很多類AOP的操作。

可以感知和改變方法調用的入參

可以感知和改變方法調用返回值和拋出的異常

可以改變方法執(zhí)行的流程

在方法體執(zhí)行之前直接返回自定義結果對象,原有方法代碼將不會被執(zhí)行

在方法體返回之前重新構造新的結果對象,甚至可以改變?yōu)閽伋霎惓?/p>

在方法體拋出異常之后重新拋出新的異常,甚至可以改變?yōu)檎7祷?/p>

JVM沙箱都有哪些可能的應用場景

線上故障定位

線上系統流控

線上故障模擬

方法請求錄制和結果回放

動態(tài)日志打印

安全信息監(jiān)測和脫敏

JVM沙箱還能幫助你做很多很多,取決于你的腦洞有多大了。

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容