关于java:加速-SpringBoot-应用开发官方热部署神器真带劲

33次阅读

共计 4052 个字符,预计需要花费 11 分钟才能阅读完成。

平时应用 SpringBoot 开发利用时,批改代码后须要重新启动能力失效。如果你的利用足够大的话,启动可能须要好几分钟。有没有什么方法能够减速启动过程,让咱们开发利用代码更高效呢?明天给大家举荐一款 SpringBoot 官网的热部署工具spring-boot-devtools,批改完代码后可疾速主动重启利用!

SpringBoot 实战电商我的项目 mall(40k+star)地址:https://github.com/macrozheng/mall

spring-boot-devtools简介

SpringBoot 官网开发工具,如果你的利用集成了它,即可实现热部署和近程调试。

实现原理

应用该工具利用为什么启动更快了?次要是因为它应用了两种不同的类加载器。根底类加载器用于加载不会扭转的类(比方第三方库中的类),重启类加载器用于加载你应用程序中的类。当应用程序启动时,重启类加载器中的类将会被替换掉,这就意味着重启将比冷启动更快!

热部署

接下来咱们将集成 devtools,来演示下热部署性能。

  • 首先须要在我的项目的 pom.xml 文件中,增加 devtools 的依赖;
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>
  • 为了不便测试,咱们在我的项目中增加了如下测试接口;
/**
 * Created by macro on 2021/3/25.
 */
@Api(tags = "TestController", description = "SpringBoot Dev Tools 测试")
@Controller
@RequestMapping("/test")
public class TestController {@ApiOperation("测试批改")
    @RequestMapping(value = "/first", method = RequestMethod.GET)
    @ResponseBody
    public CommonResult first() {
        String message = "返回音讯";
        return CommonResult.success(null,message);
    }
}
  • 而后启动我的项目,启动胜利后通过 Swagger 拜访接口,返回后果如下,拜访地址:http://localhost:8088/swagger…
{
  "code": 200,
  "message": "返回音讯",
  "data": null
}
  • 因为在我的项目构建时,devtools 才会主动重启我的项目,而 IDEA 默认并没有应用主动构建,此时咱们能够批改利用启动配置,设置当 IDEA 失去焦点时主动构建我的项目;

  • 批改 Controller 中的代码,只有批改下 message 变量即可;
/**
 * Created by macro on 2021/3/25.
 */
@Api(tags = "TestController", description = "SpringBoot Dev Tools 测试")
@Controller
@RequestMapping("/test")
public class TestController {@ApiOperation("测试批改")
    @RequestMapping(value = "/first", method = RequestMethod.GET)
    @ResponseBody
    public CommonResult first() {
        String message = "返回音讯(已批改)";
        return CommonResult.success(null,message);
    }
}
  • 失去焦点后,期待我的项目主动构建,此时拜访接口呈现 404 问题;
{
  "timestamp": "2021-03-29T07:09:05.415+00:00",
  "status": 404,
  "error": "Not Found",
  "message": "No message available",
  "path": "/test/first"
}
  • 因为 devtools 检测时间和 IDEA 的编译所需工夫存在差别,当 IDEA 还没编译实现,devtools 就曾经重启利用了,导致了这个问题,批改 application.yml 配置文件,增加如下配置即可;
spring:
  devtools:
    restart:
      poll-interval: 2s
      quiet-period: 1s
  • 此时再次拜访测试接口,显示内容如下,批改后的代码曾经被主动利用了。
{
  "code": 200,
  "message": "返回音讯(已批改)",
  "data": null
}

近程调试

devtools 除了反对热部署之外,还反对近程调试,接下来咱们把利用部署到 Docker 容器中,而后试试近程调试!

  • 因为 SpringBoot 默认打包不会蕴含 devtools,所以咱们须要先批改下pom.xml
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <!-- 打包时不排除 Devtools-->
        <excludeDevtools>false</excludeDevtools>
    </configuration>
</plugin>
  • 接下来须要 application.yml 文件,增加 devtools 的近程拜访明码;
spring:
  devtools:
    remote:
      secret: macro666
  • 接下来把我的项目打包成 Docker 镜像,而后应用如下命令运行起来;
docker run -p 8088:8088 --name mall-tiny-devtools \
--link mysql:db \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/mall-tiny/logs:/var/logs \
-d mall-tiny/mall-tiny-devtools:1.0-SNAPSHOT
  • 增加一个启动配置,批改启动类为org.springframework.boot.devtools.RemoteSpringApplication,配置信息具体如下;

  • 启动该配置,控制台输入如下后果示意近程连贯胜利;
2021-03-29 15:49:50.991  INFO 7848 --- [main] o.s.b.devtools.RemoteSpringApplication   : Starting RemoteSpringApplication v2.3.0.RELEASE on DESKTOP-5NIMJ19 with PID 7848
2021-03-29 15:49:51.003  INFO 7848 --- [main] o.s.b.devtools.RemoteSpringApplication   : No active profile set, falling back to default profiles: default
2021-03-29 15:49:51.664  WARN 7848 --- [main] o.s.b.d.r.c.RemoteClientConfiguration    : The connection to http://192.168.5.78:8088 is insecure. You should use a URL starting with 'https://'.
2021-03-29 15:49:52.024  INFO 7848 --- [main] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2021-03-29 15:49:52.055  INFO 7848 --- [main] o.s.b.devtools.RemoteSpringApplication   : Started RemoteSpringApplication in 2.52 seconds (JVM running for 4.236)
  • 接下来咱们再次批改下 Controller 中的测试代码,只有批改下 message 变量即可;
/**
 * Created by macro on 2021/3/25.
 */
@Api(tags = "TestController", description = "SpringBoot Dev Tools 测试")
@Controller
@RequestMapping("/test")
public class TestController {@ApiOperation("测试批改")
    @RequestMapping(value = "/first", method = RequestMethod.GET)
    @ResponseBody
    public CommonResult first() {
        String message = "返回音讯(近程调试)";
        return CommonResult.success(null,message);
    }
}
  • 近程调试如果主动构建的话会导致近程服务频繁重启,此时咱们能够应用 IDEA 手动构建,在我的项目的右键菜单中能够找到构建按钮;

  • 构建胜利后能够发现近程服务会主动重启,并利用批改后的代码,拜访测试接口返回如下信息;
{
  "code": 200,
  "message": "返回音讯(近程调试)",
  "data": null
}

总结

虽说应用 SpringBoot 官网的 devtools 能够进行热部署,然而这种形式更像是热重启,如果你想要更快的热部署体验的话能够应用 JRebel。

我的项目源码地址

https://github.com/macrozheng…

本文 GitHub https://github.com/macrozheng/mall-learning 曾经收录,欢送大家 Star!

正文完
 0