天天看點

springboot熱部署熱部署原理

熱部署原理

熱部署,就是在應用正在運作的時候更新軟體,卻不需要重新啟動應用。簡而言之就是在修改正在運作的運用的代碼的時候不需要重新啟動整個應用,被修改的代碼會立即生效。
 對于Java應用程式來說,熱部署就是在運作時更新Java類檔案。在基于Java的應用伺服器實作熱部署的過程中,類裝入器扮演着重要的角色。大多數基于Java的應用伺服器,包括EJB(Enterprise JavaBean)伺服器和Servlet容器,都支援熱部署。類裝入器不能重新裝入一個已經裝入的類,但隻要使用一個新的類裝入器執行個體,就可以将類再次裝入一個正在運作的應用程式。
           

springboot熱部署

在springboot開發中,springloaded不能實作熱部署,導緻每次修改項目代碼的時候都要手動的去重新開機背景運用,這個大大降低了開發的效率。可以通過spring-boot-devtools子產品提供熱部署支援;spring-boot-devtools可以不用重新開機應用程式就會自動把修改過的代碼更新到已經在運作的App上,實際上其本質還是重新開機服務隻是重新開機的速度遠遠大于手動重新開機的速度罷了。
  其實springboot熱不是使用spring-boot-devtools的深層次原理是使用了兩個classLoader,一個classloader用于加載哪些不會改變的類(比如第三方jar包依賴);另一個classLoader是專門負責加載哪些代碼改變之後的位元組碼,這樣的classLoader叫做restart classloader;通過restart ClassLoader這樣的類加載器丢棄了原來的位元組碼,重新加載改變之後的位元組碼,這樣選擇加載部分位元組碼重新開機應用的速度得到了很好的保障;
    值得注意的是:采用spring-boot-devtools子產品實作熱部署會導緻整個應用的session會話全部是失效,應該謹慎使用;(配合redis實作會話管理最好)。
           

基于Idea實作springboot應用熱部署

  1. 在Idea maven web工程的pom.xml檔案中引入如下依賴:
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入thymeleaf子產品-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--引入springboot熱部署子產品-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <optional>true</optional>
  <scope>true</scope>
</dependency>
           
<plugins>
        <!--加入springboot-maven-plugins-->
        <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
          <configuration>
              <!--如果不配置該項,應用将不會進行熱部署-->
             <fork>true</fork>
          </configuration>
        </plugin>
</plugins>
           
  1. 編寫一個TestController
package com.tedu.cn.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 1. @phone:13595672347
 2. @qq:1441826270
 3. @作者:雷玉榮
 4. @date 2019/5/5 23:00
 */
@Controller
public class TestController {
    @RequestMapping("/")
    public String index(){
        System.out.println("你好馬哥20191205623012");
        return "index";
    }
}

           
  1. 編寫應用啟動類
package com.tedu.cn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @phone:13595672347
 * @qq:1441826270
 * @作者:雷玉榮
 * @company: 貴州達内科技有限公司
 * @program 程式 = 資料結構 + 算法 (構成元素 + 運作機理)
 * @comment 達内教育專注于做技術人的指路明燈,
 * 職場生涯的精神導師
 * @date 2019/5/5 22:50
 */
@SpringBootApplication
public class App {

    public static void main(String[] args) {
       //啟動springboot
        SpringApplication.run(App.class);
    }
}

           
  1. 開啟Idea make功能,否則熱部署會失效。

    找到Idea settings 輸入compiler,将下圖中的位置打勾。

    springboot熱部署熱部署原理
  2. Ctr+Shift+A 輸入registry,在下圖選項打勾
    springboot熱部署熱部署原理
  3. 啟動App運用調試

    調試前index.html頁面類容:

    springboot熱部署熱部署原理
    調試前背景測試代碼:
    springboot熱部署熱部署原理
    浏覽器運作結果:
    springboot熱部署熱部署原理
    背景控制台輸出:
    springboot熱部署熱部署原理
    更改index.html頁面代碼:
    springboot熱部署熱部署原理
    更改背景代碼:
    springboot熱部署熱部署原理
    浏覽器運作結果:
    springboot熱部署熱部署原理
    背景輸出:
    springboot熱部署熱部署原理

    可以看出熱部署已經生效!

    值得注意的是:要想修改頁面的時候使修改的頁面也要生效必須設定springboot

    應用的applicaiton.properties檔案,如下:

    springboot熱部署熱部署原理
  4. 熱部署不生效的可能原因

    a.對應的springboot-devtools版本不對

    b.是否加入plugin 以及true

    c.設定SpringApplication.setRegisterShutdownHook(false)

    以上三點熱部署将會失效!

繼續閱讀