GraalVM和Spring Native嘗鮮一步步讓Springboot啟動(dòng)飛起來(lái)66ms完成啟動(dòng)
簡(jiǎn)介
GraalVM
是高性能的JDK,支持Java/Python/JavaScript等語(yǔ)言。它可以讓Java變成二進(jìn)制文件來(lái)執(zhí)行,讓程序在任何地方運(yùn)行更快。這或許是Java與Go的一場(chǎng)戰(zhàn)爭(zhēng)?
下載安裝GraalVM
安裝GraalVM
首先到官網(wǎng)下載,我是直接到GitHub Release Page下載的,請(qǐng)下載對(duì)應(yīng)的系統(tǒng)包,我下載如下:
graalvm-ce-java11-darwin-amd64-22.3.0.tar.gz
下載后解壓到某個(gè)目錄,我的如下:
/Users/larry/Software/graalvm-ce-java11-22.3.0
接著測(cè)試對(duì)應(yīng)的程序是否可以正常執(zhí)行,如java --version
。在Mac上會(huì)報(bào)錯(cuò)如下:
is damaged and can’t be opened.
所以需要執(zhí)行下面語(yǔ)句:
$ sudo xattr -r -d com.apple.quarantine /Users/larry/Software/graalvm-ce-java11-22.3.0
注意修改對(duì)應(yīng)的目錄。
然后就可以執(zhí)行了:
$ ./java --version openjdk 11.0.17 2022-10-18 OpenJDK Runtime Environment GraalVM CE 22.3.0 (build 11.0.17+8-jvmci-22.3-b08) OpenJDK 64-Bit Server VM GraalVM CE 22.3.0 (build 11.0.17+8-jvmci-22.3-b08, mixed mode, sharing)
安裝native-image
這個(gè)工具用來(lái)把Java程序轉(zhuǎn)化為本地二進(jìn)制包,安裝如下:
$ ./gu install native-image Downloading: Component catalog from www.graalvm.org Processing Component: Native Image Downloading: Component native-image: Native Image from github.com Installing new component: Native Image (org.graalvm.native-image, version 22.3.0)
配置環(huán)境
配置環(huán)境變量
因?yàn)檫@個(gè)GraalVM還不夠成熟,我不想一直使用,就通過一個(gè)命令來(lái)切換,配置如下:
export GraalVM_HOME=/Users/larry/Software/graalvm-ce-java11-22.3.0/Contents/Home alias switchOnGraalVM='export PATH=$GraalVM_HOME:$PATH' alias switchOnGraalVMJavaHome='export JAVA_HOME=/Users/larry/Software/graalvm-ce-java11-22.3.0/Contents/Home' alias switchOffGraalVM='export PATH=`echo $PATH | tr ":" "\n" | grep -v "graalvm" | tr "\n" ":"`' alias switchOffGraalVMJavaHome='export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_212.jdk/Contents/Home'
配置IDEA
可以在IDEA上配置對(duì)應(yīng)的JDK,這樣開發(fā)的時(shí)候可以使用:
整合Spring Native與Spring Boot
普通Spring Boot程序
新來(lái)創(chuàng)建一個(gè)普通的Spring Boot Web程序,主要Java代碼如下:
@SpringBootApplication @RestController @RequestMapping("/") public class SpringbootNativeGraalVMMain { public static void main(String[] args) { SpringApplication.run(SpringbootNativeGraalVMMain.class, args); } @GetMapping("/hi-graalvm") public String hi() { return "This message is from Spring Boot built/run by GraalVM/Spring Native"; } }
啟動(dòng)時(shí)長(zhǎng)為1.193秒,還不錯(cuò)。我電腦還不錯(cuò)。
整合Spring Native
添加依賴:
<dependency> <groupId>org.springframework.experimental</groupId> <artifactId>spring-native</artifactId> <version>${spring-native.version}</version> </dependency>
添加插件,這個(gè)插件非常重要,不然會(huì)有各種錯(cuò)誤:
<build> <plugins> <plugin> <groupId>org.springframework.experimental</groupId> <artifactId>spring-aot-maven-plugin</artifactId> <version>0.11.5</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>
添加以下插件來(lái)打包生成可執(zhí)行程序:
<profiles> <profile> <id>native</id> <properties> <repackage.classifier>exec</repackage.classifier> <native-buildtools.version>0.9.11</native-buildtools.version> </properties> <dependencies> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-launcher</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.graalvm.buildtools</groupId> <artifactId>native-maven-plugin</artifactId> <version>${native-buildtools.version}</version> <extensions>true</extensions> <executions> <execution> <id>test-native</id> <phase>test</phase> <goals> <goal>test</goal> </goals> </execution> <execution> <id>build-native</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
然后通過以下命令來(lái)build包,時(shí)間會(huì)長(zhǎng)很多,因?yàn)橐D(zhuǎn)化為二進(jìn)制可執(zhí)行文件:
$ mvn clean package -Pnative
兩分多鐘后完成,生成了一個(gè)可執(zhí)行文件,執(zhí)行如下:
$ target/spring-boot-native-graalvm
結(jié)果只花了0.066秒,即66毫秒就可以了,這也太快了吧。
訪問接口也是正常的:
用Docker啟動(dòng)
先啟動(dòng)本地的Docker,然后添加依賴如下:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>${repackage.classifier}</classifier> <image> <builder>paketobuildpacks/builder:tiny</builder> <env> <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE> </env> </image> </configuration> </plugin>
通過以下命令打出Docker鏡像:
mvn spring-boot:build-image
可能會(huì)花費(fèi)很長(zhǎng)時(shí)間,需要下載一些工具與鏡像。
打包成功后,多了鏡像:
$ docker images | grep graalvm spring-boot-native-graalvm 1.0-SNAPSHOT d2c8d5c52a3c 42 years ago 85.8MB
啟動(dòng)如下:
$ docker run --rm spring-boot-native-graalvm:1.0-SNAPSHOT -p 8080:8080
啟動(dòng)時(shí)間為59ms,更短了。
注意
- 直接通過
native-image
命令來(lái)將jar包轉(zhuǎn)化為可執(zhí)行文件,如遇到各種問題,勸大家放棄嘗試,這也是Spring Native
存在的價(jià)值。別問我為什么知道,哈哈~~ - 要注意切換對(duì)應(yīng)的Java程序和Java Home,不然build包會(huì)報(bào)錯(cuò)。
- 看Spring Native的包名是experimental的,離生產(chǎn)應(yīng)該還有距離,不要輕易在生產(chǎn)上用。
代碼
代碼請(qǐng)看GitHub: https://github.com/LarryDpk/pkslow-samples
到此這篇關(guān)于GraalVM和Spring Native嘗鮮一步步讓Springboot啟動(dòng)飛起來(lái)66ms完成啟動(dòng)的文章就介紹到這了,更多相關(guān)GraalVM和Spring Native內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java深入講解instanceof關(guān)鍵字的使用
instanceof 是 Java 的一個(gè)二元操作符,類似于 ==,>,< 等操作符。instanceof 是 Java 的保留關(guān)鍵字。它的作用是測(cè)試它左邊的對(duì)象是否是它右邊的類的實(shí)例,返回 boolean 的數(shù)據(jù)類型2022-05-05Java利用Request請(qǐng)求如何獲取IP地址對(duì)應(yīng)的省份、城市詳解
之前已經(jīng)給大家介紹了關(guān)于Java用Request請(qǐng)求獲取IP地址的相關(guān)內(nèi)容,那么下面這篇文章將給大家進(jìn)入深入的介紹,關(guān)于Java利用Request請(qǐng)求如何獲取IP地址對(duì)應(yīng)省份、城市的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-10-10public?static?void?main(String[]?args)使用解讀
這篇文章主要介紹了public?static?void?main(String[]?args)的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01SpringBoot整合定時(shí)任務(wù)之實(shí)現(xiàn)Scheduled注解的過程(一個(gè)注解全解決)
這篇文章主要介紹了SpringBoot整合定時(shí)任務(wù)之實(shí)現(xiàn)Scheduled注解的過程(一個(gè)注解全解決),本文通過使用場(chǎng)景分析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09Java調(diào)用dll文件的實(shí)現(xiàn)解析
這篇文章主要介紹了Java調(diào)用dll文件的實(shí)現(xiàn)解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02