什么是热部署
所谓热部署,就是应用程序正在运行时对应用进行升级,而整个过程不需要重启应用。对Java应用程序而言,热部署就是在运行时更新Java文件或者配置文件,同时触发spring、mybatis等框架的重新加载的过程。整个编码过程,对代码的个各种变更,无需重启,所见即所得的立即生效。
为什么需要热部署
我们研发同学在日常开发调试阶段经常会遇到下面一些情况:
- spring bean中的属性遗漏@Resource或者@Autowired注解
- mybatis sql配置文件中的sql编写错误
- 实体类中增加(修改或者删除)属性导致Fastjson、Jackson无法正常序列化和反序列化
- 方法签名需要增加一个参数或者需要增加一个CheckedException的申明
- 类中增加静态Logger属性以增加日志输出
上面所列举的一些场景,我们研发同学必须通过重启服务(如tomcat)才能够使修改的代码生效。对于一些小型的系统重启一次可能只需要花费1分钟左右的时间,而对于大型系统重启一次往往需要5分钟左右。如果系统中大量使用到了dubbo、mq等技术,由于启动过程中需要建立大量的连接,重启所花费的时间可能会更长。据统计,研发同学每天大概需要重启服务10-20次。频繁的重启服务,严重影响了研发同学开发、调试的节奏,影响整体的工作效率。
热部署技术正是为了解决这一问题,热部署能够使研发人员对代码的绝大部分修改都能够立即生效。在一个可控的范围内,帮助研发同学减少频繁的重启服务次数,节省碎片化的时间,最终为研发同学每天节省一定量的时间。
热部署产品
目前市面上成熟的热部署产品不是特别多,主要有JRebel、IDEA HotSwap、HotSwapAgent、Spring Boot DevTools,下面我们来对比分析一下这些热部署产品。
JRebel
一款功能强大的热部署收费产品,以IDEA作为用户操作入口,生态较为庞大,基本上覆盖了Java生态下主流技术框架的热部署。其主要的缺点就是国产框架(fastjson、mybatis-plus等)基本上都不支持,并且是一款收费产品,需要破解。
IDEA HotSwap
IDEA自带的热部署,能力相对较弱,仅支持方法体的变更。诸如增加属性、增加方法、修改类的继承关系等变更类结构的操作都是被禁止的,并且spring、mybatis等Java主流框架均不支持。支持的场景非常有限,功能较为单一,难以满足研发同学的日常开发。
HotSwapAgent
一款免费开源的热部署Agent(github.com/HotswapProj… 国外团队开发的,同样也是不支持国产框架,但是由于其是完全免费开源的,我们可以基于它进行二次开发来支持国产框架的热部署。也正是因为是免费开源的,通过深入研究其源代码,发现其很多热部署场景支持的都存在一些问题,包括mybatis代理接口,spring框架整体支持上都存在一些问题。
标准的JVM在运行时只允许修改类的方法体,不允许修改类结构。HotSwapAgent团队为了解决这一来自JVM的限制研发了DCEVM补丁(github.com/dcevm/dcevm… 该补丁允许研发同学在运行期对类进行任何修改。也正是由于这一补丁的出现,使得真正意义上的热部署得以被实现(JRebel本质上也是使用类似的技术手段)。
Spring Boot DevTools
Spring Boot DevTools只能应用在Spring Boot项目中,并且它不是增量热部署,而是通过Classloader迭代的方式重启项目,对大项目而言,性能上是无法接受的。准确来说Spring Boot DevTools并非一个严格意义上的热部署产品。
FastHotSwapper
目前市面上的热部署产品大部分都是国外团队研发的,缺少对国产技术框架的支持。FastHotSwapper正是为了弥补这一空缺,为广大研发同学提供一款功能强大、简单易用、支持国产框架、免费的热部署产品。
FastHotSwapper是一款IDEA热部署插件。其核心(Agent部分)是基于HotSwapAgent做了二次开发,对spring、mybatis、tomcat、cglib等主流技术框架进行了深度的优化,同时对一些主流的国产框架进行了热部署支持,例如apollo、mybatis-plus、tk-mybatis、Fastjson等。并以IDEA作为用户的操作入口,提升热部署整体的易用性。
详情可以参考: plugins.jetbrains.com/plugin/2064…
热部署启动
热部署操作
热部署完成