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沙箱還能幫助你做很多很多,取決于你的腦洞有多大了。