热部署SpringBoot热部署
SpringBoot热部署学习网址:https://www.imooc.com/video/16054
在开发过程中,我们往往会用到各种框架来提高我们的开发的效率,而SpringBoot则是现今很火的一个微服务架构。其设计的目的是用来简化,Spring应用的初始搭建以及开发过程,该框架使用了特定的方式进行配置,从而使开发人员不再需要定义样板化配置。当我们学习了SpringBoot,就不得不提SpringBoot中的热部署功能。
什么是热部署呢?就是指在你修改项目BUG的时候或对java类进行修改在不重启服务器的前提下能让修改生效。多使用在本地调试或者线上发布,当我们的项目配置了热部署功能,那么我们的系统就能全年不间断运行,即使重新发布程序也不需要重启服务器。同时,热部署能提高开发人员的开发、调试效率与发布、运维效率的提升,降低运维成本。
在学习SpringBoot热部署之前我们先了解一下java热部署与热加载:
热部署是在服务器运行时重新部署项目,将打包好的项目直接替换以前的项目,不用关闭或者重启服务器。
热加载是在运行时重新加载class,修改java代码以后不需要停掉java服务,将修改并编译后的java字节码提交到服务器,程序自动加载字节码文件。
热部署原理解析:
Java类的加载过程:
初始化JVM--->产生启动类加载(ClassLoader)---->标准扩展类加载器---->系统类加载器---->加载class文件
JVM加载类一般分为五个阶段:
- 加载:找到类的静态存储结构,加载类到虚拟机然后转化成方法区运行时的数据结构,生成class对象
- 验证:确保字节码是安全的,不会对虚拟机造成危害,可以通过启动参数来禁用一些验证
- 准备:确定内存布局,初始化类变量比如int a = 0;
- 解析:将符号引用转换为直接引用
- 初始化:调用程序自定义的初始化代码
通过配置Tomcat实现java类热部署:
- 直接把项目web文件放入Tomcat的webapps里面
- 在Tomcat\conf\server.xml中的<host></host>内部增加<Context/>标签
<Context debug="0" docBase="D:/Imooc/web" path="/hot(端口号后面的路径)" privileged="true" reloadable="true"/>
- 在%tomcat_home%\conf\Catalina\localhost中添加一个xml文件
hot.xml内容:<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="D:/Imooc/web" reloadable="true">
了解了上面的热部署,那么我们再来学习SpringBoot热部署就简单多了。使用SpringBoot进行热部署有两种方式:
- 使用Springlaoded(依赖配置在build中的spring-boot-maven-plugin插件中),必须要使用mvn spring-boot:run来允许才有效果
- 直接在pom.xml中导入devtools依赖就可以(推荐使用)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
由于热部署是监听Class文件的变化,它自身不会主动去编译java文件,所以我们得在java文件改动时,设置自动编译成Class文件;而且在热部署的时候是产生了新的类加载器,我们的一个类可能在虚拟机中存在两个类,就比如代码中一个User类,但是虚拟机中会存在两个User类,虽然是同一个Class文件,但是却是两个独立的类。
当我们使用SpringBoot热部署之后就可以随意修改代码而不用重启服务器,它会自动去加载改变后的Class文件,就少了要不停重启服务器的麻烦,提高我们工作、开发、维护的效率。