<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          體驗(yàn)79毫秒啟動(dòng)一個(gè)項(xiàng)目

          共 2538字,需瀏覽 6分鐘

           ·

          2022-01-22 19:17

          今天是實(shí)戰(zhàn)

          先拋一個(gè)問題,大家在自己電腦上啟動(dòng)一個(gè) spring boot 項(xiàng)目需要花費(fèi)多久?

          根據(jù)項(xiàng)目大小和機(jī)器環(huán)境,花費(fèi)幾秒到幾十秒的人應(yīng)該都有。

          最近 spring 官方推出了一項(xiàng)技術(shù)可以將項(xiàng)目的啟動(dòng)時(shí)間縮短到 79 毫秒,79 毫秒大概是個(gè)什么概念?就是你還沒反應(yīng)過來項(xiàng)目已經(jīng)啟動(dòng)好了,太牛了。

          這項(xiàng)技術(shù)被 spring 官方命名為Spring Native,翻譯成中文叫Spring 云原生,應(yīng)該有少部分人聽說過這個(gè)概念,我先帶大家入門掃盲。

          我是誰?

          Spring Native 是 Spring 推出微服務(wù)體系 Spring Cloud 之后的又一大舉動(dòng),從名字可以猜出,Spring Native是一門面向云原生的技術(shù)。如果你還對(duì)這個(gè)概念不太理解,可以多看一點(diǎn)東西,比如 Oracle 的 GraalVM等。

          Spring Native ?為使用 GraalVM 原生鏡像編譯器編譯 Spring 應(yīng)用為本地可執(zhí)行文件提供支持。與 Java 虛擬機(jī)相比,原生鏡像可以在許多場(chǎng)景下降低工作負(fù)載,包括微服務(wù),函數(shù)式服務(wù),非常適合容器和 Kubernetes。使用原生鏡像有明顯優(yōu)勢(shì),如快速啟動(dòng),提高峰值性能以及降低內(nèi)存消耗。

          我有多強(qiáng)?

          上面提到了原生鏡像,簡(jiǎn)單來說原生鏡像是一種將Java代碼提前編譯為獨(dú)立可執(zhí)行文件(稱為本機(jī)映像)的技術(shù)。可執(zhí)行文件包括應(yīng)用程序類,以及其依賴項(xiàng)的類,運(yùn)行時(shí)庫(kù)類以及JDK中的靜態(tài)鏈接本機(jī)代碼。

          小芝士,GraalVM官網(wǎng)對(duì)原生鏡像的解釋:

          原生鏡像提供了一種構(gòu)建和運(yùn)行具有不同于常規(guī)JVM部署特性的Spring Boot應(yīng)用程序的方法:

          • 輸出是一個(gè)本機(jī)可執(zhí)行文件,其中包含您的應(yīng)用程序以及JDK的子集以及運(yùn)行它所需的依賴項(xiàng)。
          • 在實(shí)踐中,可執(zhí)行文件可能會(huì)以高度優(yōu)化的容器映像(FROM scratch支持Docker鏡像)的形式提供,并且減少了表面攻擊,非常適合Kubernetes。
          • 啟動(dòng)時(shí)間幾乎是即時(shí)的,并且可以立即獲得峰值性能,從而支持從零縮放(無服務(wù)器)應(yīng)用程序,包括常規(guī)的Spring Boot Web應(yīng)用程序。
          • 減少了內(nèi)存消耗,這非常適合拆分為多個(gè)微服務(wù)的系統(tǒng)。

          這些原生的 Spring 應(yīng)用可以作為一個(gè)獨(dú)立的可執(zhí)行文件(原生鏡像)進(jìn)行部署(不需要安裝 JVM),性能非常強(qiáng):

          • 幾乎瞬時(shí)的啟動(dòng)(一般會(huì)小于 100 毫秒)
          • 瞬時(shí)的峰值性能以及更低的資源消耗

          當(dāng)然牛逼的背后肯定要稍微付出一點(diǎn)代價(jià):比 JVM 更長(zhǎng)的構(gòu)建時(shí)間和更少的運(yùn)行時(shí)優(yōu)化。

          上手

          既然 Spring Native 性能這么強(qiáng)悍,是不是得動(dòng)手試一試了。

          下面我會(huì)拿傳統(tǒng)的 springboot 項(xiàng)目和基于 Spring Native的項(xiàng)目進(jìn)行比較演示。

          環(huán)境信息

          • 電腦:MacBook pro 13寸 2017
          • 操作系統(tǒng):macOS Big Sur 11.2
          • IDE:IntelliJ IDEA 2021.2.2 (Ultimate Edition)
          • Open JDK:11.0.12
          • maven:3.6.3
          • Docker desktop:4.0.1

          初始化項(xiàng)目

          進(jìn)入 spring 初始化頁面:

          https://start.spring.io/

          第一步:填寫必要項(xiàng)目信息

          這里我選擇 maven 構(gòu)建,spring boot 版本選擇 2.5.8,jdk 版本選擇 11

          第二步:添加必要依賴

          添加兩個(gè)依賴:

          • spring native
          • spring web

          第三步:生成項(xiàng)目骨架代碼

          點(diǎn)擊下載可以獲得一個(gè)壓縮包

          注意:以上步驟也可以直接在 IDEA 里通過 start.spring.io進(jìn)行新建,這里不再贅述。

          運(yùn)行項(xiàng)目

          導(dǎo)入測(cè)試項(xiàng)目后可以在根目錄下面看到一個(gè)幫助文檔:

          通過閱讀幫助文檔得知有兩種方式啟動(dòng) spring native 項(xiàng)目:

          • 第一種:借助 maven 插件將項(xiàng)目構(gòu)建為 docker 鏡像,然后啟動(dòng)鏡像;
          • 第二種:借助本地構(gòu)建工具將項(xiàng)目打包為一個(gè)可執(zhí)行的文件,然后直接啟動(dòng)即可。

          我電腦上已經(jīng)裝了 docker 工具,這里我演示一下第一種方式。

          第一步:生成docker 鏡像文件

          $?./mvnw?spring-boot:build-image

          這個(gè)過程可能有點(diǎn)漫長(zhǎng),也可能會(huì)失敗,大家做好心理準(zhǔn)備。

          第二步:?jiǎn)?dòng)鏡像文件

          $?docker?run?--rm?spring-native-demo:0.0.1-SNAPSHOT

          執(zhí)行完命令之后,項(xiàng)目瞬間就跑起來了。

          性能測(cè)試對(duì)比

          場(chǎng)景一:使用 Spring Native

          官方宣稱 79 毫秒就可以啟動(dòng),原諒我的電腦太渣了,最好的一次花費(fèi)了 143 毫秒,也就是一瞬間的事情,確實(shí)牛叉。


          場(chǎng)景二:普通啟動(dòng)

          沒有對(duì)比就沒有傷害,普通啟動(dòng)花費(fèi)了2.091 秒


          結(jié)論

          在我的破電腦上測(cè)試,Spring Native 的啟動(dòng)速度大致是普通啟動(dòng)的 15 倍。

          Spring Native 牛逼!牛逼!牛逼!(破音)

          FAQ

          在測(cè)試過程中踩了不少坑,這里做一個(gè)匯總。

          問題一:maven 依賴下載失敗,網(wǎng)絡(luò)差

          可以配置 maven 鏡像倉(cāng)庫(kù)

          <mirror>
          ??<id>aliyunmavenid>
          ??<mirrorOf>*mirrorOf>
          ??<name>centralname>
          ??<url>https://maven.aliyun.com/repository/centralurl>
          mirror>

          問題二:鏡像構(gòu)建失敗,提示內(nèi)存不足

          解決方法:增大 Docker 的內(nèi)存配置

          -- End --

          好了,以上就是今天全部的內(nèi)容,大家學(xué)會(huì)了嗎?如果你測(cè)試過程遇到問題了,歡迎聯(lián)系我?guī)湍憬鉀Q~

          學(xué)習(xí)教程(拼命更新中,歡迎催更……)

          我是雷小帥,每天帶你進(jìn)步一點(diǎn)點(diǎn),總會(huì)進(jìn)步億點(diǎn)點(diǎn)~

          如果你覺得很贊,歡迎三連支持一下,很需要你們的正反饋!

          瀏覽 47
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  男女AA免费视频 | 人人看,人人摸,人人操 | 大香蕉这里只有精品 | 小黄片视频在线播放 | 91综合视频 |