自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

體驗(yàn)Spring-Boot-Devtools熱部署,流暢且不失強(qiáng)大

開發(fā) 前端
一個(gè)高級(jí)開發(fā)工程師,第一次用SpringBoot,決定打印一個(gè)經(jīng)典的HelloWorld。由于他太激動(dòng)了,結(jié)果打錯(cuò)了一個(gè)字母,變成了HalloWorld。

[[342929]]

本文轉(zhuǎn)載自微信公眾號(hào)「小姐姐味道」,作者小姐姐養(yǎng)的狗 。轉(zhuǎn)載本文請(qǐng)聯(lián)系小姐姐味道公眾號(hào)。  

一個(gè)高級(jí)開發(fā)工程師,第一次用SpringBoot,決定打印一個(gè)經(jīng)典的HelloWorld。

由于他太激動(dòng)了,結(jié)果打錯(cuò)了一個(gè)字母,變成了HalloWorld。

哈嘍?多么土多么俗多么沒(méi)有檔次,就像是嘴里含了個(gè)檳郎,吐不出氣來(lái),絕對(duì)需要進(jìn)行改正。

結(jié)果,改成hello之后,高工發(fā)現(xiàn)需要重啟應(yīng)用才能生效。整整等了十多秒,系統(tǒng)才磨磨蹭蹭的啟動(dòng)起來(lái)。

有些東西,時(shí)間長(zhǎng)了是好事,但對(duì)于這種代碼調(diào)試場(chǎng)景來(lái)說(shuō),就讓人無(wú)法忍受。

高工吐出嘴里的檳郎,心想,是時(shí)候開發(fā)一個(gè)加快調(diào)試速度的工具了。

這就是SBDT的由來(lái)。

spring-boot-devtools

SpringBoot,StringBuilder,StringBuffer,俗稱Java界的3個(gè)SB。尤其是SpringBoot,非常的好用,主要?dú)w功于它的autoconfig,靠約定來(lái)規(guī)范開發(fā)。

但問(wèn)題是,SpringBoot加載的Jar包太多、太大了,每次啟動(dòng)都要花費(fèi)很長(zhǎng)時(shí)間。對(duì)于SpringBoot服務(wù)來(lái)說(shuō),spring-boot-devtools就像一陣及時(shí)雨,滋潤(rùn)著瞪眼發(fā)呆盯著重啟屏幕的同學(xué)。

雖然這個(gè)東西已經(jīng)出來(lái)很長(zhǎng)時(shí)間了,但我發(fā)現(xiàn)在現(xiàn)實(shí)項(xiàng)目中,大家用到的還是比較少。但它的使用非常簡(jiǎn)單。

只需要在項(xiàng)目的pom文件中,加入下面的jar包即可獲取秒級(jí)的服務(wù)重載(熱部署)。

  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-devtools</artifactId> 
  4.     <scope>runtime</scope> 
  5.     <optional>true</optional> 
  6. </dependency> 

 

由于starter文件中默認(rèn)的值就是true,所以下面yml中的配置,并不是必須的。

  1. spring: 
  2.   devtools: 
  3.     restart: 
  4.       enabled: true 

我們來(lái)驗(yàn)證一下。來(lái)的很快。

新建一個(gè)簡(jiǎn)單的controller,輸出halloworld。

  1. @Controller 
  2. public class DemoController { 
  3.     @GetMapping("/test"
  4.     @ResponseBody 
  5.     public String test(){ 
  6.         return "halloworld"
  7.     } 

修改代碼,把hallo改成hello??刂婆_(tái)中將開始滾動(dòng)輸出日志,加載項(xiàng)目代碼。此時(shí)訪問(wèn)瀏覽器,發(fā)現(xiàn)我們的改動(dòng)生效了。

  1. # 日志顯示 
  2. Started MbyeApplication in 1.731 seconds (JVM running for 51.115) 

控制臺(tái)也輸出了本次restart的時(shí)間,只花了不到2秒鐘,可以說(shuō)是飛快了。

為了在代碼修改后,能夠?qū)崟r(shí)的觸發(fā)編譯,你需要在IDEA中做如下配置。如果這個(gè)配置不生效,就需要手動(dòng)點(diǎn)擊一下Build了(注意不是rebuild)。

為什么熱部署的重新加載能夠這么快呢?因?yàn)樗闹匦聠?dòng)并不是完整的重啟整個(gè)應(yīng)用,而是只重啟我們的應(yīng)用代碼。

通過(guò)配置META-INF/spring-devtools.properties文件,可以指定每次重新啟動(dòng)都加載第三方j(luò)ar包。不過(guò)這種場(chǎng)景比較少。當(dāng)然,有include,舊有exclude,示例如下。

  1. restart.exclude.somejar=/somejar-[\\w-]+\.jar 
  2. restart.include.ajar=/ajar-[\\w-]+\.jar 

注意到一件有意思的事情。當(dāng)我們使用IDEA啟動(dòng)的時(shí)候,控制臺(tái)的輸出是這樣的。

  1. 2020-09-18 21:33:59.495  INFO 4635 --- [  restartedMain] c.g.javarunfast.mbye.MbyeApplication     : Starting MbyeApplication on LYCYs-MacBook-Pro.local with PID 4635 (/target/classes started by xjjdog in /Users/xjjdog/codes/javarunfast/mbye) 
  2. 2020-09-18 21:33:59.495  INFO 4635 --- [  restartedMain] c.g.javarunfast.mbye.MbyeApplication     : No active profile set, falling back to default profiles: default 
  3. 2020-09-18 21:34:00.355  INFO 4635 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! 
  4. 2020-09-18 21:34:00.355  INFO 4635 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Elasticsearch repositories in DEFAULT mode. 
  5. 2020-09-18 21:34:00.357  INFO 4635 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 1ms. Found 0 Elasticsearch repository interfaces. 
  6. 2020-09-18 21:34:00.362  INFO 4635 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! 
  7. 2020-09-18 21:34:00.362  INFO 4635 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Reactive Elasticsearch repositories in DEFAULT mode. 

里面的啟動(dòng)線程是restartedMain。但當(dāng)我們使用java -jar *jar來(lái)啟動(dòng)的時(shí)候,主進(jìn)程并不是restartedMain,而是main。

這是因?yàn)?,線上環(huán)境開啟devtools,是沒(méi)有意義的。

這句話暫時(shí)這么說(shuō),因?yàn)闀?huì)打臉。

更多功能

要想了解devtools有什么功能,我們先來(lái)看一下它的源碼目錄結(jié)構(gòu)。

filewatch和classpath就不必說(shuō)了,通過(guò)監(jiān)聽文件的變化,即可實(shí)現(xiàn)熱啟動(dòng)。它原理上是使用一個(gè)獨(dú)立的ClassLoader(具體是指RestartClassLoader),來(lái)完成加載后的替換。

學(xué)習(xí)一下這部分的代碼,可以對(duì)Java的類加載器有更好的理解。

LiveReload

接下來(lái)就是livereload功能。

LiveReload在做前端開發(fā)的時(shí)候,經(jīng)常會(huì)用到。

devtools也會(huì)在后臺(tái)開啟一個(gè)LiveReload Server,瀏覽器會(huì)與這個(gè)Server保持著一個(gè)長(zhǎng)連接,當(dāng)后端有前端資源變動(dòng)的時(shí)候,將會(huì)通知瀏覽器進(jìn)行刷新,實(shí)現(xiàn)熱部署。

下面是Chrome的Remote Live Reload插件地址。安裝即可擁有這個(gè)酷炫的功能。

  1. https://chrome.google.com/webstore/detail/remotelivereload/jlppknnillhjgiengoigajegdpieppei?hl=en-GB 

遠(yuǎn)程部署

這個(gè)就有意思多了。我們上面說(shuō)到,線上環(huán)境開啟devtools,是沒(méi)有意義的,現(xiàn)在來(lái)打臉。

你可能自己的機(jī)器性能比較低,讓代碼運(yùn)行在遠(yuǎn)端,本地只管代碼開發(fā)。這時(shí)候,就可以使用遠(yuǎn)程熱部署。

要開啟這個(gè)功能,需要做的步驟有點(diǎn)多。

步驟一。

需要在pom.xml中對(duì)spring-boot-maven-plugin做如下的更改。

  1. <plugin> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-maven-plugin</artifactId> 
  4.     <configuration> 
  5.         <excludeDevtools>false</excludeDevtools> 
  6.     </configuration> 
  7. </plugin> 

 

 

步驟二。

在yml中設(shè)置一個(gè)服務(wù)端與調(diào)試端連接的密鑰。

  1. spring: 
  2.   devtools: 
  3.     remote: 
  4.       secret: test 

步驟三。

將SB服務(wù)打包成jar,然后啟動(dòng)。

  1. mvn -Dmaven.test.skip=true -Pdev package 
  2.  
  3. java -jar -Xdebug  \ 
  4. -Xrunjdwp:server=y,transport=dt_socket,suspend=n  \ 
  5. mbye-0.0.1-SNAPSHOT.jar 

可以看到我們?cè)趩?dòng)的時(shí)候加入了很多參數(shù),這就是開啟遠(yuǎn)程被調(diào)戲的意思。

步驟四。

在本地IDEA中編輯一個(gè)Java文件,并在啟動(dòng)變量里塞進(jìn)我們的服務(wù)端地址(和應(yīng)用地址一樣)。

  1. import org.springframework.boot.devtools.RemoteSpringApplication; 
  2.  
  3. /** 
  4.  * @date 2020/09/19 
  5.  */ 
  6. public class Remote { 
  7.     public static void main(String[] args) { 
  8.         RemoteSpringApplication.main(new String[]{"http://localhost:8080"}); 
  9.     } 

步驟五。

進(jìn)行驗(yàn)證。隨便編輯一個(gè)能看到效果的文件,然后點(diǎn)擊build。

下面是IDEA開發(fā)端的截圖。

下面是服務(wù)端截圖??梢钥吹椒?wù)已經(jīng)重新載入了,不過(guò)速度特別快。

  1. Listening for remote restart updates on /.~~spring-boot!~/restart 
  2. Started MbyeApplication in 1.961 seconds (JVM running for 249.452) 

訪問(wèn)web頁(yè)面,發(fā)現(xiàn)代碼已經(jīng)上傳成功了。

其實(shí),spring-boot-devtools,還不算是最強(qiáng)大的。因?yàn)樗看味紩?huì)使用ClassLoader重新載入項(xiàng)目的class文件。如果你的項(xiàng)目文件特別多,那也是比較慢的。

有一個(gè)更牛的工具,叫做jrebel,那可真是開發(fā)的利器。更棒的是,它能用在任何Java項(xiàng)目上,而不僅僅限制于SpringBoot項(xiàng)目中。不過(guò),它有點(diǎn)重,而且是收費(fèi)的。下次我們介紹一下它,或者你已經(jīng)提前去體驗(yàn)了 。

 

作者簡(jiǎn)介:小姐姐味道 (xjjdog),一個(gè)不允許程序員走彎路的公眾號(hào)。聚焦基礎(chǔ)架構(gòu)和Linux。十年架構(gòu),日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。我的個(gè)人微信xjjdog0,歡迎添加好友,進(jìn)一步交流。

 

責(zé)任編輯:武曉燕 來(lái)源: 小姐姐味道
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)