大家好,今天這篇文章是一篇技術實戰文章。
在文章開始之前,這里先拋一個問題:
大家在自己電腦上啟動一個 Spring Boot 項目大概需要花費多久?
根據項目大小和機器環境,花費幾秒到幾十秒的應該都有。
而之前 Spring 官方推出了一項技術說是可以將項目的啟動時間縮短到 79 毫秒。
79 毫秒大概是個什么概念?就是你還沒反應過來項目已經啟動好了。
這項技術被 Spring 官方命名為Spring Native
,翻譯成中文叫Spring 云原生
,應該有少部分人聽說過這個概念,我先帶大家入門掃盲。它是誰?
Spring Native
是 Spring 推出微服務體系 Spring Cloud 之后的又一大舉動,從名字可以猜出,Spring Native是一門面向云原生的技術。如果你還對這個概念不太理解,可以多看一點東西,比如 Oracle 的 GraalVM等。Spring Native 為使用 GraalVM 原生鏡像編譯器編譯 Spring 應用為本地可執行文件提供支持。與 Java 虛擬機相比,原生鏡像可以在許多場景下降低工作負載,包括微服務,函數式服務,非常適合容器和 Kubernetes。使用原生鏡像有明顯優勢,如快速啟動,提高峰值性能以及降低內存消耗。它有多強?
上面提到了原生鏡像
,簡單來說原生鏡像是一種將Java代碼提前編譯為獨立可執行文件(稱為本機映像)的技術。可執行文件包括應用程序類,以及其依賴項的類,運行時庫類以及JDK中的靜態鏈接本機代碼。這些原生的 Spring 應用可以作為一個獨立的可執行文件(原生鏡像)進行部署(不需要安裝 JVM),性能非常強:小芝士,GraalVM官網對原生鏡像的解釋:
原生鏡像提供了一種構建和運行具有不同于常規JVM部署特性的Spring Boot應用程序的方法:
- 輸出是一個本機可執行文件,其中包含您的應用程序以及JDK的子集以及運行它所需的依賴項。
- 在實踐中,可執行文件可能會以高度優化的容器映像(
FROM scratch
支持Docker鏡像)的形式提供,并且減少了表面攻擊,非常適合Kubernetes。- 啟動時間幾乎是即時的,并且可以立即獲得峰值性能,從而支持從零縮放(無服務器)應用程序,包括常規的Spring Boot Web應用程序。
- 減少了內存消耗,這非常適合拆分為多個微服務的系統。
- 幾乎瞬時的啟動(一般會小于 100 毫秒)
- 瞬時的峰值性能以及更低的資源消耗
上 手
既然 Spring Native 性能這么強悍,是不是得動手試一試了。 下面我會拿傳統的 Spring Boot 項目和基于 Spring Native的項目進行比較演示,讓大家來直觀地感受一下。環境信息
-
電腦:MacBook Pro 13寸 2017
-
操作系統: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
初始化項目
進入 Spring 初始化頁面: https://start.spring.io/第一步:填寫必要項目信息這里我選擇 Maven 構建,SpringBoot 版本這里選擇的是2.5.8,jdk 版本選擇 11
第二步:添加必要依賴 添加兩個依賴:
- SpringNative
- Spring Web
第三步:生成項目骨架代碼
點擊下載可以獲得一個壓縮包
注意:以上步驟也可以直接在 IDEA 里通過 start.spring.io進行新建,這里不再贅述。
運行項目
導入測試項目后可以在根目錄下面看到一個幫助文檔:
通過閱讀幫助文檔得知有兩種方式啟動 Spring Native 項目:
-
第一種:借助 Maven 插件將項目構建為 Docker 鏡像,然后啟動鏡像;
-
第二種:借助本地構建工具將項目打包為一個可執行的文件,然后直接啟動即可。
$./mvnwspring-boot:build-image
這個過程可能有點漫長,也可能會失敗,大家做好心理準備。第二步:啟動鏡像文件
$dockerrun--rmspring-native-demo:0.0.1-SNAPSHOT
執行完命令之后,項目瞬間就跑起來了。性能測試對比
場景一:使用 Spring Native
官方宣稱 79 毫秒就可以啟動,原諒我的電腦太渣了,最好的一次花費了 143 毫秒,也就是一瞬間的事情,確實牛叉。場景二:普通啟動
沒有對比就沒有傷害,普通啟動花費了2.091 秒
小結
在我的破電腦上測試,Spring Native 的啟動速度大致是普通啟動的 15 倍。FAQ 在測試過程中踩了不少坑,這里做一個匯總。問題一:Maven 依賴下載失敗,網絡差 可以配置 Maven 鏡像倉庫
<mirror>
<id>aliyunmavenid>
<mirrorOf>*mirrorOf>
<name>centralname>
<url>https://maven.aliyun.com/repository/centralurl>
mirror>
問題二:鏡像構建失敗,提示內存不足
解決方法:增大 Docker 的內存配置
好了,以上就是今天的內容分享了,感謝大家的收看,我們下篇見。
-
編譯器
+關注
關注
1文章
1618瀏覽量
49052 -
spring
+關注
關注
0文章
338瀏覽量
14311 -
鏡像
+關注
關注
0文章
164瀏覽量
10698
原文標題:Spring官方再出手,這個工具殺瘋了!
文章出處:【微信號:CodeSheep,微信公眾號:CodeSheep】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論