Quarkus:简介、原理、实战

概述

官网,中文官网,几乎纯Java实现、开源(GitHub,15.9K Star,3.3K Fork)超音速、亚原子级框架。

支持与GraalVM集成,通过AOT(提前编译)方式将Java应用编译为原生可执行文件,从而大幅提升性能。基于Java标准构建,可继续使用CDI、JAX-RS等标准API,无需学习新语法。

提供丰富扩展支持:

  • Hibernate ORM
  • Apache Kafka
  • OpenShift、Kubernetes集成
  • Vert.x异步编程模型

优势

  • 开发者友好:一个内聚平台,通过统一配置和轻松的原生可执行文件生成来优化开发者的体验。零配置,瞬间完成实时重新加载,为80%的常用用法简化代码,其余20%具有灵活性
  • 性能:在构建阶段简化框架优化,以减少运行时依赖性并提高效率。通过预先计算元数据和优化类加载,可确保JVM和原生二进制部署的快速启动时间,从而减少内存使用量
  • Kube-Native:和Kubernetes的结合为创建可扩展、快速和轻量级的应用程序提供理想的环境。通过工具、预构建的集成、应用程序服务等显着提高了开发人员的生产力
  • 社区和标准:提供内聚的易于使用的全栈框架,超过五十个主流库,且列表不断增长
  • 反应式核心:建立在强大的反应式核心之上,确保快速高效的性能,支持各种现代应用程序的开发
  • 容器优先:为GraalVM和HotSpot定制应用程序。编译时启动,快速启动,低RSS内存(不仅仅是堆大小),可在Kubernetes等容器编排平台中提供近乎瞬时的扩展和高密度内存利用率

实战

使用Maven插件创建Quarkus项目:

xml 复制代码
mvn io.quarkus:quarkus-maven-plugin:3.39.4:create \
	-DprojectGroupId=com.johnny.quarkus \
	-DprojectArtifactId=quarkus-demo \
	-DclassName="com.johnny.quarkus.Hello" \
	-Dpath="/hello"

首次执行会下载Maven依赖,执行成功会生成一个包含基础结构的Maven项目,包含:

  • Hello类,定义/hello接口
  • 默认配置文件
  • Dockerfile文件

生成的项目

自动生成的Dockerfile.native内容如下:

bash 复制代码
FROM registry.access.redhat.com/ubi9/ubi-minimal:9.7
WORKDIR /work/
RUN chown 1001 /work \
    && chmod "g+rwX" /work \
    && chown 1001:root /work
COPY --chown=1001:root --chmod=0755 target/*-runner /work/application
EXPOSE 8080
USER 1001
ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"]

的Dockerfile.native-micro内容如下:

bash 复制代码
FROM quay.io/quarkus/ubi9-quarkus-micro-image:2.0
WORKDIR /work/
RUN chown 1001 /work \
    && chmod "g+rwX" /work \
    && chown 1001:root /work
COPY --chown=1001:root --chmod=0755 target/*-runner /work/application
EXPOSE 8080
USER 1001
ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"]

和上面的Dockerfile.native文件的区别仅仅是FROM指定的基础镜像。

Dockerfile.jvm内容如下:

bash 复制代码
FROM registry.access.redhat.com/ubi9/openjdk-17-runtime:1.24
ENV LANGUAGE='en_US:en'
# We make four distinct layers so if there are application changes the library layers can be re-used
COPY --chown=185 target/quarkus-app/lib/ /deployments/lib/
COPY --chown=185 target/quarkus-app/*.jar /deployments/
COPY --chown=185 target/quarkus-app/app/ /deployments/app/
COPY --chown=185 target/quarkus-app/quarkus/ /deployments/quarkus/
EXPOSE 8080
USER 185
ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
ENV JAVA_APP_JAR="/deployments/quarkus-run.jar"
ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ]

Dockerfile.legacy-jar内容如下:

bash 复制代码
FROM registry.access.redhat.com/ubi9/openjdk-17-runtime:1.24
ENV LANGUAGE='en_US:en'
COPY target/lib/* /deployments/lib/
COPY target/*-runner.jar /deployments/quarkus-run.jar
EXPOSE 8080
USER 185
ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
ENV JAVA_APP_JAR="/deployments/quarkus-run.jar"
ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ]

和上面的Dockerfile.jvm文件的区别在于COPY指定的复制文件。

sql 复制代码

开发模式支持热重载(Hot Reload)功能,修改Java类或配置文件后,刷新页面即可生效。

执行命令启动开发模式:./mvnw compile quarkus:dev

执行命令mvn package,如果遇到报错Unknown packaging: quarkus,则修改pom.xml文件,<packaging>quarkus</packaging>改成<packaging>jar</packaging>,将在target/目录下生成quarkus-demo-1.0.0-SNAPSHOT.jar文件。执行./mvnw package命令,相比于mvn package,将在target/目录下额外生成quarkus-project-1.0-SNAPSHOT-runner.jar可执行JAR:

bash 复制代码

运行./mvnw package -Pnative,因需进行AOT编译,构建过程会稍长。验证构建结果:./mvnw verify -Pnative。

使用Docker构建容器镜像:./mvnw package -Pnative -Dnative-image.docker-build=true

bash 复制代码
bash 复制代码
bash 复制代码
bash 复制代码

原生镜像

Quarkus可将应用编译为原生可执行文件,显著提升启动速度和首次请求响应时间。包含运行所需的一切,包括最小化的JVM。

要构建原生镜像(Native Image),需安装GraalVM并配置GRAALVM_HOME环境变量。

https://graalvm.java.net.cn/downloads/#

下载zip压缩包,解压缩,看起来像是一个JDK发行版(实际上就是如此);配置为JAVA_HOME,即可使用。

相关推荐
Clf丶忆笙4 个月前
搭建支持多语言开发的Quarkus环境:Java、Kotlin与Scala全栈指南
java·开发语言·云原生·kotlin·scala·quarkus
七夜zippoe6 个月前
Java技术未来展望:GraalVM、Quarkus、Helidon等新趋势探讨
java·开发语言·python·quarkus·graaivm·helidon
DENG8623049 个月前
二、使用idea运行Quarkus项目及调试
java·intellij-idea·quarkus
GEM的左耳返1 年前
Java面试新趋势:云原生与新兴框架实战解析
云原生·graalvm·服务网格·java面试·quarkus·micronaut
杨不易呀1 年前
Java面试高阶篇:Spring Boot+Quarkus+Redis高并发架构设计与性能优化实战
spring boot·redis·高并发·分布式锁·java面试·quarkus
玄明Hanko1 年前
Java云原生+quarkus
java·开发语言·云原生·quarkus
lizhou8281 年前
IDEA中Quarkus框架(3.13版本)容器编排、压测与调优、注意事项等
docker·云原生·intellij-idea·quarkus
张小洛2 年前
【Quarkus】基于CDI和拦截器实现AOP功能
java·后端·quarkus
青花锁3 年前
构建新一代的Kubernetes原生Java微服务+Quarkus实战
java·微服务·云原生·kubernetes·k8s·quarkus