溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么用Spring Native將SpringBoot程序轉(zhuǎn)換為GraalVM

發(fā)布時(shí)間:2021-04-27 12:33:02 來(lái)源:億速云 閱讀:647 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹了怎么用Spring Native將SpringBoot程序轉(zhuǎn)換為GraalVM,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

Spring發(fā)布了一個(gè)新工具Spring Native Beta,用于將現(xiàn)有的Spring Boot應(yīng)用程序(用Java或Kotlin編寫(xiě))轉(zhuǎn)換為GraalVM本機(jī)映像。目標(biāo)是在springnative上支持Spring Boot應(yīng)用程序。GraalVM本機(jī)映像很小,經(jīng)過(guò)優(yōu)化,啟動(dòng)速度很快。然而,與JVM相比,折衷的辦法是構(gòu)建時(shí)間更長(zhǎng),運(yùn)行時(shí)優(yōu)化更少。

Spring Native與GraalVM團(tuán)隊(duì)合作,充當(dāng)橋梁,確保GraalVM理解傳統(tǒng)的SpringBoot代碼。Oracle實(shí)驗(yàn)室的高級(jí)研究經(jīng)理Vojin Jovanovic在談到他們與Spring的合作時(shí)說(shuō):

與Spring團(tuán)隊(duì)合作構(gòu)建本機(jī)JVM生態(tài)系統(tǒng)是一件非常愉快的事情:他們深厚的技術(shù)知識(shí)和對(duì)社區(qū)敏感的觸覺(jué)總能帶來(lái)最好的解決方案。最新的Spring本機(jī)版本及其在JVM生態(tài)系統(tǒng)中的大量使用為本機(jī)編譯的廣泛采用鋪平了道路。

在后臺(tái),Maven和Gradle提供的提前(AOT)插件用于將Spring引導(dǎo)應(yīng)用程序轉(zhuǎn)換為本機(jī)代碼。這些插件為GraalVM不支持的所有Spring元素(如反射和代理)生成GraalVM本機(jī)配置。生成的配置存儲(chǔ)在reflect-config.json 文件。例如,用@Service注釋的每個(gè)類都在JSON文件中配置。

假設(shè)Spring本機(jī)配置文件位于META-INF/Native-image文件夾中,則可以發(fā)現(xiàn)它們。本機(jī)提示可用于配置SpringNative尚不支持的元素,例如MySQL驅(qū)動(dòng)程序配置。

創(chuàng)建新項(xiàng)目時(shí),Spring Initializer中提供了Spring本機(jī)依賴項(xiàng)。

怎么用Spring Native將SpringBoot程序轉(zhuǎn)換為GraalVM

一些依賴項(xiàng),比如springdatajpa,需要額外的配置來(lái)支持GraalVM。Spring團(tuán)隊(duì)通過(guò)插件提供這些額外的配置。例如,在Intitializr中添加了Spring數(shù)據(jù)JPA依賴項(xiàng)之后,兩個(gè)額外的Maven插件Spring aot Maven plugin和hibernate enhance Maven plugin(包括它們的配置)被添加到pom.xml文件。

此時(shí)并非所有依賴項(xiàng)都受Spring Native支持。如果initializer生成的Spring項(xiàng)目中包含不支持的依賴項(xiàng),則HELP.md 文件將列出它。

怎么用Spring Native將SpringBoot程序轉(zhuǎn)換為GraalVM

與任何其他Spring Boot應(yīng)用程序一樣,Initializer會(huì)自動(dòng)創(chuàng)建適當(dāng)?shù)娜肟邳c(diǎn)類來(lái)運(yùn)行應(yīng)用程序:

@SpringBootApplication
public class NativeApplication {

	public static void main(String[] args) {
		SpringApplication.run(NativeApplication.class, args);
	}
}

接下來(lái),提供一個(gè)REST controller來(lái)測(cè)試應(yīng)用程序:

@Controller
public class NativeEndpoint {

    @GetMapping("/native")
    public String nativeCall() {
        return "Native";
    }
}

除了標(biāo)準(zhǔn)的SpringBoot依賴項(xiàng)之外,Initializer還為SpringNative支持添加了一個(gè)新的依賴項(xiàng):

<dependency>
	<groupId>org.springframework.experimental</groupId>
	<artifactId>spring-native</artifactId>
	<version>${spring-native.version}</version>
</dependency>

spring boot maven插件接收了一些額外的配置來(lái)生成本機(jī)映像:

<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可用于通過(guò)提前編譯生成本機(jī)映像。生成的可執(zhí)行文件包括所有必要的類和來(lái)自JDK的靜態(tài)鏈接本機(jī)代碼。底層VM被用作運(yùn)行時(shí)系統(tǒng),而不是普通的javavm。

$ ./mvnw spring-boot:build-image

在編譯和優(yōu)化代碼時(shí),構(gòu)建映像需要一些時(shí)間。此步驟在Docker映像中執(zhí)行,需要相當(dāng)多的內(nèi)存。如果發(fā)生以下錯(cuò)誤,應(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本機(jī)映像:

Successfully built image 'docker.io/library/native:0.0.1-SNAPSHOT'

生成的映像約為82 MB,包含運(yùn)行應(yīng)用程序的所有內(nèi)容:

$ docker images
native  0.0.1-SNAPSHOT ... 81.9MB

Docker容器在端口8080上啟動(dòng):

$ docker run -p 8080:8080 native:0.0.1-SNAPSHOT

啟動(dòng)容器后,應(yīng)用程序幾乎可以立即進(jìn)行測(cè)試:

$ curl localhost:8080/native --silent
Native

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“怎么用Spring Native將SpringBoot程序轉(zhuǎn)換為GraalVM”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI