加速 SpringBoot 應用開發(fā),官方熱部署神器真帶勁!

平時使用SpringBoot開發(fā)應用時,修改代碼后需要重新啟動才能生效。如果你的應用足夠大的話,啟動可能需要好幾分鐘。有沒有什么辦法可以加速啟動過程,讓我們開發(fā)應用代碼更高效呢?今天給大家推薦一款SpringBoot官方的熱部署工具spring-boot-devtools,修改完代碼后可快速自動重啟應用!

spring-boot-devtools簡介

SpringBoot官方開發(fā)工具,如果你的應用集成了它,即可實現(xiàn)熱部署和遠程調(diào)試。

實現(xiàn)原理

使用該工具應用為什么啟動更快了?主要是因為它使用了兩種不同的類加載器?;A(chǔ)類加載器用于加載不會改變的類(比如第三方庫中的類),重啟類加載器用于加載你應用程序中的類。當應用程序啟動時,重啟類加載器中的類將會被替換掉,這就意味著重啟將比冷啟動更快!

熱部署

接下來我們將集成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);
    }
}
{
  "code": 200,
  "message": "返回消息",
  "data": null
}
  • 由于在項目構(gòu)建時,devtools才會自動重啟項目,而IDEA默認并沒有使用自動構(gòu)建,此時我們可以修改應用啟動配置,設(shè)置當IDEA失去焦點時自動構(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);
    }
}
  • 失去焦點后,等待項目自動構(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的編譯所需時間存在差異,當IDEA還沒編譯完成,devtools就已經(jīng)重啟應用了,導致了這個問題,修改application.yml配置文件,添加如下配置即可;
spring:
  devtools:
    restart:
      poll-interval: 2s
      quiet-period: 1s
  • 此時再次訪問測試接口,顯示內(nèi)容如下,修改后的代碼已經(jīng)被自動應用了。
{
  "code": 200,
  "message": "返回消息(已修改)",
  "data": null
}

遠程調(diào)試

devtools除了支持熱部署之外,還支持遠程調(diào)試,接下來我們把應用部署到Docker容器中,然后試試遠程調(diào)試!

  • 由于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,配置信息具體如下;
    image.png
  • 啟動該配置,控制臺輸出如下結(jié)果表示遠程連接成功;
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 = "返回消息(遠程調(diào)試)";
        return CommonResult.success(null,message);
    }
}
  • 遠程調(diào)試如果自動構(gòu)建的話會導致遠程服務頻繁重啟,此時我們可以使用IDEA手動構(gòu)建,在項目的右鍵菜單中可以找到構(gòu)建按鈕;
    image.png
  • 構(gòu)建成功后可以發(fā)現(xiàn)遠程服務會自動重啟,并應用修改后的代碼,訪問測試接口返回如下信息;
{
  "code": 200,
  "message": "返回消息(遠程調(diào)試)",
  "data": null
}

總結(jié)

雖說使用SpringBoot官方的devtools可以進行熱部署,但是這種方式更像是熱重啟,如果你想要更快的熱部署體驗的話可以使用JRebel

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開了第一次的黨會,身份的轉(zhuǎn)變要...
    余生動聽閱讀 10,852評論 0 11
  • 彩排完,天已黑
    劉凱書法閱讀 4,475評論 1 3
  • 表情是什么,我認為表情就是表現(xiàn)出來的情緒。表情可以傳達很多信息。高興了當然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,655評論 2 7

友情鏈接更多精彩內(nèi)容