敞开成长之旅!这是我参与「日新计划 12 月更文挑战」的第 35 天,点击查看活动详情

我是石页兄,朋友不因远而疏,高山不隔友谊情;偶遇美羊羊,我们相互鼓舞

欢迎关注微信大众号「架构染色」沟通和学习

一、alibaba/jvm-sandbox 概述

alibaba/jvm-sandbox 是 JVM 沙箱容器,一种 JVM 的非侵入式运行期 AOP 处理计划。沙箱容器供给

  1. 动态增强类你所指定的类,获取你想要的参数和行信息乃至改变办法履行
  2. 动态可插拔容器结构

在其能力至上构建的上层使用有:

  • chaosblade-io/chaosblade
    • 其chaosblade-io/chaosblade-exec-jvm 是一个依据 jvm-sandbox 的 chaosblade 履行器,用于经过增强类在 Java 使用程序上进行混沌实验。
  • alibaba/jvm-sandbox-repeater
    • 依据 JVM-Sandbox 的录制/回放通用处理计划

二、实时无侵入 AOP 结构计划比照

在常见的 AOP 结构完结计划中,有静态织造和动态织造两种。

  1. 静态织造:静态织造发生在字节码生成时依据一定结构的规则提前将 AOP 字节码刺进到方针类和办法中,完结 AOP;

  2. 动态织造:动态织造则允许在 JVM 运行过程中完结指定办法的 AOP 字节码增强.常见的动态织造计划大多选用重命名原有办法,再新建一个同签名的办法来做署理的工作形式来完结 AOP 的功能(常见的完结计划如 CgLib),但这种方式存在一些使用鸿沟:

    • 侵入性:对被署理的方针类需求进行侵入式改造。比方:在 Spring 中有必要是托管于 Spring 容器中的 Bean
    • 固化性:方针署理办法在启动之后即固化,无法从头对一个已有办法进行 AOP 增强

要处理无侵入的特性需求 AOP 结构具有 在运行时完结方针办法的增强和替换。在 JDK 的规范中运行期重界说一个类有必要准循以下准则

  1. 不允许新增、修正和删去成员变量
  2. 不允许新增和删去办法
  3. 不允许修正办法签名

JVM-SANDBOX 归于依据 Instrumentation 的动态织造类的 AOP 结构,经过精心结构了字节码增强逻辑,使得沙箱的模块能在不违反 JDK 约束情况下完结对方针使用办法的无侵入运行时 AOP 拦截

三、依据事情的行为注入和流控

【alibaba/jvm-sandbox#02】通过无侵入AOP实现行为注入和流控

在沙箱的世界观中,任何一个 Java 办法的调用都能够分解为BEFORERETURNTHROWS三个环节,由此在三个环节上引申出对应环节的事情勘探和流程控制机制。

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

依据BEFORERETURNTHROWS三个环节事情分离,沙箱的模块能够完结很多类 AOP 的操作。

  1. 能够感知和改变办法调用的入参

  2. 能够感知和改变办法调用回来值和抛出的反常

  3. 能够改变办法履行的流程

    • 在办法体履行之前直接回来自界说成果目标,原有办法代码将不会被履行
    • 在办法体回来之前从头结构新的成果目标,乃至能够改变为抛出反常
    • 在办法体抛出反常之后从头抛出新的反常,乃至能够改变为正常回来

【alibaba/jvm-sandbox#02】通过无侵入AOP实现行为注入和流控

四、最终说一句

我是石页兄,如果这篇文章对您有帮助,或者有所启示的话,欢迎关注笔者的微信大众号【 架构染色 】进行沟通和学习。您的支撑是我坚持写作最大的动力。

欢迎点击链接扫马儿关注、沟通。