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原理

  1. devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),注意:因为其采用的虚拟机机制,该项重启是很快的。
  2. devtools可以实现页面热部署(即页面修改后会立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现(这里注意不同的模板配置不一样)

操作

  1. 引入pom依赖。如上devTools依赖
  2. 修改idea

勾上Build project automatically

  1. 开启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

本地增加服务链接远程

注意:

  1. main方法要是 org.springframework.boot.devtools.RemoteSpringApplication
  2. 远程地址填在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中,且不能向上传递,不可配置在基础依赖模块中。
posted @ 2020-10-25 11:22  刘翊扬  阅读(345)  评论(0编辑  收藏  举报