目录
一、什么是热部署
二、热部署的功能是如何实现的呢?
三、热部署实现原理(两种方式)
1. 非SpringBoot项目热部署实现原理
2. SpringBoot项目热部署实现原理
四、热部署的使用(SpringBoot)
1. 手动启动热部署
1.1. 实现步骤
1.2. 重启与重载
1.3. 总结
1.4. 思考
2. 自动启动热部署
2.1. 实现步骤
2.2. 注意事项
2.3. 总结
2.4. 思考
五、参与热部署监控的文件范围配置
1. 简介
2. 总结
3. 思考
六、关闭热部署
1. 如何关闭热部署?
2. 总结
七、代码位置
简单说就是你程序改了,现在要重新启动服务器,嫌麻烦?
不用重启,服务器会自己悄悄的把更新后的程序给重新加载一遍,这就是热部署。
这就要分两种情况来说了,非springboot工程和springboot工程的热部署实现方式完全不一样。
开发非springboot项目时,我们要制作一个web工程并通过tomcat启动,通常需要先安装tomcat服务器到磁盘
中,开发的程序配置发布到安装的tomcat服务器上。
如果想实现热部署的效果,这种情况其实有两种做法:
- 一种是在tomcat服务器的配置文件中进行配置,这种做法与你使用什么IDE工具无关,不管你使用eclipse还是idea都行。
- 还有一种做法是通过IDE工具进行配置,比如在idea工具中进行设置,这种形式需要依赖IDE工具,每款IDE工具不同,对应的配置也不太一样。但是核心思想是一样的,就是使用服务器去监控其中加载的应用,发现产生了变化就重新加载一次。
上面所说的非springboot项目实现热部署看上去是一个非常简单的过程,几乎自己都能写出来。
如果你不会写,我给你个最简单的思路,但是实际设计要比这复杂一些。
例如启动一个定时任务,任务启动时记录每个文件的大小,以后每5秒比对一下每个文件的大小是否有改变,或者
是否有新文件。
如果没有改变,放行,如果有改变,刷新当前记录的文件信息,然后重新启动服务器,这就可以实现热部署了。
当然,这个过程肯定不能这么做,比如我把一个打印输出的字符串"abc"改成"cba",比对大小是没有变化的,但
是内容确实变了,所以这么做肯定不行,只是给大家打个比方,而且重启服务器这就是冷启动了,不能算热部
署,领会精神吧。
看上去这个过程也没多复杂,在springboot项目中难道还有其他的弯弯绕吗?还真有。
基于springboot开发的web工程其实有一个显著的特征,就是tomcat服务器内置了,还记得内嵌服务器吗?
服务器是以一个对象的形式在spring容器中运行的。
本来我们期望于tomcat服务器加载程序后由tomcat服务器盯着程序,你变化后我就重新启动重新加载,但是现在
tomcat和我们的程序是平级的了,都是spring容器中的组件,这下就麻烦了,缺乏了一个直接的管理权,那该怎
么做呢?
简单,再搞一个程序X在spring容器中盯着你原始开发的程序A不就行了吗?
确实,搞一个盯着程序A的程序X就行了,如果你自己开发的程序A变化了,那么程序X就命令tomcat容器重新加
载程序A就OK了。
并且这样做有一个好处,spring容器中东西不用全部重新加载一遍,只需要重新加载你开发的程序那一部分就可
以了,这下效率又高了,挺好。
下面就说说,怎么搞出来这么一个程序X,肯定不是我们自己手写了,springboot早就做好了,搞一个坐标导入进
去就行了。
1.1. 实现步骤
步骤一:导入开发者工具对应的坐标
步骤二:构建项目,可以使用快捷键激活此功能
对应的快捷键一定要记得
以上过程就实现了springboot工程的热部署,是不是挺简单的。
不过这里需要把底层的工作工程给普及一下。
1.2. 重启与重载
一个springboot项目在运行时实际上是分两个过程进行的,根据加载的东西不同,划分成base类加载器与restart
类加载器。
- base类加载器:用来加载jar包中的类,jar包中的类和配置文件由于不会发生变化,因此不管加载多少次,加载的内容不会发生变化
- restart类加载器:用来加载开发者自己开发的类、配置文件、页面等信息,这一类文件受开发者影响
当springboot项目启动时,base类加载器执行,加载jar包中的信息后,restart类加载器执行,加载开发者制作的
内容。
当执行构建项目后,由于jar中的信息不会变化,因此base类加载器无需再次执行,所以仅仅运行restart类加载即
可,也就是将开发者自己制作的内容重新加载就行了,这就完成了一次热部署的过程,也可以说热部署的过程实
际上是重新加载restart类加载器中的信息。
1.3. 总结
- 使用开发者工具可以为当前项目开启热部署功能
- 使用构建项目操作对工程进行热部署
1.4. 思考
上述过程每次进行热部署都需要开发者手工操作,不管是点击按钮还是快捷键都需要开发者手工执行。
这种操作的应用场景主要是在开发调试期,并且调试的代码处于不同的文件中,比如服务器启动了,我需要改4个
文件中的内容,然后重启,等4个文件都改完了再执行热部署,使用一个快捷键就OK了。但是如果现在开发者要
修改的内容就只有一个文件中的少量代码,这个时候代码修改完毕如果能够让程序自己执行热部署功能,就可以
减少开发者的操作,也就是自动进行热部署,能这么做吗?是可以的。
2.1. 实现步骤
自动热部署其实就是设计一个开关,打开这个开关后,IDE工具就可以自动热部署。
因此这个操作和IDE工具有关,以下以idea为例设置idea中启动热部署
步骤一:设置自动构建项目
打开【File】,选择【settings...】,在面板左侧的菜单中找到【Compile】选项,
然后勾选【Build project automatically】,意思是自动构建项目
步骤二:自动构建项目选项勾选后,允许在程序运行时进行自动构建
使用快捷键【Ctrl】+【Alt】+【Shit】+【/】打开维护面板,选择第1项【Registry...】
在选项中搜索comple,然后勾选对应项即可
这样程序在运行的时候就可以进行自动构建了,实现了热部署的效果。
2.2. 注意事项
如果你每敲一个字母,服务器就重新构建一次,这未免有点太频繁了,
所以idea设置当idea工具失去焦点5秒后进行热部署。
其实就是你从idea工具中切换到其他工具时进行热部署,比如改完程序需要到浏览器上去调试,
这个时候idea就自动进行热部署操作。
2.3. 总结
- 自动热部署要开启自动构建项目
- 自动热部署要开启在程序运行时自动构建项目
2.4. 思考
现在已经实现了热部署了,但是到企业开发的时候你会发现,为了便于管理,在你的程序目录中除了有代码,还
有可能有文档,如果你修改了一下文档,这个时候会进行热部署吗?
不管是否进行热部署,这个过程我们需要自己控制才比较合理,那这个东西能控制吗?
通过修改项目中的文件,你可以发现其实并不是所有的文件修改都会激活热部署的,
原因在于在开发者工具中有一组配置,当满足了配置中的条件后,才会启动热部署,配置中默认不参与热部署的
目录信息如下
- /META-INF/maven
- /META-INF/resources
- /resources
- /static
- /public
- /templates
以上目录中的文件如果发生变化,是不参与热部署的。
如果想修改配置,可以通过application.yml文件进行设定哪些文件不参与热部署操作
- 通过配置可以修改不参与热部署的文件或目录
热部署功能是一个典型的开发阶段使用的功能,到了线上环境运行程序时,这个功能就没有意义了。
能否关闭热部署功能呢?
线上环境运行时是不可能使用热部署功能的,所以需要强制关闭此功能,通过配置可以关闭此功能。
如果当心配置文件层级过多导致相符覆盖最终引起配置失效,可以提高配置的层级,在更高层级中配置关闭热部
署。例如在启动容器前通过系统属性设置关闭热部署功能。
其实上述担心略微有点多余,因为线上环境的维护是不可能出现修改代码的操作的,这么做唯一的作用是降低资
源消耗,毕竟那双盯着你项目是不是产生变化的眼睛只要闭上了,就不具有热部署功能了,这个开关的作用就是
禁用对应功能。
- 通过配置可以关闭热部署功能降低线上程序的资源消耗
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/56836.html