您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“spring-native的介紹及應(yīng)用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“spring-native的介紹及應(yīng)用”吧!
<謹(jǐn)供參考>
官方介紹
Spring Native提供了使用GraalVM 本機(jī)圖像編譯器將Spring應(yīng)用程序編譯為本機(jī)可執(zhí)行文件的支持。 與Java虛擬機(jī)相比,本機(jī)映像可以為許多類型的工作負(fù)載提供更便宜,更可持續(xù)的托管。這些包括微服務(wù),功能工作負(fù)載,非常適合容器和Kubernetes 使用本機(jī)映像具有關(guān)鍵優(yōu)勢(shì),例如即時(shí)啟動(dòng),即時(shí)峰值性能和減少的內(nèi)存消耗。 GraalVM本機(jī)項(xiàng)目希望隨著時(shí)間的推移會(huì)改善一些缺點(diǎn)和折衷方案。構(gòu)建本機(jī)映像是一個(gè)繁重的過程,比常規(guī)應(yīng)用程序要慢。預(yù)熱后,本機(jī)映像具有較少的運(yùn)行時(shí)優(yōu)化。最后,它比具有某些不同行為的JVM還不成熟。 常規(guī)JVM和此本機(jī)映像平臺(tái)之間的主要區(qū)別是: - 在構(gòu)建時(shí)將未使用的零件刪除。 - 反射,資源和動(dòng)態(tài)代理需要配置。 - 類路徑在構(gòu)建時(shí)是固定的。 - 沒有類延遲加載:可執(zhí)行文件中附帶的所有內(nèi)容都將在啟動(dòng)時(shí)加載到內(nèi)存中。 - 一些代碼將在構(gòu)建時(shí)運(yùn)行。 - 圍繞Java應(yīng)用程序的某些方面存在一些局限性,這些局限性未得到完全支持。
簡(jiǎn)單來說,就是更快.更短,更小
更快的啟動(dòng)速度
更短的響應(yīng)時(shí)間
更小的內(nèi)存消耗
十分適用于目前互聯(lián)網(wǎng)環(huán)境的快捷開發(fā)和微服務(wù)架構(gòu)的項(xiàng)目
而Spring Native的基礎(chǔ)則是Graalvm,一個(gè)由oracle開發(fā)維護(hù)的多語言編譯/運(yùn)行時(shí)平臺(tái). 它的官方說法是高性能JDK發(fā)行版
,目前已支持到7種語言,包括不僅限于java.ruby.node等 基于graalvm開發(fā)的java框架還有一個(gè)國(guó)內(nèi)目前還不算太火的Quarkus,在一些油管up的測(cè)評(píng)視頻中,證明quarkus(1.13)要比spring native(0.7x)更快更小,我也寫了quarkus快一年了,即使拋棄graalvm本身,也確實(shí)比springboot要更快,更短
我用的是0.92,僅支持springboot2.4.5 還有,機(jī)器的內(nèi)存最好備到8個(gè)G,因?yàn)槲覝y(cè)試時(shí)候memory in use一度飆升到5個(gè)多G,這可能也是graalvm為了更快產(chǎn)生的代價(jià)把
pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>org.xiaowu</groupId> <artifactId>behappy-springboot</artifactId> <version>0.0.1-SNAPSHOT</version> <name>behappy-springboot</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-native.version>0.9.2</spring-native.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.experimental</groupId> <artifactId>spring-native</artifactId> <version>${spring-native.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> <image> <builder>paketobuildpacks/builder:tiny</builder> <env> <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE> </env> </image> </configuration> </plugin> <plugin> <groupId>org.springframework.experimental</groupId> <artifactId>spring-aot-maven-plugin</artifactId> <version>${spring-native.version}</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> </plugins> </build> <profiles> <profile> <id>native-image</id> <build> <plugins> <plugin> <groupId>org.graalvm.nativeimage</groupId> <artifactId>native-image-maven-plugin</artifactId> <version>21.0.0.2</version> <configuration> <!-- The native image build needs to know the entry point to your application --> <mainClass>org.xiaowu.behappy.BehappySpringbootApplication</mainClass> <!--https://blog.csdn.net/u013794093/article/details/100094871?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.baidujs&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.baidujs--> <buildArgs> <!--https://blog.csdn.net/thomasyuang/article/details/84318184--> <arg>--static</arg><!--解決standard_init_linux.go:178: exec user process caused "no such file or directory"--> <!--<arg>libc=musl</arg>gcc編譯過程中會(huì)有些許問題,這個(gè)參數(shù)僅jdk11支持--> </buildArgs> </configuration> <executions> <execution> <goals> <goal>native-image</goal> </goals> <phase>package</phase> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> <repositories> <repository> <id>spring-releases</id> <name>Spring Releases</name> <url>https://repo.spring.io/release</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-releases</id> <name>Spring Releases</name> <url>https://repo.spring.io/release</url> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> </project>
測(cè)試Controller
/** * 小五 */ [@RestController](https://my.oschina.net/u/4486326) public class TestController { @GetMapping("/") public String test() { return "TestController"; } }
linux環(huán)境下安裝各種環(huán)境(windows需要安裝各種c的運(yùn)行庫,安完還是缺...linux和mac要好很多)
graalvm
使用SDKMan安裝適當(dāng)?shù)腟DK和GraalVM插件,SDKMan是Java SDK管理工具,可讓輕松安裝和配置GraalVM所需的依賴項(xiàng)(截至當(dāng)日,支持8和11) curl -s "https://get.sdkman.io" | bash sdk install java 21.0.0.r8-grl sdk use java 21.0.0.r8-grl gu install native-image
gcc,unzip,zip,glibc-static,zlib
yum install -y glibc-static zlib zlib-devel zip unzip sudo yum group install "Development Tools" 該命令安裝了一堆新的軟件包,包括gcc,g++和make。 gcc --version
然后spring native提供了兩種構(gòu)建方式
將Spring Native應(yīng)用程序構(gòu)建到Docker映像中
運(yùn)行以下命令以構(gòu)建Docker映像文件,并將編譯后的代碼包裝在構(gòu)建包中。 mvn spring-boot:build-image 使用Docker運(yùn)行映像: docker run -p 8080:8080 docker.io/xxx
將Spring Native應(yīng)用程序構(gòu)建到可執(zhí)行文件中
運(yùn)行以下命令編譯Spring Boot應(yīng)用程序的本機(jī)二進(jìn)制可執(zhí)行文件: mvn clean -Pnative-image package 通過運(yùn)行以下命令來執(zhí)行本機(jī)應(yīng)用程序: target/spring-native-example
這里我用是第二種方式
速度可以說是相當(dāng)快了 接下來給他做成docker容器再看下
FROM scratch COPY target/org.xiaowu.behappy.behappyspringbootapplication /app ENTRYPOINT ["/app"] docker build -f Dockerfile -t behappy:1.0 . docker run -p 8080:8080 --name springnative -d behappy:1.0
再貼兩張youtube上某up做的對(duì)比圖
項(xiàng)目?jī)H加了一個(gè)webflux 前者是native的,后者是非native的, 可以看到size是有明顯縮小的
上圖的啟動(dòng)時(shí)間是3秒 下圖可以看到0.1秒多,spring native官方介紹過,正常的一般啟動(dòng)都不會(huì)超過100毫秒,可以看出啟動(dòng)時(shí)間上的差距是巨大的 右面是兩者的cpu消耗,io占用等信息,也能看出兩者有著明顯的差距
到此,相信大家對(duì)“spring-native的介紹及應(yīng)用”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。