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 包)

后者虽然稍复杂,但只需四步即可完成:

  1. 进入目标安装目录:

    cd directory_path_name
    
  2. 下载安装包(若无 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
    
  3. 解压到当前目录:

    tar -zxvf bellsoft-jdk11.0.14.1+1-linux-amd64.tar.gz
    
  4. 设置 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 安装指南)。

  1. 进入目标安装目录:

    cd directory_path_name
    
  2. 下载 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
    
  3. 解压文件:

    tar -xzf bellsoft-liberica-vm-openjdk11-22.0.0.2-linux-amd64.tar.gz
    
  4. 设置 JAVA_HOME 指向 Liberica NIK:

    export JAVA_HOME=$(pwd)/bellsoft-liberica-vm-openjdk11-22.0.0.2
    
  5. 返回项目目录:

    cd $PROJECT_DIR
    
  6. 执行原生构建:

    ./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 作为端到端解决方案,我们有望获得更优的性能表现。


原始标题:Building Native Images With Spring Native and Liberica Tools With a Speed Comparison