springBoot的热部署功能
什么是热部署
所谓的热部署:比如项目的热部署,就是在应用程序在不停止的情况下,实现新的部署
热部署原理
spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去。
原理是在发现代码有更改之后,重新启动应用,但是速度比手动停止后再启动还要更快,更快指的不是节省出来的手工操作的时间。
其深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为 restart ClassLoader
,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间(5秒以内)
Devtools依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
Devtools原理
- devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),注意:因为其采用的虚拟机机制,该项重启是很快的。
- devtools可以实现页面热部署(即页面修改后会立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现(这里注意不同的模板配置不一样)
操作
- 引入pom依赖。如上devTools依赖
- 修改idea
勾上Build project automatically
- 开启compiler.automake.allow.when.app.running
idea版本是2021.2之前的版本
快捷键:ctrl+alt+shift+/
选择:Registry
勾选:compiler.automake.allow.when.app.running
idea版本是2021.2之后的版本迁移到高级设置中
devTools的配置
spring:
devtools:
restart:
# 开启热部署(更改文件后,自动重启)
enabled: true
## 设置哪些资源变动后不触发热部署,会覆盖默认的exclude内容(资源不会触发重启,但会触发实时重新加载)
# exclude: WEB-INF/**,static/**
## 监控额外的路径(优先于exclude)
# additional-paths: src/main/java
远程调式
修改打包配置
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--打包时不排除Devtools-->
<excludeDevtools>false</excludeDevtools>
</configuration>
</plugin>
</plugins>
</build>
配置文件中加上这个参数。这个值随便设置,但是需要保证远程和本地的值一样就行
spring.devtools.remote.secret=liufei666
然后我们启动远端的服务,此时访问接口,控制台打印的是
测试112333
本地增加服务链接远程
注意:
- main方法要是 org.springframework.boot.devtools.RemoteSpringApplication
- 远程地址填在program arguments里面。我这里是:http://192.168.245.132:8088/mall(因为这个服务我配置了context-path,所以要加上context-path,如果服务没有设置,就不要加)
然后启动
从日志中看,他建议我们使用https://。这里我们就先使用http的
然后我们修改方法,打印测试内容为:测试112444
观察控制台日志,说有1个class文件被更新了
然后我们去远程服务看日志,会发现服务重启了,再重新调用刚才那个接口,会发现打印的内容变成了
测试112444
这就是远程调式
注意
- 默认监听classpath路径下的文件更改
- devtools只适用于开发环境。线上环境不可开启,可通过设置maven依赖中的scope属性为runtime来实现,打包时不将devtools打包到jar包中。
- devtools需配置在需要进行热部署的模块的pom中,且不能向上传递,不可配置在基础依赖模块中。