本文转载自微信公众号《小姐姐的味道》,作者小姐姐养的狗。转载本文请联系味觉小姐公众号。一位高级开发工程师,第一次使用SpringBoot,决定打印一个经典的HelloWorld。因为太激动,他打错了一个字母,变成了HalloWorld。你好?太庸俗了,太庸俗了,太不分等级了。就好像嘴里含着槟榔,吐不出来。它肯定需要纠正。结果改成hello后,高工发现需要重启应用才能生效。等了十几秒,系统才缓缓启动。对于一些东西,时间长是好事,但是对于这种代码调试的场景,就让人难以忍受了。高工把嘴里的槟榔吐了出来,心想,是时候开发一个加速调试的工具了。这就是SBDT的用武之地。spring-boot-devtoolsSpringBoot、StringBuilder、StringBuffer,Java界俗称的三大SB。特别是SpringBoot非常好用,主要是它的autoconfig,依赖约定来规范开发。但问题是SpringBoot加载的Jar包太多太大,每次启动时间都比较长。对于SpringBoot服务来说,spring-boot-devtools就像一场及时雨,滋润着盯着重启画面发呆的同学们。虽然这个东西出来很久了,但是我发现在实际项目中,用的人还是比较少的。但它使用起来非常简单。只需要在项目的pom文件中添加如下jar包,即可获得秒级服务重载(热部署)。org.springframework.bootspring-boot-devtoolsruntime<可选>true由于starter文件中的默认值为true,所以后面yml中的配置不是必须的。spring:devtools:restart:enabled:true我们来验证一下。快来。创建一个新的简单控制器并输出halloworld。@ControllerpublicclassDemoController{@GetMapping("/test")@ResponseBodypublicStringtest(){return"hallowworld";}}修改代码,把hallow改成hello。输出日志将开始在控制台中滚动,并加载项目代码。这时候访问浏览器,发现我们的修改已经生效了。#日志显示StartedMbyeApplicationin1.731seconds(JVMrunningfor51.115)控制台也输出了重启时间,用时不到2秒,可以说是非常快了。为了在修改代码后实时触发编译,需要在IDEA中进行如下配置。如果这个配置没有生效,需要手动点击Build(注意不是rebuild)。为什么热部署可以reload这么快?因为它的重启并没有完全重启整个应用,只是重启了我们的应用代码。通过配置META-INF/spring-devtools.properties文件,可以指定每次重启时加载第三方jar包。但是,这种情况相对较少。当然还有include和oldexclude,例子如下。restart.exclude.somejar=/somejar-[\\w-]+\.jarrestart.include.ajar=/ajar-[\\w-]+\.jar注意到一个有趣的事情。当我们使用IDEA启动时,控制台的输出是这样的。2020-09-1821:33:59.495INFO4635---[restartedMain]c.g.javarunfast.mbye.MbyeApplication:StartingMbyeApplicationonLYCYs-MacBook-Pro.localwithPID4635(/target/classesstartedbyxjjdogin/Users/xjjdog/codes/javarunfast/mbye)2020-09-1821:33:59.495INFO4635---[restartedMain]c.g.javarunfast.mbye.MbyeApplication:Noactiveprofileset,fallingbacktodefaultprofiles:default2020-09-1821:34:00.355INFO4635---[restartedMain].s.d.r.c.RepositoryConfigurationDorygate20configuration20configuration20modules9-1821:34:00.355INFO4635---[restartedMain].s.d.r.c.RepositoryConfigurationDelegate:BootstrappingSpringDataElasticsearchrepositoriesinDEFAULTmode.2020-09-1821:34:00.357INFO4635---[restartedMain].s.d.r.c.RepositoryConfigurationDelegate:FinishedSpringDatarepositoryscanningin1ms.Found0Elasticsearchrepositoryinterfaces.2020-09-1821:34:00.362INFO4635---[restartedMain].s.d.r.c.RepositoryConfigurationDelegate:MultipleSpringDatamodulesfound,enteringstrictrepositoryconfigurationmode!2020-09-1821:34:00.362INFO4635---[restartedMain].s.d.r.c.RepositoryConfigurationDelegate:BootstrappingSpringDataReactiveElasticsearchrepositoriesinDEFAULT模式。里面的启动线程是MastartedMain但是我们用java-jar*jar启动主进程的时候不是重启而是main。这是因为线上环境开启devtools是没有意义的。我暂时说这个,因为它会打我的脸。更多功能要了解devtools有哪些功能,我们先来看看它的源码目录结构。filewatch和classpath就不用多说了,可以通过监控文件变化来实现热启动。原理上是使用一个独立的ClassLoader(具体为RestartClassLoader)来完成加载后的替换。研究这部分代码可以让您更好地理解Java类加载器。LiveReload接下来是livereload函数。做前端开发的时候经常用到LiveReload。devtools也会在后台开启一个LiveReloadServer,浏览器会和这个server保持长连接。当后端前端资源有变化时,会通知浏览器刷新,实现热部署。以下是Chrome的RemoteLiveReload插件URL。安装有这个很酷的功能。https://chrome.google.com/webstore/detail/remotelivereload/jlppknnillhjgiengoigajegdpieppei?hl=en-GB远程部署更有趣。上面我们说了,线上环境开启devtools是没有意义的。现在让我们面对现实吧。可能你自己的机器性能比较低,让代码跑在远端,只专注于本地的代码开发。这时候就可以使用远程热部署。要启用此功能,需要完成很多步骤。步骤1。需要对pom.xml中的spring-boot-maven-plugin做如下改动。org.springframework.bootspring-boot-maven-pluginfalse第二步.在yml中设置用于连接服务器和调试器的密钥。spring:devtools:remote:secret:test步骤3.将SB服务打包成jar并启动它。mvn-Dmaven.test.skip=true-Pdevpackagejava-jar-Xdebug\-Xrunjdwp:server=y,transport=dt_socket,suspend=n\mbye-0.0.1-SNAPSHOT.jar可以看到我们在启动的时候加了很多参数,远程调戏就是这个意思。第四步。在本地IDEA中编辑一个Java文件,在启动变量中插入我们的服务器地址(与应用程序地址相同)。importorg.springframework.boot.devtools.RemoteSpringApplication;/***@date2020/09/19*/publicclassRemote{publicstaticvoidmain(String[]args){RemoteSpringApplication.main(newString[]{"http://localhost:8080"});}}第五步。验证。随便编辑一个可以看到效果的文件,然后点击build。下面是IDEA开发终端的截图。下面是服务器的截图。可以看到服务已经重新加载了,但是速度很快。Listeningforremoterrestartupdateson/.~~spring-boot!~/restartStartedMbyeApplicationin1.961seconds(JVMrunningfor249.452)访问网页,发现代码已经上传成功。其实spring-boot-devtools并不是最强大的。因为每次都会使用ClassLoader重新加载项目的class文件。如果你有很多项目文件,它会更慢。还有一个更强大的工具叫jrebel,真的是开发的利器。更好的是,它可以在任何Java项目中使用,而不仅限于SpringBoot项目。不过,它有点重,而且需要充电。下次再介绍,要不你已经提前体验过了。作者简介:品味小姐姐(xjjdog),一个不允许程序员走弯路的公众号。专注于基础架构和Linux。十年架构,每天百亿流量,与你探讨高并发世界,给你不一样的滋味。我的个人微信xjjdog0,欢迎加好友进一步交流。