spring boot 實(shí)現(xiàn)熱部署的幾種方式及配置方法
一、開(kāi)發(fā)工具內(nèi)置熱部署(推薦)
1. Spring DevTools 原理:
基于兩個(gè)類(lèi)加載器實(shí)現(xiàn):基礎(chǔ)類(lèi)加載器(加載不會(huì)變化的類(lèi),如第三方依賴)和重啟類(lèi)加載器(加載應(yīng)用代碼)。當(dāng)文件修改時(shí),重啟類(lèi)加載器會(huì)被重新加載,實(shí)現(xiàn)快速重啟。
配置步驟:
<!-- Maven -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>觸發(fā)方式:
修改文件后,IDE保存時(shí)自動(dòng)觸發(fā)重啟(默認(rèn)監(jiān)控src/main/resources和src/main/java)。
注意事項(xiàng):
- 生產(chǎn)環(huán)境需禁用(通過(guò)
spring.devtools.restart.enabled=false)。 - 靜態(tài)資源修改無(wú)需重啟,自動(dòng)生效。
2. IDE熱部署(如IntelliJ IDEA)
配置步驟:
- 啟用自動(dòng)編譯:
File > Settings > Build, Execution, Deployment > Compiler > Build project automatically。 - 允許運(yùn)行時(shí)重新加載類(lèi):按
Ctrl + Shift + Alt + /,選擇Registry,勾選compiler.automake.allow.when.app.running。
觸發(fā)方式:
修改代碼后按Ctrl + F9(重新編譯)或Ctrl + Shift + F9(重新編譯特定類(lèi))。
二、JRebel插件(商業(yè)/付費(fèi))
原理:
- 通過(guò)字節(jié)碼增強(qiáng)技術(shù),在不重啟JVM的情況下動(dòng)態(tài)更新類(lèi)定義,支持實(shí)時(shí)更新代碼、配置和資源。
優(yōu)點(diǎn):
- 無(wú)需重啟,響應(yīng)速度極快(毫秒級(jí))。
- 支持?jǐn)帱c(diǎn)調(diào)試和復(fù)雜代碼變更(如新增方法、字段)。
配置步驟:
- 安裝JRebel插件(IDE插件市場(chǎng)搜索安裝)。
- 激活并配置項(xiàng)目(
Run > Edit Configurations > Add JRebel agent)。
三、Docker容器熱部署
原理:
使用Docker的卷掛載(Volume Mount)將本地代碼映射到容器內(nèi),結(jié)合Spring DevTools實(shí)現(xiàn)容器內(nèi)代碼更新。
配置步驟:
# docker-compose.yml
version: '3'
services:
app:
build: .
ports:
- "8080:8080"
volumes:
- ./src:/app/src # 掛載源代碼
environment:
- SPRING_DEVTOOLS_RESTART_ENABLED=true觸發(fā)方式:
修改本地代碼后,容器內(nèi)文件同步更新,觸發(fā)Spring DevTools重啟。
四、自定義類(lèi)加載器(高級(jí)方案)
原理:
自定義類(lèi)加載器實(shí)現(xiàn)對(duì)特定類(lèi)的動(dòng)態(tài)加載,適用于對(duì)性能要求極高的場(chǎng)景。
實(shí)現(xiàn)示例:
public class CustomClassLoader extends URLClassLoader {
public CustomClassLoader(URL[] urls, ClassLoader parent) {
super(urls, parent);
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
// 自定義類(lèi)加載邏輯
if (name.startsWith("com.example")) {
return findClass(name);
}
return super.loadClass(name);
}
}注意事項(xiàng):
實(shí)現(xiàn)復(fù)雜,需處理類(lèi)加載沖突和內(nèi)存泄漏問(wèn)題。
五、遠(yuǎn)程調(diào)試(生產(chǎn)環(huán)境熱修復(fù))
原理:
通過(guò)JVM遠(yuǎn)程調(diào)試功能(-agentlib:jdwp),結(jié)合IDE的遠(yuǎn)程調(diào)試模式,動(dòng)態(tài)修改運(yùn)行中的代碼。
配置步驟:
啟動(dòng)應(yīng)用時(shí)添加JVM參數(shù):
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar app.jar
在IDE中配置遠(yuǎn)程調(diào)試(Run > Edit Configurations > Remote)。
適用場(chǎng)景:
生產(chǎn)環(huán)境緊急修復(fù)小問(wèn)題,但需謹(jǐn)慎操作,避免影響服務(wù)穩(wěn)定性。
對(duì)比與選擇建議
| 方式 | 適用場(chǎng)景 | 重啟速度 | 實(shí)現(xiàn)難度 | 支持?jǐn)帱c(diǎn) | 生產(chǎn)環(huán)境可用 |
|---|---|---|---|---|---|
| Spring DevTools | 開(kāi)發(fā)環(huán)境 | 秒級(jí) | 低 | 是 | 否 |
| IDE熱部署 | 快速迭代開(kāi)發(fā) | 秒級(jí) | 低 | 是 | 否 |
| JRebel | 大型項(xiàng)目高效開(kāi)發(fā) | 毫秒級(jí) | 中 | 是 | 否 |
| Docker容器熱部署 | 容器化開(kāi)發(fā)測(cè)試 | 秒級(jí) | 中 | 是 | 否 |
| 自定義類(lèi)加載器 | 高性能框架開(kāi)發(fā) | 毫秒級(jí) | 高 | 否 | 否 |
| 遠(yuǎn)程調(diào)試 | 生產(chǎn)環(huán)境緊急修復(fù) | 無(wú)重啟 | 高 | 是 | 謹(jǐn)慎使用 |
推薦組合方案
- 開(kāi)發(fā)階段:Spring DevTools + IDE自動(dòng)編譯。
- 復(fù)雜項(xiàng)目:JRebel + 單元測(cè)試。
- 生產(chǎn)環(huán)境:使用Docker多實(shí)例部署,通過(guò)CI/CD快速發(fā)布新版本。
到此這篇關(guān)于spring boot 實(shí)現(xiàn)熱部署的幾種方式的文章就介紹到這了,更多相關(guān)spring boot 熱部署內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot網(wǎng)站應(yīng)用使用第三方qq登錄的實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了springboot網(wǎng)站應(yīng)用使用第三方qq登錄,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
詳解在idea 中使用Mybatis Generator逆向工程生成代碼
這篇文章主要介紹了在idea 中使用Mybatis Generator逆向工程生成代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
探索jedis連接池預(yù)熱優(yōu)化高并發(fā)
這篇文章主要為大家介紹了jedis連接池預(yù)熱優(yōu)化高并發(fā)深入探索示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
解決JD-GUI for mac big sur打不開(kāi)問(wèn)題
這篇文章主要介紹了解決JD-GUI for mac big sur打不開(kāi)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
springboot定時(shí)任務(wù)SchedulingConfigurer異步多線程實(shí)現(xiàn)方式
這篇文章主要介紹了springboot定時(shí)任務(wù)SchedulingConfigurer異步多線程實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
Hibernate三種狀態(tài)和Session常用的方法
本文主要介紹了Hibernate三種狀態(tài)和Session常用的方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-03-03
詳解Alibaba?Java診斷工具Arthas查看Dubbo動(dòng)態(tài)代理類(lèi)
這篇文章主要介紹了Alibaba?Java診斷工具Arthas查看Dubbo動(dòng)態(tài)代理類(lèi)?,它可以幫助我們查看JDK或者javassist生成的動(dòng)態(tài)代理類(lèi),當(dāng)然,它的功能遠(yuǎn)不止此,還可以在生產(chǎn)環(huán)境進(jìn)行診斷,需要的朋友可以參考下2022-04-04

