1. 概述
随着微服务架构的流行,庞大的单体应用正逐渐成为历史。Java 也在积极适应现代需求,例如 Oracle、Red Hat、BellSoft 等公司正在共同开发 GraalVM 项目。一年前,专为微服务设计的 Quarkus 框架也正式发布。在 Spring Boot 生态中,VMware 已经投入两年时间开发 Spring Native 项目。
得益于 VMware 与 BellSoft 的合作,Spring Native 已成为端到端的原生镜像解决方案,其中包含基于 GraalVM 源码的 Liberica Native Image Kit 工具。通过 Spring Native 和 Liberica NIK,开发者可以构建 Spring Boot 应用的原生可执行文件,显著优化资源消耗并缩短启动时间。
本教程将通过三种方式构建并运行同一个应用(经典 JAR 包、使用 Liberica JDK 和 Spring Native 的原生镜像容器、使用 Liberica NIK 的原生镜像),对比它们的启动速度。我们将以 Spring Native 项目中的 petclinic JDBC 应用为例进行演示。
2. 安装 Liberica JDK
首先需要为系统安装 Java 运行时。访问 Liberica JDK 下载页,选择适合平台的版本。这里我们使用 JDK 11 的 x86 Linux Standard JDK 包。
安装 Liberica JDK 有两种方式:
- 通过包管理器安装
- 下载 *.tar.gz 包(Windows 用户下载 *.zip 包)
后者虽然稍复杂,但只需四步即可完成:
进入目标安装目录:
cd directory_path_name
下载安装包(若无
wget
命令,可通过brew install wget
安装):wget https://download.bell-sw.com/java/11.0.14.1+1/bellsoft-jdk11.0.14.1+1-linux-amd64.tar.gz
解压到当前目录:
tar -zxvf bellsoft-jdk11.0.14.1+1-linux-amd64.tar.gz
设置
JAVA_HOME
环境变量:export JAVA_HOME=$(pwd)/jdk-11.0.14.1
注意:macOS 和 Windows 用户可参考 Liberica JDK 安装指南。
3. 获取 Spring Native 项目
通过以下命令克隆包含 petclinic 示例的 Spring Native 项目:
git clone https://github.com/spring-projects-experimental/spring-native.git
4. 构建 JAR 文件
进入 petclinic JDBC 示例目录:
export PROJECT_DIR=$(pwd)/spring-native/samples/petclinic-jdbc && cd $PROJECT_DIR
执行构建命令生成 JAR 包:
./mvnw clean install
这将生成 24 MB 的 target/petclinic-jdbc-0.0.1-SNAPSHOT.jar
文件。通过以下命令测试运行:
java -jar target/petclinic-jdbc-0.0.1-SNAPSHOT.jar
5. 使用 Liberica JDK 构建原生镜像容器
现在将应用容器化。确保 Docker 守护进程 正在运行(Windows/macOS x86 用户需为 Docker 分配至少 8GB 内存)。在 petclinic JDBC 目录执行:
./mvnw spring-boot:build-image
构建完成后,通过以下命令启动容器:
docker run -it docker.io/library/petclinic-jdbc:0.0.1-SNAPSHOT
踩坑提示:Apple M1 用户因缺少必要的 Docker 构建包,此步骤不可用。但最新版 Liberica NIK 已完全兼容 Apple Silicon,可直接跳到下一步。
6. 使用 Liberica NIK 构建原生镜像
下面使用 Liberica Native Image Kit 构建另一个版本的原生镜像。以下是 Linux 安装步骤(macOS/Windows 用户请参考 Liberica NIK 安装指南)。
进入目标安装目录:
cd directory_path_name
下载 Liberica NIK Core(包含 Liberica VM 和基于 GraalVM 的原生镜像工具链):
wget https://download.bell-sw.com/vm/22.0.0.2/bellsoft-liberica-vm-openjdk11-22.0.0.2-linux-amd64.tar.gz
解压文件:
tar -xzf bellsoft-liberica-vm-openjdk11-22.0.0.2-linux-amd64.tar.gz
设置
JAVA_HOME
指向 Liberica NIK:export JAVA_HOME=$(pwd)/bellsoft-liberica-vm-openjdk11-22.0.0.2
返回项目目录:
cd $PROJECT_DIR
执行原生构建:
./mvnw -Pnative install
这将启用 native
构建配置,生成 102.3 MB 的 target/petclinic-jdbc
二进制文件。
7. 启动时间对比
我们在 Intel Core i7-8750H CPU + SSD 的环境下测试了三种方式的启动速度:
构建方式 | 启动时间 |
---|---|
传统 JAR 包 | 约 3.3 秒 |
原生镜像容器 | 约 0.07 秒 |
Liberica NIK 原生镜像 | 约 0.068 秒 |
8. 结论
即使 Spring Native 项目仍处于 Beta 阶段,其构建的原生镜像已表现出色,启动时间提升效果显著。随着 Spring Native 正式版发布,结合 Liberica Native Image Kit 作为端到端解决方案,我们有望获得更优的性能表现。