- 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
public interface Instrumentation {
//增加一个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 参考文章
本文由高可用架构翻译。技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://sigusoft.com/idea/820.html