@[toc]
Spring Native 的 Hello World
Spring Native 的 Hello World
构建 Spring Boot native 应用程序有 2 种方式:
- 使用 Spring Boot Buildpacks support 构建一个包含本地可执行文件的轻量级容器。
- 使用 the GraalVM native image Maven plugin support 构建一个本地可执行文件。
本文只介绍第一种。
系统要求
在待构建的机器上,必须安装了 Docker,可以参考 Get Docker,同时注意要能够以非 root 用户启动和运行。
可以通过使用 docker run hello-world (不包含sudo)命令检查 Docker daemon 是否可用。
示例代码
一个简单的 Spring Boot Web 程序:
git clone https://github.com/spring-guides/gs-rest-service
cd gs-rest-service/complete
配置 Spring Boot 版本
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.4</version>
<relativePath/>
</parent>
添加 Spring Native 依赖
org.springframework.experimental:spring-native
提供了 native 配置的 API,例如 @NativeHint 这些 Spring 运行成 native image 的注解类。
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-native</artifactId>
<version>0.9.1</version>
</dependency>
</dependencies>
添加 Spring AOT 插件
Spring AOT 插件执行代码的提前转换,用以修复 native image 的兼容性。
<build>
<plugins>
<!-- ... -->
<plugin>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-aot-maven-plugin</artifactId>
<version>0.9.1</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>
开启 native image 支持
Spring Boot 的 Spring Boot Buildpacks support 可以将 Spring Boot 应用程序打包成一个容器。native image buildpack 可以通过 BP_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>
Maven Repository
<repositories>
<!-- ... -->
<repository>
<id>spring-release</id>
<name>Spring release</name>
<url>https://repo.spring.io/release</url>
</repository>
</repositories>
构建本地应用程序
mvn spring-boot:build-image
通过此命令,可以创建一个使用 GraalVM native image compiler 构建的 Linux 容器,默认情况下,这个镜像是在本地。
运行本地应用
docker run --rm -p 8080:8080 rest-service:0.0.1-SNAPSHOT
现在服务已经启动了,可以通过 localhost:8080/greeting 访问服务。在浏览器中可以看到
{
"id":1,"content":"Hello, World!"}