Spring官方推出了Spring Native,使用GraalVM將Spring應用編譯成本地可執行的文件,這樣就能提供一種新的方式來部署Spring 應用。這些原生的Spring應用可以作為一個獨立的可執行文件進行部署,不再需要依賴JRE環境,並且還能提供一些有趣的特征,比如幾乎瞬時的啟動(一般會小於100毫秒)、瞬時的峰值性能以及更低的資源消耗,但代價是比JVM 更長的構建時間和更少的運行時優化。Spring Native支持Java和Kotlin。
有兩種方式構建Spring Native應用
方式一:使用Spring Boot Buildpacks support生成包含本地可執行文件的輕量級容器。
方式二:使用GraalVM native image Maven plugin support生成本機可執行文件。
一、方式一:Buildpacks方式
1.先決條件
安裝docker,並配置允許非root用戶使用
2.Sample工程
代碼來源:RESTful Web Service getting started guide
另外,需要注意的是版本問題:Spring Native 0.9.2僅支持Spring Boot 2.4.5
1.引入Springboot父坐標
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/>
</parent>
2.添加Spring Native依賴
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-native</artifactId>
<version>0.9.2</version>
</dependency>
</dependencies>
3.添加Spring AOT插件
<build>
<plugins>
<!-- ... -->
<plugin>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-aot-maven-plugin</artifactId>
<version>0.9.2</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>
然后,需要對IDE進行設置。在IDEA右側maven欄中展開Plugins,在spring-aot插件下的spring-aot:generate上右鍵,選擇Execute after Build。
4.啟用native image支持
<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>
5.倉庫設置
需要添加spring-native依賴的倉庫,和Spring AOT插件的倉庫
<repositories>
<!-- ... -->
<repository>
<id>spring-release</id>
<name>Spring release</name>
<url>https://repo.spring.io/release</url>
</repository>
</repositories>
<pluginRepositories>
<!-- ... -->
<pluginRepository>
<id>spring-release</id>
<name>Spring release</name>
<url>https://repo.spring.io/release</url>
</pluginRepository>
</pluginRepositories>
3.build
mvn spring-boot:build-image
4.運行
docker run --rm -p 8080:8080 rest-service:0.0.1-SNAPSHOT
啟動時間應該會小於100ms,而在jvm上的應用啟動時間大約1500ms。
訪問localhost:8080/greeting, 就會看到以下內容
{"id":1,"content":"Hello, World!"}
二、方式二:使用native-image-maven-plugin插件
1.先決條件
在安裝GraalVM本機鏡像編譯器之前,需要滿足許多先決條件。然后,需要在本機安裝本地鏡像編譯器。
MacOS/Linux平台,安裝本地鏡像編譯器,推薦使用SDKMAN.
-
安裝SDKMAN:
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk version -
安裝GraalVM:
sdk install java 21.0.0.2.r8-grl (java8)
sdk install java 21.0.0.2.r11-grl (java11) -
確保使用的是新安裝的JDK:
sdk use java 21.0.0.2.r8-grl (java8)
sdk use java 21.0.0.2.r11-grl (java11) -
將本地鏡像擴展引入到JDK
gu install native-image
Windows平台,可以手動安裝GraalVM builds
- 下載GraalVM 21.0.0.2.
- 設置JAVA_HOME和PATH環境變量
- 將本地鏡像擴展引入JDK
gu install native-image
2.Sample工程
同樣使用前面的例子。
1.引入Springboot父坐標
同方式一
2.添加Spring Native依賴
同方式一
3.添加Spring AOT插件
同方式一
4.啟用native image支持
<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>com.example.restservice.RestServiceApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>native-image</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
5.倉庫設置
同方式一
3.build
mvn -Pnative-image package
4.運行
target/com.example.restservice.restserviceapplication
啟動時間應該會小於100ms,而在jvm上的應用啟動時間大約1500ms。
訪問localhost:8080/greeting, 就會看到以下內容
{"id":1,"content":"Hello, World!"}