远程热部署的落地实践

前言

      所谓热部署,就是在应用正在运行时升级软件,却不需要重新启动应用。对于 Java应用程序来说,热部署就是在运行时更新 Java 类文件,同时触发 Spring 以及其他常用第三方框架的一系列重新加载的过程。而在开发的过程中每天重启服务5-12次,单次3-8分钟,每天部署3-5次,部署频繁耗时长,严重影响上线的效率。而插件提供的本地和远程热部署功能,可让将代码变更“秒级”生效。

优势

      在使用热部署插件之后,开发者修改代码远程热部署能够秒级(2~10s)生效,开发者直接发起服务调用,可以节省大量的碎片化时间(热部署插件还具备流量回放、远程调用、远程反编译等功能,可配合进行使用)。

热部署的难点

      因为热部署不等同于热重启,像 Tomcat 或者 Spring Boot DevTools 此类热重启模式需要重新加载项目,性能较差增量热部署难度较大,需要兼容常用的中间件版本,需要深入启动销毁加载流程。另外需遵循四大原则。

热部署的难点:

1、可参照资料匮乏

2、字节码操作难度大

3、HOTSWAP限制

4、Spring源码复杂

5、兼容框架多

6、部署方式多

7、环境打通难

8、用户问题调试难

设计方案

架构设计

      插件由 4 大部分组成,包括脚本端、插件端、Agent 端,以及 服务端。脚本端负责自动化构建 Sonic 启动参数服务启动等集成工作IDEA 插件端集成环境为开发者提供更便捷的热部署服务Agent 端随项目启动负责热部署的功能实现服务端则负责收集热部署信息、失败上报等统计工作。如下图所示:

功能流转

    组件是通过 NIO 监听本地文件变更,触发文件变更事件,例如 Class 新增、Class修改、Spring Bean 重载等事件流程。下图展示了一次热部署单个文件的生命周期:

文件监听

      首先会在本地和远程预定义两个目录,/var/tmp/sonic/extraClass�path 和 /var/tmp/sonic/classes。extraClasspath 为 Sonic 自 定 义 的 拓 展Classpath URL,classes 为 Sonic 监听的目录,当有文件变更时,通过 IDEA 插件来部署到远程 / 本地,触发 Agent 的监听目录,来继续下面的热加载逻辑:

注意:

      因为考虑到业务方WAR 包的 API 项目、Spring Boot、Tomcat 项目、Jetty 项目等,都是以 JAR 包来启动的,这样是无法直接修改用户的 Class 文件的。即使是用户项目可以修改,直接操作用户的 Class,也会带来一系列的安全问题。所以,Sonic 采用拓展 ClassPath URL 路径来实现文件的修改和新增

        并且存在这么一种场景,多个业务侧的项目引入相同的 JAR 包,在 JAR 里面配置 MyBatis 的XML 和注解。在此类情况下,Sonic 没有办法直接来修改 JAR 包中源文件,通过拓展路径的方式可以不需要关注 JAR 包,来修改 JAR 包中某一文件和 XML。同理,采用此类方法可以进行整个 JAR 包的热替换。

JVM Class重载

        JVM 的字节码批量重载逻辑,通过新的字节码二进制流和旧的 Class 对象生成ClassDefinition 定 义,instrumentation.redefineClasses(definitions), 来 触 发JVM 重载,重载过后将触发初始化时 Spring 插件注册的 Transfrom。

        新增 class Sonic 如何保证可以加载到 Classloader 上下文中?由于项目在远程执行,所以运行环境复杂,有可能是 JAR 包方式启动(Spring Boot),也有可能是普通项目,也有可能是 War Web 项目,针对此类情况 Sonic 做了一层 ClassloaderURL 拓展

Spring Bean 重载

Spring XML重载

      当用户修改 / 新增 Spring XML 时,需要对 XML 中所有 Bean 进行重载

      重新 Reload 之后,将 Spring 销毁后重启。需要注意的是:XML 修改方式改动较大,可能涉及到全局的 AOP 的配置以及前置和后置处理器相关的内容,影响范围为全局,所以目前只放开普通的 XML Bean 标签的新增 / 修改,其他能力酌情逐步放开。

MyBatis 热部署

      Spring MyBatis 热部署的主要处理流程是在启动期间获取所有 Configuration 路径,并维护它和 Spring Context 的对应关系在热部署 Class、XML 时去匹配Configuration,从而重新加载 Configuration 以达到热部署的目的

总结

      当前热部署主要是注重Spring Bean、Spring MVC、MyBatis 的重载流程。对于其他开发框架,需要更加深入了解底层实现,以达到兼容性。

补充说明

      此文只做博主了解热部署相关文档做的简单说明,该插件实现难度非常大。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容