平時使用
SpringBoot
開發(fā)應(yīng)用時灰嫉,修改代碼后需要重新啟動才能生效。如果你的應(yīng)用足夠大的話嗓奢,啟動可能需要好幾分鐘讼撒。有沒有什么辦法可以加速啟動過程,讓我們開發(fā)應(yīng)用代碼更高效呢股耽?今天給大家推薦一款SpringBoot官方的熱部署工具spring-boot-devtools
根盒,修改完代碼后可快速自動重啟應(yīng)用!
spring-boot-devtools簡介
SpringBoot
官方開發(fā)工具物蝙,如果你的應(yīng)用集成了它炎滞,即可實現(xiàn)熱部署和遠(yuǎn)程調(diào)試。
實現(xiàn)原理
使用該工具應(yīng)用為什么啟動更快了诬乞?主要是因為它使用了兩種不同的類加載器厂榛。基礎(chǔ)類加載器用于加載不會改變的類(比如第三方庫中的類)丽惭,重啟類加載器用于加載你應(yīng)用程序中的類。當(dāng)應(yīng)用程序啟動時辈双,重啟類加載器中的類將會被替換掉责掏,這就意味著重啟將比冷啟動更快!
熱部署
接下來我們將集成
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
訪問接口叫潦,返回結(jié)果如下,訪問地址:http://localhost:8088/swagger-ui.html
{
"code": 200,
"message": "返回消息",
"data": null
}
- 由于在項目構(gòu)建時官硝,
devtools
才會自動重啟項目矗蕊,而IDEA
默認(rèn)并沒有使用自動構(gòu)建短蜕,此時我們可以修改應(yīng)用啟動配置,設(shè)置當(dāng)IDEA
失去焦點(diǎn)時自動構(gòu)建項目傻咖;
image.png - 修改
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);
}
}
- 失去焦點(diǎn)后卿操,等待項目自動構(gòu)建警检,此時訪問接口出現(xiàn)404問題;
{
"timestamp": "2021-03-29T07:09:05.415+00:00",
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/test/first"
}
- 由于
devtools
檢測時間和IDEA
的編譯所需時間存在差異害淤,當(dāng)IDEA
還沒編譯完成扇雕,devtools
就已經(jīng)重啟應(yīng)用了,導(dǎo)致了這個問題筝家,修改application.yml
配置文件洼裤,添加如下配置即可;
spring:
devtools:
restart:
poll-interval: 2s
quiet-period: 1s
- 此時再次訪問測試接口溪王,顯示內(nèi)容如下腮鞍,修改后的代碼已經(jīng)被自動應(yīng)用了。
{
"code": 200,
"message": "返回消息(已修改)",
"data": null
}
遠(yuǎn)程調(diào)試
devtools
除了支持熱部署之外莹菱,還支持遠(yuǎn)程調(diào)試移国,接下來我們把應(yīng)用部署到Docker
容器中,然后試試遠(yuǎn)程調(diào)試道伟!
- 由于
SpringBoot
默認(rèn)打包不會包含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
的遠(yuǎn)程訪問密碼祝懂;
spring:
devtools:
remote:
secret: macro666
- 接下來把項目打包成
Docker
鏡像,然后使用如下命令運(yùn)行起來拘鞋;
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
,配置信息具體如下盆色;
image.png - 啟動該配置灰蛙,控制臺輸出如下結(jié)果表示遠(yuǎn)程連接成功;
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 = "返回消息(遠(yuǎn)程調(diào)試)";
return CommonResult.success(null,message);
}
}
- 遠(yuǎn)程調(diào)試如果自動構(gòu)建的話會導(dǎo)致遠(yuǎn)程服務(wù)頻繁重啟,此時我們可以使用
IDEA
手動構(gòu)建宣旱,在項目的右鍵菜單中可以找到構(gòu)建按鈕仅父;
image.png - 構(gòu)建成功后可以發(fā)現(xiàn)遠(yuǎn)程服務(wù)會自動重啟,并應(yīng)用修改后的代碼,訪問測試接口返回如下信息驾霜;
{
"code": 200,
"message": "返回消息(遠(yuǎn)程調(diào)試)",
"data": null
}
總結(jié)
雖說使用SpringBoot
官方的devtools
可以進(jìn)行熱部署案训,但是這種方式更像是熱重啟,如果你想要更快的熱部署體驗的話可以使用JRebel
粪糙。