Quarkus 云原生 Java:超音速亚原子

FreeGuideOnline 最新 2026-06-17

Quarkus 云原生 Java:超音速亚原子

什么是 Quarkus?

Quarkus 是一个为 GraalVM 和 OpenJDK HotSpot 量身定制的 Kubernetes 原生 Java 框架。它由 Red Hat 主导开发,旨在让 Java 在容器化、Serverless 和云原生环境中真正大放异彩。其口号 “Supersonic Subatomic”(超音速亚原子) 精准描述了它的两大核心优势:极快的启动速度(超音速)和极低的内存占用(亚原子)。

与传统的 Java 框架不同,Quarkus 将元数据处理从运行时提前到构建时,从而大幅减少运行时类加载和反射的开销。开发者可以用熟悉的 Java 生态(如 Hibernate、RESTEasy、Vert.x、Kafka)进行开发,同时获得与 Go 或 Node.js 相媲美的启动时间和容器化体验。

为什么选择 Quarkus 进行云原生开发?

在云原生时代,应用需要快速扩缩容、高密度部署。传统 Java 应用往往启动慢、内存高,导致冷启动延迟大、资源成本高。Quarkus 直击这些痛点:

  • 毫秒级启动:编译成本地可执行文件后,启动时间可低于 10 毫秒,完美适配 Serverless 和水平自动伸缩(HPA)。
  • 极低 RSS 内存:一个 REST 微服务的 RSS 可低至 12 MB 左右,使同一节点可运行更多实例。
  • 开发高效:内置开发模式(dev mode),支持热重载,修改代码后立即生效,无需重启。
  • 命令式与响应式兼修:既支持传统的命令式编程(使用 RESTEasy Classic),也支持响应式(Mutiny、Vert.x),并可轻松混合使用。
  • 完整标准库支持:提供大量经过优化的扩展(Extensions),涵盖 REST、数据库、消息、安全、可观测性等,无需额外第三方插件。
  • 容器首位:原生镜像直接生成最小容器镜像(distroless),安全且体积小。

环境准备

开始前,请确保本地环境满足以下要求:

  • JDK 17 或 21(推荐 GraalVM 社区版或 Mandrel,以获得最佳原生编译支持)
  • Apache Maven 3.9+Gradle(本文以 Maven 为例)
  • Docker(用于构建原生镜像和本地容器测试)
  • IDE:IntelliJ IDEA、VS Code 或 Eclipse

验证安装:

java -version
mvn -version
docker version

创建第一个 Quarkus 应用

使用 Maven 脚手架生成项目

最便捷的方式是通过 Maven 插件创建:

mvn io.quarkus.platform:quarkus-maven-plugin:3.9.1:create \
    -DprojectGroupId=com.example \
    -DprojectArtifactId=hello-quarkus \
    -DclassName="com.example.GreetingResource" \
    -Dpath="/hello"

这会生成一个包含 REST 接口 GreetingResource 的基础项目,路径为 /hello

项目结构概览:

hello-quarkus
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com/example
    │   │       └── GreetingResource.java
    │   └── resources
    │       └── application.properties
    └── test

查看生成的 REST 资源

打开 GreetingResource.java,内容如下:

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 REST";
    }
}

这是一个简单的 JAX-RS 端点。Quarkus 使用 Resteasy Reactive 作为默认实现,天然支持响应式。

运行与热重载开发模式

进入项目根目录,启动开发模式:

cd hello-quarkus
./mvnw quarkus:dev

开发模式特点:

  • 后台持续运行,监听代码变更。
  • 修改 Java 或配置文件后,应用自动重新编译并热重载,状态不丢失。
  • 提供 Dev UI(访问 http://localhost:8080/q/dev)查看端点、配置、扩展等信息。

测试接口:

curl http://localhost:8080/hello

返回 Hello from Quarkus REST。现在尝试修改返回字符串,保存文件,无需重启,再次 curl 将立即看到最新结果。

添加 JSON 响应与 JPA 集成

典型微服务常需返回 JSON 和操作数据库。Quarkus 扩展机制让集成变得极简。

添加扩展

./mvnw quarkus:add-extension -Dextensions="resteasy-reactive-jackson, hibernate-orm-panache, jdbc-postgresql"

这会自动更新 pom.xml,添加 Jackson、Hibernate with Panache(简化持久层)和 PostgreSQL JDBC 驱动。

定义实体

使用 Panache 实体模式,无需 DAO:

package com.example;

import io.quarkus.hibernate.orm.panache.PanacheEntity;
import jakarta.persistence.Entity;

@Entity
public class Person extends PanacheEntity {
    public String name;
    public int age;
}

PanacheEntity 提供了 id 字段和内置的 findlistpersist 等方法。

配置数据源

application.properties 中添加(使用 Dev Services 可零配置启动 PostgreSQL 测试容器):

quarkus.datasource.db-kind=postgresql
# 开发/测试阶段 Dev Services 会自动提供 PostgreSQL 实例,无需手动配置连接 URL
%dev.quarkus.datasource.devservices.image-name=postgres:15

Dev Services 特性会在开发模式下自动启动一个临时 PostgreSQL Docker 容器,预配数据库,并在应用停止时销毁。无比便利。

编写资源类

package com.example;

import jakarta.transaction.Transactional;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import java.util.List;

@Path("/persons")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class PersonResource {

    @GET
    public List<Person> list() {
        return Person.listAll();
    }

    @POST
    @Transactional
    public Person create(Person person) {
        Person.persist(person);
        return person;
    }
}

此时开发模式已自动重启。用 curl 测试:

curl -X POST -H "Content-Type: application/json" -d '{"name":"Alice","age":30}' http://localhost:8080/persons
curl http://localhost:8080/persons

响应式与命令式融合

Quarkus 支持在同一项目中混合两种范式。例如,将返回改为响应式流 UniMulti

import io.smallrye.mutiny.Uni;
// ...
@GET
@Path("/{id}")
public Uni<Person> getById(@PathParam("id") Long id) {
    return Person.findById(id);
}

无需切换线程模型或修改配置,Quarkus 在编译时自动适配到 I/O 线程或工作线程。这让逐步采用响应式模式毫无压力。

构建与打包

构建 JVM 模式的 JAR

./mvnw package

生成的 quarkus-app/quarkus-run.jar 可以运行在 JVM 上:

java -jar target/quarkus-app/quarkus-run.jar

启动速度虽快于传统框架,但真正的威力在于原生镜像。

构建原生可执行文件

需要安装 GraalVM 或 Mandrel,并配置 GRAALVM_HOME。或在项目根目录执行:

./mvnw package -Pnative

(如需容器内构建,添加 -Dquarkus.native.container-build=true 并确保 Docker 可用) 编译过程可能较慢,但生成的二进制文件不依赖 JVM,启动极快、内存极低。

运行原生文件:

target/hello-quarkus-1.0.0-SNAPSHOT-runner

观察启动时间:通常在 0.01 秒级别。

容器化与 Kubernetes 部署

Quarkus 深度集成容器构建,几乎无需编写 Dockerfile。

创建 Docker 镜像(原生)

./mvnw package -Pnative -Dquarkus.native.container-build=true -Dquarkus.container-image.build=true

这会基于 ubi8/ubi-minimal 等最小基础镜像构建镜像,并打上标签。

若要推送至注册中心,添加:

-Dquarkus.container-image.push=true \
-Dquarkus.container-image.registry=your-registry \
-Dquarkus.container-image.group=your-org \
-Dquarkus.container-image.name=hello-quarkus

生成 Kubernetes 部署描述符

只需添加 Kubernetes 扩展:

./mvnw quarkus:add-extension -Dextensions="kubernetes"

再次构建时,Quarkus 会在 target/kubernetes/ 下生成 kubernetes.yml。它已包含健康检查就绪探针(/q/health)、存活探针和合理的资源限制建议。

部署到集群:

kubectl apply -f target/kubernetes/kubernetes.yml

可观测性:健康检查、指标与追踪

云原生应用不可没有可观测性。Quarkus 提供开箱即用的 MicroProfile Health、Metrics 和 OpenTelemetry 支持。

添加健康检查

./mvnw quarkus:add-extension -Dextensions="smallrye-health"

启动后访问 http://localhost:8080/q/health 获得整体状态,/q/health/live/q/health/ready 分别用于存活和就绪探针。

自定义就绪检查:实现 Readiness 接口并打上 @Readiness 注解即可。

暴露指标

./mvnw quarkus:add-extension -Dextensions="smallrye-metrics"

现在 http://localhost:8080/q/metrics 暴露 Prometheus 格式的指标,可直接被 Prometheus 抓取。

OpenTelemetry 追踪

./mvnw quarkus:add-extension -Dextensions="opentelemetry"

配置 application.properties

quarkus.otel.exporter.otlp.endpoint=http://jaeger-collector:4317

所有 REST 调用自动生成 Span,传播上下文。

Quarkus 的应用场景

凭借其毫秒启动和低内存,Quarkus 非常适合:

  • 微服务架构:轻量、高速通信。
  • Serverless / FaaS:如 Knative、AWS Lambda(Quarkus Funqy 扩展)。
  • 消息驱动应用:与 Kafka、AMQP、Pulsar 深度集成。
  • 命令行应用与批处理:原生编译后作为独立 cli 工具分发。
  • 边缘计算:资源受限设备上运行 Java 服务。

学习路线建议

  1. 入门:掌握 CLI 工具、开发模式、REST 与 JSON。
  2. 持久层:Hibernate ORM with Panache、事务管理、Flyway 数据迁移。
  3. 响应式进阶:Mutiny 操作符、胶水代码到完全响应式改造。
  4. 安全:Quarkus Security、OIDC、JWT。
  5. 云原生扩展:Kubernetes、容器构建、配置管理 (Consul/Apollo)、容错 (Resilience4J)。
  6. 原生与GraalVM深度:理解构建时初始化、代理类、反射配置。
  7. 生产实践:持续测试、Tracing、日志聚合、高可用部署。

小结

Quarkus 将 Java 重新带回了云原生竞技场的核心。通过 编译时提升 技术、容器化友好 设计和 开发体验优化,它让 Java 开发者既能享受生态的丰富,又能获得媲美现代框架的运行时性能。如果你希望用 Java 构建下一个高性能微服务或 Serverless 函数,Quarkus 无疑是最值得深入学习的框架。立即动手,体验“超音速亚原子”的魅力。