大家好,今天這篇文章是一篇技術(shù)實(shí)戰(zhàn)文章。
在文章開(kāi)始之前,這里先拋一個(gè)問(wèn)題:
大家在自己電腦上啟動(dòng)一個(gè) Spring Boot 項(xiàng)目大概需要花費(fèi)多久?
根據(jù)項(xiàng)目大小和機(jī)器環(huán)境,花費(fèi)幾秒到幾十秒的應(yīng)該都有。
而之前 Spring 官方推出了一項(xiàng)技術(shù)說(shuō)是可以將項(xiàng)目的啟動(dòng)時(shí)間縮短到 79 毫秒。
79 毫秒大概是個(gè)什么概念?就是你還沒(méi)反應(yīng)過(guò)來(lái)項(xiàng)目已經(jīng)啟動(dòng)好了。
這項(xiàng)技術(shù)被 Spring 官方命名為Spring Native
,翻譯成中文叫Spring 云原生
,應(yīng)該有少部分人聽(tīng)說(shuō)過(guò)這個(gè)概念,我先帶大家入門(mén)掃盲。它是誰(shuí)?
Spring Native
是 Spring 推出微服務(wù)體系 Spring Cloud 之后的又一大舉動(dòng),從名字可以猜出,Spring Native是一門(mén)面向云原生的技術(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)單來(lái)說(shuō)原生鏡像是一種將Java代碼提前編譯為獨(dú)立可執(zhí)行文件(稱(chēng)為本機(jī)映像)的技術(shù)。可執(zhí)行文件包括應(yīng)用程序類(lèi),以及其依賴(lài)項(xiàng)的類(lèi),運(yùn)行時(shí)庫(kù)類(lèi)以及JDK中的靜態(tài)鏈接本機(jī)代碼。這些原生的 Spring 應(yīng)用可以作為一個(gè)獨(dú)立的可執(zhí)行文件(原生鏡像)進(jìn)行部署(不需要安裝 JVM),性能非常強(qiáng):小芝士,GraalVM官網(wǎng)對(duì)原生鏡像的解釋?zhuān)?/p>
原生鏡像提供了一種構(gòu)建和運(yùn)行具有不同于常規(guī)JVM部署特性的Spring Boot應(yīng)用程序的方法:
- 輸出是一個(gè)本機(jī)可執(zhí)行文件,其中包含您的應(yīng)用程序以及JDK的子集以及運(yùn)行它所需的依賴(lài)項(xiàng)。
- 在實(shí)踐中,可執(zhí)行文件可能會(huì)以高度優(yōu)化的容器映像(
FROM scratch
支持Docker鏡像)的形式提供,并且減少了表面攻擊,非常適合Kubernetes。- 啟動(dòng)時(shí)間幾乎是即時(shí)的,并且可以立即獲得峰值性能,從而支持從零縮放(無(wú)服務(wù)器)應(yīng)用程序,包括常規(guī)的Spring Boot Web應(yīng)用程序。
- 減少了內(nèi)存消耗,這非常適合拆分為多個(gè)微服務(wù)的系統(tǒng)。
- 幾乎瞬時(shí)的啟動(dòng)(一般會(huì)小于 100 毫秒)
- 瞬時(shí)的峰值性能以及更低的資源消耗
上 手
既然 Spring Native 性能這么強(qiáng)悍,是不是得動(dòng)手試一試了。 下面我會(huì)拿傳統(tǒng)的 Spring Boot 項(xiàng)目和基于 Spring Native的項(xiàng)目進(jìn)行比較演示,讓大家來(lái)直觀地感受一下。環(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 初始化頁(yè)面: https://start.spring.io/第一步:填寫(xiě)必要項(xiàng)目信息這里我選擇 Maven 構(gòu)建,SpringBoot 版本這里選擇的是2.5.8,jdk 版本選擇 11
- SpringNative
- Spring Web
第三步:生成項(xiàng)目骨架代碼
點(diǎn)擊下載可以獲得一個(gè)壓縮包
注意:以上步驟也可以直接在 IDEA 里通過(guò) start.spring.io進(jìn)行新建,這里不再贅述。
運(yùn)行項(xiàng)目
導(dǎo)入測(cè)試項(xiàng)目后可以在根目錄下面看到一個(gè)幫助文檔:
通過(guò)閱讀幫助文檔得知有兩種方式啟動(dòng) Spring Native 項(xiàng)目:
-
第一種:借助 Maven 插件將項(xiàng)目構(gòu)建為 Docker 鏡像,然后啟動(dòng)鏡像;
-
第二種:借助本地構(gòu)建工具將項(xiàng)目打包為一個(gè)可執(zhí)行的文件,然后直接啟動(dòng)即可。
$./mvnwspring-boot:build-image
這個(gè)過(guò)程可能有點(diǎn)漫長(zhǎng),也可能會(huì)失敗,大家做好心理準(zhǔn)備。第二步:?jiǎn)?dòng)鏡像文件
$dockerrun--rmspring-native-demo:0.0.1-SNAPSHOT
執(zhí)行完命令之后,項(xiàng)目瞬間就跑起來(lái)了。性能測(cè)試對(duì)比
場(chǎng)景一:使用 Spring Native
官方宣稱(chēng) 79 毫秒就可以啟動(dòng),原諒我的電腦太渣了,最好的一次花費(fèi)了 143 毫秒,也就是一瞬間的事情,確實(shí)牛叉。
沒(méi)有對(duì)比就沒(méi)有傷害,普通啟動(dòng)花費(fèi)了2.091 秒
小結(jié)
在我的破電腦上測(cè)試,Spring Native 的啟動(dòng)速度大致是普通啟動(dòng)的 15 倍。FAQ 在測(cè)試過(guò)程中踩了不少坑,這里做一個(gè)匯總。問(wèn)題一:Maven 依賴(lài)下載失敗,網(wǎng)絡(luò)差 可以配置 Maven 鏡像倉(cāng)庫(kù)
<mirror>
<id>aliyunmavenid>
<mirrorOf>*mirrorOf>
<name>centralname>
<url>https://maven.aliyun.com/repository/centralurl>
mirror>
問(wèn)題二:鏡像構(gòu)建失敗,提示內(nèi)存不足
解決方法:增大 Docker 的內(nèi)存配置
好了,以上就是今天的內(nèi)容分享了,感謝大家的收看,我們下篇見(jiàn)。
-
編譯器
+關(guān)注
關(guān)注
1文章
1654瀏覽量
49875 -
spring
+關(guān)注
關(guān)注
0文章
340瀏覽量
14876 -
鏡像
+關(guān)注
關(guān)注
0文章
178瀏覽量
11113
原文標(biāo)題:Spring官方再出手,這個(gè)工具殺瘋了!
文章出處:【微信號(hào):CodeSheep,微信公眾號(hào):CodeSheep】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
java spring教程
什么是java spring
EDAS再升級(jí)!全面支持Spring Cloud應(yīng)用
Spring工作原理
Spring Boot嵌入式Web容器原理是什么
比特幣“殺”瘋了,48小時(shí)53億資金灰飛煙滅,7萬(wàn)人爆倉(cāng)!
Spring認(rèn)證_什么是Spring GraphQL

「Spring認(rèn)證」什么是Spring GraphQL?

spring認(rèn)證證書(shū)有用嗎?
為什么使用spring-authorization-server?
基于spring的SPI擴(kuò)展機(jī)制是如何實(shí)現(xiàn)的?
怎樣使用Kiuwan保護(hù)Spring Boot應(yīng)用程序呢?
Spring干掉原生JVM?

Spring Boot Actuator快速入門(mén)
Spring Cloud Gateway網(wǎng)關(guān)框架

評(píng)論