用Spring Native將SpringBoot程序轉(zhuǎn)換為GraalVM
Spring發(fā)布了一個新工具Spring Native Beta,用于將現(xiàn)有的Spring Boot應(yīng)用程序(用Java或Kotlin編寫)轉(zhuǎn)換為GraalVM本機映像。目標(biāo)是在springnative上支持Spring Boot應(yīng)用程序。GraalVM本機映像很小,經(jīng)過優(yōu)化,啟動速度很快。然而,與JVM相比,折衷的辦法是構(gòu)建時間更長,運行時優(yōu)化更少。
Spring Native與GraalVM團(tuán)隊合作,充當(dāng)橋梁,確保GraalVM理解傳統(tǒng)的SpringBoot代碼。Oracle實驗室的高級研究經(jīng)理Vojin Jovanovic在談到他們與Spring的合作時說:
與Spring團(tuán)隊合作構(gòu)建本機JVM生態(tài)系統(tǒng)是一件非常愉快的事情:他們深厚的技術(shù)知識和對社區(qū)敏感的觸覺總能帶來最好的解決方案。最新的Spring本機版本及其在JVM生態(tài)系統(tǒng)中的大量使用為本機編譯的廣泛采用鋪平了道路。
在后臺,Maven和Gradle提供的提前(AOT)插件用于將Spring引導(dǎo)應(yīng)用程序轉(zhuǎn)換為本機代碼。這些插件為GraalVM不支持的所有Spring元素(如反射和代理)生成GraalVM本機配置。生成的配置存儲在reflect-config.json 文件。例如,用@Service注釋的每個類都在JSON文件中配置。
假設(shè)Spring本機配置文件位于META-INF/Native-image文件夾中,則可以發(fā)現(xiàn)它們。本機提示可用于配置SpringNative尚不支持的元素,例如MySQL驅(qū)動程序配置。
創(chuàng)建新項目時,Spring Initializer中提供了Spring本機依賴項。
一些依賴項,比如springdatajpa,需要額外的配置來支持GraalVM。Spring團(tuán)隊通過插件提供這些額外的配置。例如,在Intitializr中添加了Spring數(shù)據(jù)JPA依賴項之后,兩個額外的Maven插件Spring aot Maven plugin和hibernate enhance Maven plugin(包括它們的配置)被添加到pom.xml文件。
此時并非所有依賴項都受Spring Native支持。如果initializer生成的Spring項目中包含不支持的依賴項,則HELP.md 文件將列出它。
與任何其他Spring Boot應(yīng)用程序一樣,Initializer會自動創(chuàng)建適當(dāng)?shù)娜肟邳c類來運行應(yīng)用程序:
@SpringBootApplicationpublic class NativeApplication {public static void main(String[] args) {SpringApplication.run(NativeApplication.class, args);}}
接下來,提供一個REST controller來測試應(yīng)用程序:
@Controllerpublic class NativeEndpoint { @GetMapping('/native') public String nativeCall() {return 'Native'; }}
除了標(biāo)準(zhǔn)的SpringBoot依賴項之外,Initializer還為SpringNative支持添加了一個新的依賴項:
<dependency><groupId>org.springframework.experimental</groupId><artifactId>spring-native</artifactId><version>${spring-native.version}</version></dependency>
spring boot maven插件接收了一些額外的配置來生成本機映像:
<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>
Maven可用于通過提前編譯生成本機映像。生成的可執(zhí)行文件包括所有必要的類和來自JDK的靜態(tài)鏈接本機代碼。底層VM被用作運行時系統(tǒng),而不是普通的javavm。
$ ./mvnw spring-boot:build-image
在編譯和優(yōu)化代碼時,構(gòu)建映像需要一些時間。此步驟在Docker映像中執(zhí)行,需要相當(dāng)多的內(nèi)存。如果發(fā)生以下錯誤,應(yīng)增加Docker的內(nèi)存設(shè)置:
Exception in thread 'native-image pid watcher' java.lang.OutOfMemoryError: GC overhead limit exceeded
執(zhí)行上述Maven命令的輸出顯示了結(jié)果Docker映像,其中包含GraalVM本機映像:
Successfully built image ’docker.io/library/native:0.0.1-SNAPSHOT’
生成的映像約為82 MB,包含運行應(yīng)用程序的所有內(nèi)容:
$ docker imagesnative 0.0.1-SNAPSHOT ... 81.9MB
Docker容器在端口8080上啟動:
$ docker run -p 8080:8080 native:0.0.1-SNAPSHOT
啟動容器后,應(yīng)用程序幾乎可以立即進(jìn)行測試:
$ curl localhost:8080/native --silentNative
以上就是用Spring Native將SpringBoot程序轉(zhuǎn)換為GraalVM的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot程序轉(zhuǎn)換為GraalVM的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
