开始使用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官方网站)
开始使用Quarkus项目
我们可以使用下面的工具来创建一个Quarkus项目。
- Quarkus.io项目初始化器。
- 使用Visual Studio Code。
- 使用IntelliJ。
Quarkus.io项目初始化器
Quarkus.io项目初始化器,就像Spring初始化器或Micronaut初始化器一样,用来快速创建一个Quarkus项目和所有需要的依赖。
只要前往该网站就可以了。
(作者的屏幕截图)
你可以做以下事情。
- 重命名组、工件和构建工具。
- 在生成你的项目压缩文件之前,搜索并选择需要的依赖性。也可以使用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团队 "构建。 - 它的预览如下所示。
(作者的截图)
- 安装它并重新启动应用程序。
- 你会注意到,当你等待一段时间后,应用程序会自动打开一个新的Quarkus初始化窗口。
该窗口看起来如下。
(作者的截图)
- 如果没有,只要导航到
Views菜单中的命令调色板。 - 搜索Quarkus并选择
Create a Quarkus project。 - 在显示的弹出窗口中,选择构建工具,然后选择
groupIdartifactId,项目版本,包名称,资源名称(即EcommerceResource)。 - 通过搜索和点击选择
extensions或dependencies(RESTEasy JAX-RS)。 - 完成后,点击
Enter,进入下一步骤。 - 选择是否使用启动代码。
- 选择要生成项目的文件夹。
- 现在,选择是否在当前窗口或新窗口打开该项目,将其添加到当前工作区。
使用IntelliJ
- 启动你的IntelliJ应用程序。
- 点击
Create New Project按钮。 - 在打开的窗口的左侧,选择Quarkus作为你的项目类型。
Intellij为你提供了项目的组、工件、构建工具、语言(Java或Kotlin)和项目SDK的文本输入。
(作者的屏幕截图)
- 然后,它会自动获取你的项目的文件,提取它们,并将它们打开。
(作者的截图)
编译你的Quarkus项目
应用程序的编译是通过项目文件夹('ecommerce-quarkus')中的mvnw 文件完成的。确保你在你的工作目录中,否则,运行下面的命令。
cd ecommerce-quarkus
你现在可以编译你的应用程序了。
通过在终端窗口运行以下命令来完成。
Maven。
./mvnw compile quarkus:dev
这将在开发模式下构建应用程序,允许实时重载(热重载)。
你可以按照终端上提供的说明进行导航。
Gradle。
和Gradle项目一样,运行。
./gradlew quarkusDev
在显示给终端的输出中,你会看到访问该应用程序的URL以及已安装的功能。
这在下面的图片中显示。
(作者的屏幕截图)
默认情况下,Quarkus在http://localhost:8080/ 请求时,将返回ecommerce-quarkus/src/main/resources/META-INF/resources/ 中的文件。
通常情况下,在那里找到的index.html 文件将是你的输出。使用浏览器或终端访问应用程序以查看输出。
浏览器。
在浏览器中,打开localhost:8080 或http://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/ 。这个功能只在开发模式下可用。
(作者的屏幕截图)
现在你可以通过点击Config Editor 按钮,轻松地使用界面为项目添加配置。
终端。
如果你有 curl安装,你可以在终端窗口中输入命令curl http://localhost:8080/hello ,将返回值作为输出。
将返回值改为Second hot reload! ,然后保存。现在,输出将自动利用热重载功能进行修改。
每当有请求被获取时,应用程序就会在终端记录该动作。
你还可以注意到,它正在利用 Vert.X框架,如下图所示。
(作者的屏幕截图)
什么是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'文件并删除依赖和其标签内的属性。
这些可能包括groupId和artifactId。
重新编译并重新构建应用程序。
运行端点的测试
运行在'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'和它的所有样式和脚本。
(作者的屏幕截图)
- 打开浏览器,通过
http://localhost:8080/。使用curl http://localhost:8080/,通过终端找到输出。 - 在交互式终端中使用
q或Ctrl + 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,连接到它。
(作者的屏幕截图)
现在,像以前一样,在终端窗口中获取一些终端的数据。
(作者的截图)
观察应用程序在以下指标方面的性能。
- 使用中的CPU线程
- CPU使用率
- 内存堆使用量
- MBeans
- 类,如下图所示。
你可以使用IntelliJ profiler ,作为查看Java进程甚至快照的JConsole substitute 。它位于你的状态栏中,如下图所示。
当你打开它时,它显示正在运行的JVM,如果你点击或右键点击任何一个,它将显示你的下拉选项。
(作者的屏幕截图)
可用的选项包括。CPU和内存实时图表,将剖析器附加到进程中(Java飞行记录器,Async剖析器),捕获内存快照,以及获得线程转储。
选择CPU memory live charts 选项。
(作者的屏幕截图)
在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应用程序。