Quarkus 云原生 Java 实战
Spring Boot 启动要 5 秒,内存占 500MB?Quarkus 把 Java 启动时间压到 0.01 秒,内存降到 50MB。本文从项目创建到 GraalVM 原生镜像构建,讲清 Quarkus 云原生 Java 的核心用法。
一、Quarkus 是什么
Quarkus 是 Red Hat 开源的云原生 Java 框架,目标是让 Java 适配 Kubernetes 和 Serverless 环境。它和 Spring Boot 的核心区别:启动快、内存小、支持 GraalVM 原生镜像编译。
| 维度 | Spring Boot | Quarkus |
|---|---|---|
| 启动时间 | 3-10 秒 | 0.01-0.1 秒 |
| 内存占用 | 300-500MB | 20-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。