其他
Java系列 | 远程热部署在美团的落地实践
总第495篇
2022年 第012篇
1 前言
1.1 什么是热部署
1.2 为什么我们需要热部署
1.3 热部署难在哪
1.4 Sonic可以做什么
1.5 技术产品落地和推广实践经验
2 整体设计方案
2.1 Sonic结构
2.2 走进Agent
2.3 那些年JVM和HotSwap之间的相爱相杀
2.4 Sonic如何解决Instrumentation的局限性
3 Sonic热部署技术解析
3.1 Sonic整体架构模型
3.2 Sonic功能流转
3.3 文件监听
3.4 Jvm Class Reload
3.5 Spring Bean重载
3.6 Spring XML重载
3.7 MyBatis 热部署
4 总结
4.1 热部署功能一览
4.2 IDE插件集成
4.3 推广使用情况
1 前言
1.1 什么是热部署
1.2 为什么我们需要热部署
1.2.1 开发自测场景
1.2.2 联调场景
1.3 热部署难在哪
1.4 Sonic可以做什么
1.5 Sonic远程热部署落地推广的实践经验
2 整体设计方案
2.1 Sonic结构
2.2 走进Agent
2.2.1 Instrumentation类常用API
//增加一个Class 文件的转换器,转换器用于改变 Class 二进制流的数据,参数 canRetransform 设置是否允许重新转换。
void addTransformer(ClassFileTransformer transformer, boolean canRetransform);
//在类加载之前,重新定义 Class 文件,ClassDefinition 表示对一个类新的定义,
//如果在类加载之后,需要使用 retransformClasses 方法重新定义。addTransformer方法配置之后,后续的类加载都会被Transformer拦截。
//对于已经加载过的类,可以执行retransformClasses来重新触发这个Transformer的拦截。类加载的字节码被修改后,除非再次被retransform,否则不会恢复。
void addTransformer(ClassFileTransformer transformer);
//删除一个类转换器
boolean removeTransformer(ClassFileTransformer transformer);
//是否允许对class retransform
boolean isRetransformClassesSupported();
//在类加载之后,重新定义 Class。这个很重要,该方法是1.6 之后加入的,事实上,该方法是 update 了一个类。
void retransformClasses(Class<?>... classes) throws UnmodifiableClassException;
//是否允许对class重新定义
boolean isRedefineClassesSupported();
//此方法用于替换类的定义,而不引用现有的类文件字节,就像从源代码重新编译以进行修复和继续调试时所做的那样。
//在要转换现有类文件字节的地方(例如在字节码插装中),应该使用retransformClasses。
//该方法可以修改方法体、常量池和属性值,但不能新增、删除、重命名属性或方法,也不能修改方法的签名
void redefineClasses(ClassDefinition... definitions) throws ClassNotFoundException, UnmodifiableClassException;
//获取已经被JVM加载的class,有className可能重复(可能存在多个classloader)
@SuppressWarnings("rawtypes")
Class[] getAllLoadedClasses();
}
2.2.2 Instrument简介
2.2.3 启动时和运行时加载Instrument Agent过程
2.3 那些年JVM和HotSwap之间的“相爱相杀”
2.4 Sonic如何解决Instrumentation的局限性
3 Sonic热部署技术解析
3.1 Sonic整体架构模型
3.2 Sonic功能流转
3.3 文件监听
/var/tmp/sonic/extraClasspath
和/var/tmp/sonic/classes
。extraClasspath为Sonic自定义的拓展Classpath URL,classes为Sonic监听的目录,当有文件变更时,通过IDEA插件来部署到远程/本地,触发Agent的监听目录,来继续下面的热加载逻辑:3.4 JVM Class Reload
3.5 Spring Bean重载
3.6 Spring XML重载
3.7 MyBatis 热部署
4 总结
4.1 热部署功能一览
4.2 IDE插件集成
4.3 推广使用情况
5 作者简介
6 参考文章
阅读更多