体验Spring-Boot-Devtools热部署,流畅且不失强大

开发 前端
一个高级开发工程师,第一次用SpringBoot,决定打印一个经典的HelloWorld。由于他太激动了,结果打错了一个字母,变成了HalloWorld。

[[342929]]

本文转载自微信公众号「小姐姐味道」,作者小姐姐养的狗 。转载本文请联系小姐姐味道公众号。  

一个高级开发工程师,第一次用SpringBoot,决定打印一个经典的HelloWorld。

由于他太激动了,结果打错了一个字母,变成了HalloWorld。

哈喽?多么土多么俗多么没有档次,就像是嘴里含了个槟郎,吐不出气来,绝对需要进行改正。

结果,改成hello之后,高工发现需要重启应用才能生效。整整等了十多秒,系统才磨磨蹭蹭的启动起来。

有些东西,时间长了是好事,但对于这种代码调试场景来说,就让人无法忍受。

高工吐出嘴里的槟郎,心想,是时候开发一个加快调试速度的工具了。

这就是SBDT的由来。

spring-boot-devtools

SpringBoot,StringBuilder,StringBuffer,俗称Java界的3个SB。尤其是SpringBoot,非常的好用,主要归功于它的autoconfig,靠约定来规范开发。

但问题是,SpringBoot加载的Jar包太多、太大了,每次启动都要花费很长时间。对于SpringBoot服务来说,spring-boot-devtools就像一阵及时雨,滋润着瞪眼发呆盯着重启屏幕的同学。

虽然这个东西已经出来很长时间了,但我发现在现实项目中,大家用到的还是比较少。但它的使用非常简单。

只需要在项目的pom文件中,加入下面的jar包即可获取秒级的服务重载(热部署)。

  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-devtools</artifactId> 
  4.     <scope>runtime</scope> 
  5.     <optional>true</optional> 
  6. </dependency> 

 

由于starter文件中默认的值就是true,所以下面yml中的配置,并不是必须的。

  1. spring: 
  2.   devtools: 
  3.     restart: 
  4.       enabled: true 

我们来验证一下。来的很快。

新建一个简单的controller,输出halloworld。

  1. @Controller 
  2. public class DemoController { 
  3.     @GetMapping("/test"
  4.     @ResponseBody 
  5.     public String test(){ 
  6.         return "halloworld"
  7.     } 

修改代码,把hallo改成hello。控制台中将开始滚动输出日志,加载项目代码。此时访问浏览器,发现我们的改动生效了。

  1. # 日志显示 
  2. Started MbyeApplication in 1.731 seconds (JVM running for 51.115) 

控制台也输出了本次restart的时间,只花了不到2秒钟,可以说是飞快了。

为了在代码修改后,能够实时的触发编译,你需要在IDEA中做如下配置。如果这个配置不生效,就需要手动点击一下Build了(注意不是rebuild)。

为什么热部署的重新加载能够这么快呢?因为它的重新启动并不是完整的重启整个应用,而是只重启我们的应用代码。

通过配置META-INF/spring-devtools.properties文件,可以指定每次重新启动都加载第三方jar包。不过这种场景比较少。当然,有include,旧有exclude,示例如下。

  1. restart.exclude.somejar=/somejar-[\\w-]+\.jar 
  2. restart.include.ajar=/ajar-[\\w-]+\.jar 

注意到一件有意思的事情。当我们使用IDEA启动的时候,控制台的输出是这样的。

  1. 2020-09-18 21:33:59.495  INFO 4635 --- [  restartedMain] c.g.javarunfast.mbye.MbyeApplication     : Starting MbyeApplication on LYCYs-MacBook-Pro.local with PID 4635 (/target/classes started by xjjdog in /Users/xjjdog/codes/javarunfast/mbye) 
  2. 2020-09-18 21:33:59.495  INFO 4635 --- [  restartedMain] c.g.javarunfast.mbye.MbyeApplication     : No active profile set, falling back to default profiles: default 
  3. 2020-09-18 21:34:00.355  INFO 4635 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! 
  4. 2020-09-18 21:34:00.355  INFO 4635 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Elasticsearch repositories in DEFAULT mode. 
  5. 2020-09-18 21:34:00.357  INFO 4635 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 1ms. Found 0 Elasticsearch repository interfaces. 
  6. 2020-09-18 21:34:00.362  INFO 4635 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! 
  7. 2020-09-18 21:34:00.362  INFO 4635 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Reactive Elasticsearch repositories in DEFAULT mode. 

里面的启动线程是restartedMain。但当我们使用java -jar *jar来启动的时候,主进程并不是restartedMain,而是main。

这是因为,线上环境开启devtools,是没有意义的。

这句话暂时这么说,因为会打脸。

更多功能

要想了解devtools有什么功能,我们先来看一下它的源码目录结构。

filewatch和classpath就不必说了,通过监听文件的变化,即可实现热启动。它原理上是使用一个独立的ClassLoader(具体是指RestartClassLoader),来完成加载后的替换。

学习一下这部分的代码,可以对Java的类加载器有更好的理解。

LiveReload

接下来就是livereload功能。

LiveReload在做前端开发的时候,经常会用到。

devtools也会在后台开启一个LiveReload Server,浏览器会与这个Server保持着一个长连接,当后端有前端资源变动的时候,将会通知浏览器进行刷新,实现热部署。

下面是Chrome的Remote Live Reload插件地址。安装即可拥有这个酷炫的功能。

  1. https://chrome.google.com/webstore/detail/remotelivereload/jlppknnillhjgiengoigajegdpieppei?hl=en-GB 

远程部署

这个就有意思多了。我们上面说到,线上环境开启devtools,是没有意义的,现在来打脸。

你可能自己的机器性能比较低,让代码运行在远端,本地只管代码开发。这时候,就可以使用远程热部署。

要开启这个功能,需要做的步骤有点多。

步骤一。

需要在pom.xml中对spring-boot-maven-plugin做如下的更改。

  1. <plugin> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-maven-plugin</artifactId> 
  4.     <configuration> 
  5.         <excludeDevtools>false</excludeDevtools> 
  6.     </configuration> 
  7. </plugin> 

 

 

步骤二。

在yml中设置一个服务端与调试端连接的密钥。

  1. spring: 
  2.   devtools: 
  3.     remote: 
  4.       secret: test 

步骤三。

将SB服务打包成jar,然后启动。

  1. mvn -Dmaven.test.skip=true -Pdev package 
  2.  
  3. java -jar -Xdebug  \ 
  4. -Xrunjdwp:server=y,transport=dt_socket,suspend=n  \ 
  5. mbye-0.0.1-SNAPSHOT.jar 

可以看到我们在启动的时候加入了很多参数,这就是开启远程被调戏的意思。

步骤四。

在本地IDEA中编辑一个Java文件,并在启动变量里塞进我们的服务端地址(和应用地址一样)。

  1. import org.springframework.boot.devtools.RemoteSpringApplication; 
  2.  
  3. /** 
  4.  * @date 2020/09/19 
  5.  */ 
  6. public class Remote { 
  7.     public static void main(String[] args) { 
  8.         RemoteSpringApplication.main(new String[]{"http://localhost:8080"}); 
  9.     } 

步骤五。

进行验证。随便编辑一个能看到效果的文件,然后点击build。

下面是IDEA开发端的截图。

下面是服务端截图。可以看到服务已经重新载入了,不过速度特别快。

  1. Listening for remote restart updates on /.~~spring-boot!~/restart 
  2. Started MbyeApplication in 1.961 seconds (JVM running for 249.452) 

访问web页面,发现代码已经上传成功了。

其实,spring-boot-devtools,还不算是最强大的。因为它每次都会使用ClassLoader重新载入项目的class文件。如果你的项目文件特别多,那也是比较慢的。

有一个更牛的工具,叫做jrebel,那可真是开发的利器。更棒的是,它能用在任何Java项目上,而不仅仅限制于SpringBoot项目中。不过,它有点重,而且是收费的。下次我们介绍一下它,或者你已经提前去体验了 。

 

作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。

 

责任编辑:武晓燕 来源: 小姐姐味道
相关推荐

2024-08-09 08:52:26

2021-11-02 16:44:40

部署DevtoolsJRebel

2021-12-31 13:40:43

Spring Boot热部署Java

2024-11-27 09:58:41

Spring模块化管理方式

2022-03-07 09:00:00

HTTPS证书中间件

2021-05-21 10:24:52

AngularDevTools扩展

2020-12-15 10:46:29

事件监听器Spring Boot

2024-11-06 11:33:09

2024-11-01 10:40:32

2014-03-19 10:07:44

同洲飞看2机顶盒

2024-12-06 09:27:28

2023-09-11 08:31:12

自动配置热部署DevTools

2023-10-12 22:38:18

SpringBoot热部署

2012-03-06 10:47:18

Windows 8系统

2019-07-23 15:56:56

Spring Boot部署servlet

2019-07-23 17:52:59

Spring BootJava开发

2011-12-05 12:59:22

JavaJVM

2024-11-11 11:30:34

2020-10-23 11:10:51

Spring BootShellJava

2022-10-09 08:43:47

H5Webpack代码
点赞
收藏

51CTO技术栈公众号