Quarkus 云原生 Java 实战

Spring Boot 启动要 5 秒,内存占 500MB?Quarkus 把 Java 启动时间压到 0.01 秒,内存降到 50MB。本文从项目创建到 GraalVM 原生镜像构建,讲清 Quarkus 云原生 Java 的核心用法。

Quarkus 云原生配图:蓝色渐变背景上云平台与六边形集群节点,闪电连接,扁平科技插画
Quarkus:为云原生和 Serverless 优化的 Java 框架

一、Quarkus 是什么

Quarkus 是 Red Hat 开源的云原生 Java 框架,目标是让 Java 适配 Kubernetes 和 Serverless 环境。它和 Spring Boot 的核心区别:启动快、内存小、支持 GraalVM 原生镜像编译。

维度Spring BootQuarkus
启动时间3-10 秒0.01-0.1 秒
内存占用300-500MB20-80MB
原生镜像支持(实验性)一等公民
开发模式需重启Dev Mode 热重载

二、创建第一个 Quarkus 项目

# 创建项目(类似 Spring Initializr)
mvn io.quarkus.platform:quarkus-maven-plugin:3.0.0:create \
  -DprojectGroupId=com.example \
  -DprojectArtifactId=hello-quarkus \
  -Dextensions="resteasy-reactive-jackson"

cd hello-quarkus

# 开发模式启动(支持热重载)
./mvnw quarkus:dev
Dev Mode:Quarkus 的开发模式支持代码修改后自动重载,不需要重启。改 Java 文件、配置文件都即时生效,开发体验比 Spring Boot 好很多。

三、写第一个 REST 接口

package com.example;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("/hello")
public class GreetingResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "Hello from Quarkus!";
    }

    @GET
    @Path("/{name}")
    @Produces(MediaType.APPLICATION_JSON)
    public Greeting hello(@jakarta.ws.rs.PathParam String name) {
        return new Greeting("Hello, " + name);
    }

    public record Greeting(String message) {}
}

注意用的是 jakarta.ws.rs 注解(JAX-RS 规范),不是 Spring 的 @RestController。Quarkus 兼容标准 Java EE 规范。

四、依赖注入与配置

// 依赖注入(CDI 规范)
import jakarta.enterprise.context.ApplicationScoped;
import org.eclipse.microprofile.config.inject.ConfigProperty;

@ApplicationScoped
public class GreetingService {

    @ConfigProperty(name = "greeting.message", defaultValue = "Hello")
    String message;

    public String greet(String name) {
        return message + ", " + name;
    }
}

// 在 Resource 中注入
@Path("/hello")
public class GreetingResource {

    @Inject
    GreetingService greetingService;

    @GET
    @Path("/{name}")
    public String hello(@PathParam String name) {
        return greetingService.greet(name);
    }
}

配置文件是 application.properties,和 Spring Boot 类似。

五、GraalVM 原生镜像

Quarkus 最大的杀手锏:把 Java 应用编译成原生机器码,启动快到毫秒级。

# 需要安装 GraalVM
# 构建原生镜像
./mvnw package -Dnative

# 运行原生镜像(不是 JVM,是直接编译的二进制)
./target/hello-quarkus-1.0.0-runner

# 启动时间对比:
# JVM 模式:约 3 秒
# 原生镜像:约 0.01 秒
注意:原生镜像编译时间较长(几分钟),且需要 GraalVM 环境。适合生产部署,不适合日常开发。开发时用 Dev Mode,生产构建用原生镜像。

六、打包为容器镜像

# 构建容器镜像(内置 Docker 支持)
./mvnw package -Dnative -Dquarkus.container-image.build=true

# 或者用 JVM 模式打包
./mvnw package -Dquarkus.container-image.build=true

# 推送到容器镜像仓库
docker push myregistry/hello-quarkus:1.0.0

七、总结

Quarkus 适合云原生和 Serverless 场景:需要快速启动、低内存消耗的微服务、函数计算。它的 API 设计遵循 Java 标准规范(CDI、JAX-RS),Spring Boot 开发者上手很快。新项目如果部署在 Kubernetes 上,值得考虑 Quarkus 替代 Spring Boot。