学习使用Quarkus

1,955 阅读13分钟

开始使用Quarkus

Quarkus是一个有效的开源Java原生框架,用于创建和管理Kubernetes原生Java堆栈、微服务和无服务器环境,这些都是针对开放的JDK和GraalVM运行时优化的。

与Spring Boot框架类似,Quarkus是不同的Java库和标准的组合,为你提供整合,同时对JVM进行改进。

虽然这个框架与语言相比还很年轻(有20多年的历史),但它有很好的功能和效果,对开发者来说很有用。

Quarkus与Java库原生集成,因此你不需要学习任何新的东西。

在本教程中,我们将开始学习Quarkus,并学习如何使用不同的工具和软件环境开发Quarkus项目。

主要收获

在本文结束时,读者应该学会以下内容。

  • Quarkus和其他Java框架的比较。
  • Quarkus的先决条件。
  • Quarkus框架的优势和利弊。
  • 使用不同的方法或工具创建Quarkus应用程序,如从code.quarkus.io/网站,使用Visual Studio Code和IntelliJ。
  • Quarkus项目结构。
  • Quarkus框架和Spring Boot框架之间的差异。
  • 使用JConsole测试Quarkus资源的使用。

前提条件

为了方便跟进这篇文章,你需要具备以下条件。

  • 在你的机器上安装一个支持Java框架的现代IDE。这可以是Visual Studio Code或IntelliJ(终极版)或任何其他。我们将在本文中重点讨论这两个。
  • 一个稳定的互联网连接,以便下载依赖性。
  • 安装了任何分布的JDK 11+。这是因为Quarkus不支持低于11的版本。
  • 安装Gradle或Apache Maven 3.8.1+。
  • Java编程技能。
  • 必须至少与一个Java框架互动过。
  • 一个稳定的互联网连接。

Quarkus简介

Quarkus提供的一些功能包括。

  • 热重载:每一个代码的变化都会重新加载,差异会自动反映在系统中。
  • 强制性和反应性开发:也就是说,它同时支持同步和异步操作。
  • 标准和库:更多建立在已知标准上的库很容易支持全栈开发。

Quarkus与其他Java框架的比较

Java是一种构建良好且受支持的语言。它有许多可用于大型和小型项目的框架。

这些框架包括。

  • Spring
  • Spring Boot
  • Hibernate
  • Struts
  • Google Web Toolkit (GWT)
  • 刀片
  • Grails
  • Quarkus
  • 淘宝网
  • 微配置文件

应用程序是基于算法和数据结构建立的,而框架的选择则是基于性能和效率。

以下是Quarkus与Spring Boot、Micronaut和Microprofile等其他Java框架的异同点。

Quarkus与Spring Boot

相同点

  • 两者都使用Spring Web的依赖性。
  • 两者都有类似的REST点。
  • 两者都是使用Maven和Gradle构建成JAR文件。

不同之处

  • Quarkus的应用程序比Spring Boot的更快、更有效。Quarkus是为性能和效率而构建的,占用的内存、启动和响应时间最少。
  • Quarkus是一个现代框架,而Spring Boot在业界已经存在了很长时间。
  • 与Quarkus相比,Spring Boot由于其存在的时间,拥有一个伟大的社区。Quarkus有一个不断增长的社区。

Quarkus vs Micronaut

相似性

  • 两者都是现代框架。
  • 两者都是为微服务和无服务器应用而构建的。
  • 都是为JDK和GraalVM构建的。

不同之处

  • Quarkus更依赖于Java企业和Eclipse MicroProfile APIs,而Micronaut定义了它的APIs,并更多地基于Spring和Grails框架。
  • Quarkus基于一个扩展架构,使其很容易与第三方框架集成,而Micronaut有一个面向方面的编程(AOP)实现,不使用反射来定义交叉关注。

Quarkus vs Microprofile

相同点

  • 两者都是以微服务和无服务器应用为中心。
  • 两者相互兼容,因为Quarkus是Microprofile的一个实现,它是基于给定的规范而构建的。

不同之处

  • Microprofile用于在Java企业环境中进行微服务规范,而Quarkus是Microprofile的一个实现,它是基于给定的规范而构建的。

与传统环境相比,Quarkus在通过GraalVM和JVM在Native环境中运行时,夸耀其重载速度和内存效率。

Quarkus efficiency and performance (图片来自Quarkus官方网站)

开始使用Quarkus项目

我们可以使用下面的工具来创建一个Quarkus项目。

  • Quarkus.io项目初始化器。
  • 使用Visual Studio Code。
  • 使用IntelliJ。

Quarkus.io项目初始化器

Quarkus.io项目初始化器,就像Spring初始化器Micronaut初始化器一样,用来快速创建一个Quarkus项目和所有需要的依赖。

只要前往该网站就可以了。

code.quarkus.io (作者的屏幕截图)

你可以做以下事情。

  • 重命名工件构建工具
  • 在生成你的项目压缩文件之前,搜索并选择需要的依赖性。也可以使用Quarkus CLI添加依赖性,你将在后面看到。
  • 通过点击 "CONFIGURE MORE OPTIONS "添加更多的配置,如SNAPSHOT版本和Starter代码的可用性。

继续并生成你的项目,内容如下。

  • 群组:org.commerce.quarkus
  • 工具: ecommerce-quarkus
  • 构建工具:<选择你的构建工具

选择你的构建工具。也就是Maven或Gradle。

  • 依赖性:RESTEasy JAX-RS - 这将帮助你使用JAX-RS创建REST API端点。
  • 点击Generate your Application 按钮,生成你的应用程序。
  • 下载zip文件,解压后在你喜欢的IDE上打开。
  • 你注意到,你也可以通过点击下拉按钮直接 "推送到GitHub"。
文件夹结构

下面显示了如果你使用Maven作为构建工具,应用程序的文件夹是怎样的。

.
├── .mvn
├── src
│   ├── main
│       ├── docker
│       ├── java
│       └── resources
│   └── test
├── mvnw.cmd
├── mvnw
├── .gitignore
├── .dockerignore
├── pom.xml
└── README.md

如果你使用Gradle,文件夹结构

.
├── gradle
├── src
│   ├── main
│       ├── docker
│       ├── java
│       └── resources
│   ├── native-test
│   └── test
├── .gitignore
├── .dockerignore
├── build.gradle
├── gradle.properties
├── gradlew
├── gradle.bat
├── settings.gradle
├── pom.xml
└── README.md

项目中存在Dockerfile,说明它可以在容器中支持项目的微服务。

该项目缺少main class ,如Spring Boot框架中的ecommerce-quarkus/src/main/java/org/ecommerce/quarkus

它有EcommerceResource.java 文件,默认有一个简单的hello REST端点。

使用Visual Studio代码

  • 打开VS Code。确保Java工具安装得很好。
  • 点击扩展标签。
  • 在扩展标签中搜索Quarkus ,标识为redhat.vscode-quarkus ,由 "Redhat团队 "构建。
  • 它的预览如下所示。

VSCode Quarkus extension (作者的截图)

  • 安装它并重新启动应用程序。
  • 你会注意到,当你等待一段时间后,应用程序会自动打开一个新的Quarkus初始化窗口。

该窗口看起来如下。

VSCode-Quarkus-start.png (作者的截图)

  • 如果没有,只要导航到Views 菜单中的命令调色板。
  • 搜索Quarkus并选择Create a Quarkus project
  • 在显示的弹出窗口中,选择构建工具,然后选择groupIdartifactId ,项目版本,包名称,资源名称(即EcommerceResource)。
  • 通过搜索和点击选择extensionsdependencies (RESTEasy JAX-RS)。
  • 完成后,点击Enter ,进入下一步骤。
  • 选择是否使用启动代码。
  • 选择要生成项目的文件夹。
  • 现在,选择是否在当前窗口或新窗口打开该项目,将其添加到当前工作区。

使用IntelliJ

  • 启动你的IntelliJ应用程序。
  • 点击Create New Project 按钮。
  • 在打开的窗口的左侧,选择Quarkus作为你的项目类型。

Intellij为你提供了项目的工件构建工具语言(Java或Kotlin)和项目SDK的文本输入。

Quarkus IntelliJ start (作者的屏幕截图)

  • 然后,它会自动获取你的项目的文件,提取它们,并将它们打开。

Quarkus IntelliJ start extensions (作者的截图)

编译你的Quarkus项目

应用程序的编译是通过项目文件夹('ecommerce-quarkus')中的mvnw 文件完成的。确保你在你的工作目录中,否则,运行下面的命令。

cd ecommerce-quarkus

你现在可以编译你的应用程序了。

通过在终端窗口运行以下命令来完成。

Maven

./mvnw compile quarkus:dev

这将在开发模式下构建应用程序,允许实时重载(热重载)。

你可以按照终端上提供的说明进行导航。

Gradle

和Gradle项目一样,运行。

./gradlew quarkusDev

在显示给终端的输出中,你会看到访问该应用程序的URL以及已安装的功能。

这在下面的图片中显示。

Compilation development terminal (作者的屏幕截图)

默认情况下,Quarkus在http://localhost:8080/ 请求时,将返回ecommerce-quarkus/src/main/resources/META-INF/resources/ 中的文件。

通常情况下,在那里找到的index.html 文件将是你的输出。使用浏览器或终端访问应用程序以查看输出。

浏览器

在浏览器中,打开localhost:8080http://0.0.0.0:8080/ ,访问该应用程序。

你会看到在ecommerce-quarkus/src/main/resources/META-INF/resources 内找到的index.html 文件。

应用程序的配置总是在ecommerce-quarkus/src/main/resources 里面的application.properties 文件中设置。

由于Quarkus现在提供了Dev mode user interface (Dev UI) ,你可以用它来运行和查看开发模式下的项目。

只要在你的浏览器中使用http://localhost:8080/q/dev/ 。这个功能只在开发模式下可用。

dev-ui (作者的屏幕截图)

现在你可以通过点击Config Editor 按钮,轻松地使用界面为项目添加配置。

终端

如果你有 curl安装,你可以在终端窗口中输入命令curl http://localhost:8080/hello ,将返回值作为输出。

将返回值改为Second hot reload! ,然后保存。现在,输出将自动利用热重载功能进行修改。

每当有请求被获取时,应用程序就会在终端记录该动作。

你还可以注意到,它正在利用 Vert.X框架,如下图所示。

vert.x-worker (作者的屏幕截图)

什么是Vert.X? Vert.XVert.X是一个开源工具包,用于在JVM之上使用异步开发模型构建分布式反应式系统。

例如,要从配置中添加内置注入,你只需要在EcommerceResource.java 文件中进行以下操作。

  • 首先导入应用程序的配置。
  • 注入并配置要注入文件中使用或显示的属性。
  • 返回值作为你的输出。
package org.ecommerce.quarkus;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class EcommerceResource {
    @Inject
    @ConfigProperty(name="greeting")
    String greeting;

    @Inject
    @ConfigProperty(name="key")
    String key;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return greeting + " " + key;
    }
}

application.properties 文件中,添加以下内容。

  • 一个名为greeting 的配置属性,其值为'Hi Docs?
  • 另一个是名为key 的配置属性,其值为'4455'
greeting = Hi Docs?
key = 4455
  • 保存所有并运行http://localhost:8080/hello ,看到返回值为Hi Docs? 4455.X-RS。这将帮助你使用JAX-RS创建REST API端点。
  • 点击Generate your Application 按钮来生成你的应用程序。
  • 下载zip文件,解压后在你喜欢的IDE上打开。

你可以注意到,你也可以通过点击按钮中的下拉选项直接Push to GitHub

Quarkus扩展

你可以在终端使用下面的命令查看Quarkus支持的所有扩展。

 ./mvnw quarkus:list-extensions

如果你需要安装一个以上的额外扩展,请安装。

  • JSON-B
  • Hibernate Reactive与Panache

运行下面的命令来安装它们。

./mvnw quarkus:add-extension -Dextensions="quarkus-jsonb, quarkus-hibernate-reactive-panache"

扩展是使用其唯一的标识符来获取的,其中名称用连字符隔开(在显示的列表的右栏中找到)。

记住要用逗号来分隔扩展。

检查'pom.xml'文件中的已安装的依赖项。

例如,对于已安装的 "JSON-B"扩展,你会看到下面的代码。

    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-jsonb</artifactId>
    </dependency>

要安装所有匹配全局化模式的扩展是可能的。

例如,安装所有名称中带有'Hibernate'的扩展,可以按如下方式进行。

./mvnw quarkus:add-extension -Dextensions="hibernate-*"

要卸载一个Quarkus依赖,只需前往'pom.xml'文件并删除依赖和其标签内的属性。

这些可能包括groupIdartifactId

重新编译并重新构建应用程序。

运行端点的测试

运行在'test'文件夹中找到的测试,看看端点是否正常工作。打开在test/java/org.ecommerce.quarkus 文件夹中找到的EcommerceResourceTest 文件。

由于你已经把端点的输出变成了Hi Docs? 4455 ,所以把它改成了初始结果的输出。

package org.ecommerce.quarkus;
import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.is;

@QuarkusTest
public class EcommerceResourceTest {

    // Change the expected output
    @Test
    public void testHelloEndpoint() {
        given()
          .when().get("/hello")
          .then()
             .statusCode(200)
             .body(is("Hi Docs? 4455"));
    }

}

将网站模板添加到Quarkus资源中

要添加一个网站模板,在访问http://localhost:8080/ (没有端点的默认URL)时自动显示。

  • 前往这个链接,下载免费的蛋糕模板来试试。你可以在themewagon.com/themes 找到并下载其他免费模板。
  • 下载后,解压并复制粘贴文件夹内的所有内容到前面提到的'资源'文件夹。
  • 这些内容包括index.html' 和它的所有样式和脚本。

Static webpage template (作者的屏幕截图)

  • 打开浏览器,通过http://localhost:8080/ 。使用curl http://localhost:8080/ ,通过终端找到输出。
  • 在交互式终端中使用qCtrl + C 命令停止该应用程序。

构建应用程序

使用以下命令将应用程序构建或打包成JAR

Maven

./mvnw package

或在Gradle中使用。

./gradlew quarkusDev

你可以同时执行构建和清理过程,这将删除构建目录中所有先前的构建输出。

  • Maven中。
./mvnw clean package

如果测试运行时间过长或产生错误,那就是依赖性兼容性测试,你可以跳过。

./mvnw -DskipTests=true package

这个命令的好处是,它能使构建速度更快,错误更少。相反,它可能包括未来的依赖性未见的错误。

当陆续完成时,它在target/quarkus-app/ 文件夹中创建quarkus-run.jar 文件。

注意:创建的应用程序JAR文件不是über-jar类型。这是因为依赖性被复制到target/quarkus-app/lib/ 目录中。

一个 über-jar也被称为Fatjar,它是一个包含所有依赖项的JAR文件。你可以通过运行Uber-jar来构建一个。

./mvnw package -Dquarkus.package.type=uber-jar

运行创建的应用程序

运行新创建的JAR文件,使用。

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

现在的应用程序体积更小,效率更高。它拥有所有需要的依赖性和资源,可以被访问。

使用JConsole和IntelliJ分析器测试应用程序

JConsole是一个开源的图形化JVM和Java应用程序监控工具,用于监控本地和远程机器上运行的应用程序。

它自带JDK安装,因此不需要额外安装。

在一个新的终端中运行jconsole ,打开它。在新打开的窗口中,选择你的running local process.

通过使用命令来运行你打包好的应用程序。

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

这就是quarkus-run.jar JVM,连接到它。

JConsole Quarkus app (作者的屏幕截图)

现在,像以前一样,在终端窗口中获取一些终端的数据。

JConsole Quarkus Resources JConsole VM Summary (作者的截图)

观察应用程序在以下指标方面的性能。

  • 使用中的CPU线程
  • CPU使用率
  • 内存堆使用量
  • MBeans
  • 类,如下图所示。

你可以使用IntelliJ profiler ,作为查看Java进程甚至快照的JConsole substitute 。它位于你的状态栏中,如下图所示。

当你打开它时,它显示正在运行的JVM,如果你点击或右键点击任何一个,它将显示你的下拉选项。

Intellij profiler (作者的屏幕截图)

可用的选项包括。CPU和内存实时图表,将剖析器附加到进程中(Java飞行记录器,Async剖析器),捕获内存快照,以及获得线程转储。

选择CPU memory live charts 选项。

Intellij profiler stats (作者的屏幕截图)

在docker容器中构建和运行Quarkus项目

  • 在构建容器镜像之前,首先在一个新的终端窗口中运行以下命令。
./mvnw package

这个命令在创建镜像之前将应用程序打包。

  • 现在运行下面的命令来构建镜像。
docker build -f src/main/docker/Dockerfile.jvm -t quarkus/ecommerce-quarkus-jvm .
  • 使用下面的终端命令运行容器。
docker run -i --rm -p 8080:8080 quarkus/ecommerce-quarkus-jvm

这将内部应用程序的端口8080暴露给主机端口8080

此外,由于--rm docker选项的存在,它一旦关闭就会删除容器。

你可以使用docker stop quarkus/ecommerce-quarkus-jvm 停止该容器,并使用docker rm quarkus/ecommerce-quarkus-jvm 删除它。

要创建镜像并将其存储到你的本地机器中,请删除--rm (删除)选项。

运行docker ps -a ,在本地存储的容器列表中查看你的容器。

你可以先用上面的命令运行docker容器应用程序,然后在浏览器或终端打开http://localhost:8080/

总结

Quarkus是一个现代的Java框架,它为微服务和无服务器应用考虑到了性能和效率。它基于定义微服务规则的Microprofile标准,并利用了Java EE的依赖性。

以下是本教程中讨论的概念列表。

  • Quarkus是什么以及开发者在创建它时试图解决的问题。
  • Quarkus与Spring boot、Microprofile和Micronaut等其他Java框架的比较。
  • 如何使用Quarkus.io、visual studio Code和IntelliJ开发环境开始使用Quarkus。
  • 如何在操作和开发环境中编译、构建和运行Quarkus应用程序。
  • 如何在项目和其他端点中添加网站模板。
  • 在项目中添加更多的依赖项。
  • 创建Quarkus本地应用程序。
  • 测试应用程序,并使用JConsole和IntelliJ内置的剖析器对其如何利用系统资源进行剖析。
  • 在Docker容器内使用Quarkus应用程序。