Spring Native 基礎(chǔ)環(huán)境搭建過(guò)程
一、Spring Native 是什么
Spring Native
可以通過(guò)GraalVM
將Spring
應(yīng)用程序編譯成原生鏡像,提供了一種新的方式來(lái)部署Spring
應(yīng)用。與Java
虛擬機(jī)相比,原生鏡像可以在許多場(chǎng)景下降低工作負(fù)載,包括微服務(wù),函數(shù)式服務(wù),非常適合容器和Kubernetes
。使用原生鏡像有明顯優(yōu)勢(shì),如快速啟動(dòng),提高峰值性能以及降低內(nèi)存消耗。Spring Native
支持Java
和Kotlin
。
這個(gè)項(xiàng)目的目標(biāo)是尋找Spring JVM
的替代方案,提供一個(gè)能將應(yīng)用程序打包,并運(yùn)行在輕量級(jí)容器的方案。期望能夠在Spring Native
中支持所有的Spring
應(yīng)用程序(幾乎不用修改代碼)。
原生(本地)鏡像是一種將
Java
代碼構(gòu)建為獨(dú)立可執(zhí)行文件的技術(shù)。該可執(zhí)行文件包括應(yīng)用程序類、其依賴項(xiàng)的類、運(yùn)行時(shí)庫(kù)類以及來(lái)自JDK
的靜態(tài)鏈接本地代碼。JVM
被打包到原生鏡像中,因此在目標(biāo)系統(tǒng)上不需要任何Java
運(yùn)行環(huán)境,但構(gòu)建產(chǎn)物依賴于平臺(tái)。因此,需要為每個(gè)支持的目標(biāo)系統(tǒng)進(jìn)行一次構(gòu)建,在使用Docker
等容器技術(shù)時(shí)會(huì)更加簡(jiǎn)單,將容器構(gòu)建為一個(gè)目標(biāo)系統(tǒng),可以部署到任何Docker
運(yùn)行時(shí)。
二、優(yōu)點(diǎn)
Spring Native
的基礎(chǔ)是GraalVM
,而GraalVM
是使用Java
靜態(tài)編譯,將Java
字節(jié)碼編譯為匯編代碼,即二進(jìn)制native
程序,他摒棄了JVM
,這是成就它所有優(yōu)點(diǎn)的根本原因。
【1】編譯出來(lái)的原生Spring
應(yīng)用可以作為一個(gè)獨(dú)立的可執(zhí)行文件進(jìn)行部署(不需要安裝JVM
)
【2】幾乎瞬時(shí)的啟動(dòng)(一般小于100
毫秒)
【3】瞬時(shí)的峰值性能
【4】更低的資源消耗
三、局限性
GraalVM
項(xiàng)目也有一些缺點(diǎn)和權(quán)衡,希望隨著時(shí)間的推移有所改進(jìn):
【1】構(gòu)建本地映像是一個(gè)繁重的過(guò)程,比JVM
更長(zhǎng)的構(gòu)建時(shí)間;
【2】相比于傳統(tǒng)的Java
運(yùn)行方式,運(yùn)行時(shí)優(yōu)化不足;
【3】不能直接支持反射、動(dòng)態(tài)代理等動(dòng)態(tài)特性;
【4】現(xiàn)在處于實(shí)驗(yàn)階段,生態(tài)比較少;
四、原生鏡像(native image)和常規(guī) JVM 程序的區(qū)別
【1】在構(gòu)建時(shí)會(huì)從主入口點(diǎn)對(duì)應(yīng)用程序進(jìn)行靜態(tài)分析。
【2】在構(gòu)建時(shí)會(huì)移除未使用的代碼。
【3】需要配置反射、動(dòng)態(tài)代理等。
【4】類路徑ClassPath
在構(gòu)建時(shí)就已經(jīng)確定。
【5】沒(méi)有類延遲加載:可執(zhí)行文件中所有的內(nèi)容都會(huì)在啟動(dòng)時(shí)加載到內(nèi)存中。
【6】在構(gòu)建時(shí)就運(yùn)行了一些代碼。
【7】構(gòu)建原生鏡像還存在一些局限性。
【8】一些Java
切面類的特性未得到完全支持。
五、前置條件:GraalVM
通用遞歸應(yīng)用和算法語(yǔ)言虛擬機(jī)Graal VM
是一個(gè)高性能的JDK
發(fā)行版,專為Java
和其他JVM
語(yǔ)言編寫(xiě),同時(shí)支持JavaScript
、Ruby
、Python
和其他幾種語(yǔ)言。GraalVM
的多語(yǔ)言能力使得在一個(gè)應(yīng)用程序中混合使用多種編程語(yǔ)言成為可能,同時(shí)消除了不同語(yǔ)言間互相調(diào)用的成本。它提供了一個(gè)原生鏡像生成器Native Image builder
,這是一個(gè)從Java
應(yīng)用中生成原生代碼并將其與VM
一起打包成獨(dú)立可執(zhí)行文件的工具。Spring Boot Maven
和Gradle Plugin
除了少數(shù) 例外情況(Mockito
目前不支持原生測(cè)試),正式支持該工具。
Ahead-Of-Time(AOT)
編譯是將高級(jí)Java
代碼編譯成本地可執(zhí)行代碼的過(guò)程。通常由JVM
的即時(shí)編譯器JIT
在運(yùn)行時(shí)進(jìn)行編譯,這樣可以在執(zhí)行應(yīng)用程序時(shí)進(jìn)行觀察和優(yōu)化。在AOT
編譯的情況下,這一優(yōu)勢(shì)就不復(fù)存在了。
通常,在進(jìn)行AOT(Ahead-of-Time)
編譯之前,可以選擇進(jìn)行一個(gè)單獨(dú)的步驟,稱為AOT
處理,即從代碼中收集元數(shù)據(jù)并提供給AOT
編譯器。將這兩個(gè)步驟分開(kāi)是有意義的,因?yàn)?code>AOT處理可以是針對(duì)特定框架的,而AOT
編譯器更加通用。下面的圖片給出了一個(gè)概覽:
Java
平臺(tái)的另一個(gè)特點(diǎn)是,只需將JAR
放入類路徑,就能在目標(biāo)系統(tǒng)上進(jìn)行擴(kuò)展。通過(guò)啟動(dòng)時(shí)的反射和注解掃描,就能在應(yīng)用中獲得擴(kuò)展行為。不幸的是,這會(huì)減慢啟動(dòng)時(shí)間,而且不會(huì)帶來(lái)任何好處,尤其是對(duì)于云原生應(yīng)用,因?yàn)樵谠圃鷳?yīng)用中,服務(wù)器運(yùn)行時(shí)和Java
基類都打包到了JAR
中。因此,可以放棄這一功能,然后可以使用閉環(huán)優(yōu)化Closed World Optimization
來(lái)構(gòu)建應(yīng)用。
詳細(xì)信息參考:JIT即時(shí)編譯與AOT提前編譯; GraalVM :官網(wǎng)
六、Spring Native 基礎(chǔ)環(huán)境搭建
【1】必須安裝Docker
: 可以參考 Windows10 Docker Desktop安裝 ,同時(shí)注意要能夠以非root
用戶啟動(dòng)和運(yùn)行。可以通過(guò)使用docker run hello-world
(不包含sudo
)命令檢查Docker daemon
是否可用。
【2】快速創(chuàng)建一個(gè)SpringBoot
項(xiàng)目。
【3】添加Spring Native
依賴: 必須在項(xiàng)目中手動(dòng)加入和配置。對(duì)于AOT
處理,有一個(gè)單獨(dú)的Maven
和Gradle
插件,它并沒(méi)有合并到Spring Boot
插件中。org.springframework.experimental:spring-native
提供了native
配置的API
,例如@NativeHint
這些Spring
運(yùn)行成native image
的注解類。
<dependency> <groupId>org.springframework.experimental</groupId> <artifactId>spring-native</artifactId> <version>0.9.1</version> </dependency>
【4】添加Spring AOT
插件: Spring AOT
插件執(zhí)行代碼的提前轉(zhuǎn)換,有助于改善原生鏡像的占用空間和修復(fù)native image
的兼容性。
<plugin> <groupId>org.springframework.experimental</groupId> <artifactId>spring-aot-maven-plugin</artifactId> <version>0.9.1</version> <executions> <execution> <id>test-generate</id> <goals> <goal>test-generate</goal> </goals> </execution> <execution> <id>generate</id> <goals> <goal>generate</goal> </goals> </execution> </executions> </plugin>
【5】開(kāi)啟native image
支持: Spring Boot
的Spring Boot Buildpacks support
可以將Spring Boot
應(yīng)用程序打包成一個(gè)容器。native image buildpack
可以通過(guò)BP_NATIVE_IMAGE
環(huán)境變量開(kāi)啟。
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <image> <builder>paketobuildpacks/builder:tiny</builder> <env> <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE> </env> </image> </configuration> </plugin>
【6】構(gòu)建本地應(yīng)用程序: 通過(guò)此命令,可以創(chuàng)建一個(gè)使用GraalVM native image compiler
構(gòu)建的Linux
容器,默認(rèn)情況下,這個(gè)鏡像是在本地。
mvn spring-boot:build-image
【7】原生鏡像構(gòu)建: 該Profile
將在打包階段調(diào)用構(gòu)建中的native-image
編譯器。通過(guò)在Maven package
命令中提供native Profile
,就可以構(gòu)建原生鏡像了:mvn clean package -Pnative
<profiles> <profile> <id>native</id> <build> <plugins> <plugin> <groupId>org.graalvm.buildtools</groupId> <artifactId>native-maven-plugin</artifactId> <version>0.9.17</version> <executions> <execution> <id>build-native</id> <goals> <goal>build</goal> </goals> <phase>package</phase> </execution> </executions> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> </configuration> </plugin> </plugins> </build> </profile> </profiles>
到此這篇關(guān)于Spring Native 解放 JVM的文章就介紹到這了,更多相關(guān)Spring Native 解放 JVM內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用SpringBoot代碼詳細(xì)解釋<List>的用法
List是Java集合框架中的一種數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)一組有序的元素,使用List可以方便地向其中添加、刪除或者修改元素,也可以通過(guò)下標(biāo)或者迭代器遍歷其中的元素,這篇文章主要介紹了用SpringBoot代碼詳細(xì)解釋<List>的用法,需要的朋友可以參考下2023-09-09利用Java實(shí)現(xiàn)在線圖片URL轉(zhuǎn)換為Base64以及反向解析成圖片
Base64 是一種將二進(jìn)制數(shù)據(jù)編碼為 ASCII 字符串格式的方法,常用于在網(wǎng)絡(luò)中安全傳輸圖片、文件等內(nèi)容,本文給大家介紹了如何利用Java實(shí)現(xiàn)在線圖片URL轉(zhuǎn)換為Base64以及反向解析成圖片,文章有相關(guān)的代碼和圖文供大家參考,需要的朋友可以參考下2025-03-03SpringBoot this調(diào)用@Bean效果詳解
這篇文章主要介紹了在一個(gè)@Bean方法內(nèi),this調(diào)用同一個(gè)類的@Bean方法會(huì)有什么效果,我們可以通過(guò)bean的名稱、bean的類型或者bean的名稱+類型來(lái)獲取容器中的bean2023-02-02SpringBoot中application.yml基本配置解讀
文章主要介紹了Spring Boot項(xiàng)目中`application.properties`和`application.yml`配置文件的使用方法和區(qū)別,包括優(yōu)先級(jí)、配置文件所在目錄、端口服務(wù)配置、數(shù)據(jù)庫(kù)配置、多profile配置以及靜態(tài)資源路徑的指定2024-12-12Reactive Programming入門(mén)概念詳解
這篇文章主要為大家介紹了Reactive Programming入門(mén)概念詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Idea?springboot?springCloud熱加載熱調(diào)試兩種常用方式
這篇文章主要介紹了Idea?springboot?springCloud熱加載熱調(diào)試常用的兩種方式,在項(xiàng)目開(kāi)發(fā)的過(guò)程中,需要修改調(diào)試的時(shí)候偶每次都需要重啟項(xiàng)目浪費(fèi)時(shí)間,下面是我整理的兩種常用的兩種方式,需要的朋友可以參考下2023-04-04Spring Aop組成部分及實(shí)現(xiàn)步驟
面向切面編程,是對(duì)面向?qū)ο缶幊痰囊环N補(bǔ)充,是一種編程思想,是對(duì)某一類的事情的集中處理,這篇文章主要介紹了Spring Aop組成部分及實(shí)現(xiàn)步驟,需要的朋友可以參考下2023-08-08詳談ServiceLoader實(shí)現(xiàn)原理
下面小編就為大家?guī)?lái)一篇詳談ServiceLoader實(shí)現(xiàn)原理。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02