拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Quarkus:简介、原理、实战

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项目:

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内容如下:

FROM registry.access.redhat.com/ubi9/ubi-minimal:9.7 WORKDIR /work/ RUNchown1001/work\&&chmod"g+rwX"/work\&&chown1001:root /work COPY--chown=1001:root--chmod=0755 target/*-runner /work/application EXPOSE8080USER1001ENTRYPOINT["./application","-Dquarkus.http.host=0.0.0.0"]

的Dockerfile.native-micro内容如下:

FROM quay.io/quarkus/ubi9-quarkus-micro-image:2.0 WORKDIR /work/ RUNchown1001/work\&&chmod"g+rwX"/work\&&chown1001:root /work COPY--chown=1001:root--chmod=0755 target/*-runner /work/application EXPOSE8080USER1001ENTRYPOINT["./application","-Dquarkus.http.host=0.0.0.0"]

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

Dockerfile.jvm内容如下:

FROM registry.access.redhat.com/ubi9/openjdk-17-runtime:1.24 ENVLANGUAGE='en_US:en'# We make four distinct layers so if there are application changes the library layers can be re-usedCOPY--chown=185target/quarkus-app/lib/ /deployments/lib/ COPY--chown=185target/quarkus-app/*.jar /deployments/ COPY--chown=185target/quarkus-app/app/ /deployments/app/ COPY--chown=185target/quarkus-app/quarkus/ /deployments/quarkus/ EXPOSE8080USER185ENVJAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"ENVJAVA_APP_JAR="/deployments/quarkus-run.jar"ENTRYPOINT["/opt/jboss/container/java/run/run-java.sh"]

Dockerfile.legacy-jar内容如下:

FROM registry.access.redhat.com/ubi9/openjdk-17-runtime:1.24 ENVLANGUAGE='en_US:en'COPY target/lib/* /deployments/lib/ COPY target/*-runner.jar /deployments/quarkus-run.jar EXPOSE8080USER185ENVJAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"ENVJAVA_APP_JAR="/deployments/quarkus-run.jar"ENTRYPOINT["/opt/jboss/container/java/run/run-java.sh"]

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

开发模式支持热重载(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:

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

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

原生镜像

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

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

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

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

返回列表