Spring Native橫空出世了


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!"}

參考:Spring Native documentation


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM