SpringBoot實現熱部署兩種方式!

不一樣的科技宅發表於2021-11-15

前言

  小宅作為一個Java程式設計師,在日常的工作中,經常需要修改程式碼,然後重啟服務,在驗證程式碼是否生效。如果是小專案還好,重啟速度比較快,等待時間比較短。但是隨著專案逐漸變大,並且被拆分成多個服務時,改動一些程式碼,可能需要重啟多個服務才能生效。這樣下來就耗費了大量的時間在等待服務重啟。

  這樣肯定是不行的,極大的影響了我的開發效率,那麼是否有方式能夠實現,修改完程式碼之後,能夠不重啟專案呢?

那肯定是有的,要不然這篇文章咋來的?。

熱部署(Hot Swap)

  從Java1.4起,JVM引入了HotSwap,能夠在Debug的時候更新類的位元組碼。所以使用熱部署,可以實現修改程式碼後,無須重啟服務就可以載入修改的程式碼,但是它只能用來更新方法體。作為神器的IDEA自然是支援這一技術的。

配置IDEA

  點選當前執行的服務,再點選Edit Configurations

  點選要配置的程式,找到 On ‘Update’ actionOn frame deactivation選擇 Update classes and resources。點選OK就可以實現熱部署了。

  經過以上配置,在修改程式碼以後。只需要點選小錘子或者使用快捷鍵Command + F9重新編譯一下,就可以讓改動的程式碼生效了。並且還會提示有多少個class被重新讀取了。

   雖然到這裡已經能實現熱部署的功能了。但是Java的虛擬機器只能實現方法體的修改熱部署,對於整個類的結構修改,仍然需要重啟虛擬機器,對類重新載入才能完成更新操作。

測試

初始狀態

方法體修改

類結構變更

  由於熱部署只支援修改方法體,所以類結構變更時會報錯,並提示是否需要重啟。

DevTools

  前面雖然通過配置IDEA實現了簡單的熱部署,但是有很明顯的缺點,只能實現方法體的修改熱部署。很明顯無法滿足日常的需求的,所以這個時候就需要使用DevTools來替代了。

   DevTools是Spring為開發者提供了一個名為spring-boot-devtools的模組,來使Spring Boot應用支援熱部署,提高開發者的開發效率,無需手動重啟Spring Boot應用。使用起來非常簡單,只需要將下面的依賴引入專案裡面就可以了。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>

觸發重啟

   DevTools嚴格意義上其實不算熱部署,而是快速重啟。為什麼這樣說呢?DevTools的實現原理是:使用兩個類載入器,一個是base classloader來載入不會被更改的類(例如,來自第三方的Jar),還有一個是restart classloader用來載入當前正在開發的類。所以當應用程式重新啟動時,restart classloader將被丟棄,並建立一個新的類載入器。也就意味著應用程式重新啟動通常比“冷啟動”快得多,因為base classloader已經填充好了並且是可用的。

  簡而言之就是:通過監控類路徑資源,當類路徑上的檔案發生更改時,自動重新啟動應用程式,由於只需要重新讀取被修改的類,所以要比冷啟動快

  那麼問題來了,該如何更新類路徑來觸發自動重啟呢?其實這個取決於你使用的 IDE:

  1. 在 Eclipse中,儲存修改後的檔案會導致更新類路徑並觸發重新啟動。
  2. 在 IntelliJ IDEA中,需要點選Build按鈕Command + F9構建專案來實現。

配置自動重啟

  這時候可能有小夥伴想問了,難道IDEA沒有類似於Eclipse中儲存檔案自動觸發重啟的功能嘛。那肯定是有的,只需要進行下面兩步的配置就可以實現了。

注意:需要將前面的設定,全部還原。

  1. 開啟Build project automatically

  2. 使用快捷鍵:Ctrl + Alt + Shift + / 調出 Registry 視窗,勾選 compiler.automake.allow.when.app.running 選項。

新版本如下圖所示:

總結

 IDEA只能實現方法體的修改熱部署,無法滿足日常的使用要求,所以更推薦使用DevTools。但是如果你覺得重新啟動對你來說還不夠快。你可以考慮使用JRebel外掛。

結尾

  如果覺得對你有幫助,可以多多評論,多多點贊哦,也可以到我的主頁看看,說不定有你喜歡的文章,也可以隨手點個關注哦,謝謝。

  我是不一樣的科技宅,每天進步一點點,體驗不一樣的生活。我們下期見!

相關文章