Getting Started With Quarkus Microservices In Java
作者:禅与计算机程序设计艺术
1.简介
基于OpenJDK HotSpot VM和GraalVM之上运行的Java框架Quarkus具备轻量级、高性能以及开源的特点;同时支持云原生架构。它拥有强大的扩展性:能够通过市面上已有的开源组件构建出完整的应用;并且还提供命令行界面工具:可以快速创建项目、管理依赖并编译打包项目。与其它Java框架不同的是:支持开发RESTful API WebSockets GraphQL以及基于RPC的服务调用等微服务特性:使得开发者能够专注于业务逻辑的实现而不是基础设施细节。在本文中:我们将介绍Quarkus框架的基础知识及其应用:包括如何从头到尾创建一个简单而实用的微服务。通过学习本教程:读者将能够熟练掌握Quarkus框架的各种功能和用法
2.基础知识介绍
2.1 JDK版本及安装配置
必须先确认本地系统已安装 JDK 11及以上版本 并确保 JAVA_HOME 环境变量正确配置
javac 11.0.7
代码解读
2.2 Gradle版本及安装配置
为了使Quarkus框架能够顺利运行,本地系统必须安装 Gradle 6及更高版本的软件。如果本地系统已经预装了Gradle,则无需重复安装。否则,请访问该链接下载并安装最新版本的Gradle:https://gradle.org/install。
完成安装后
完成安装后
Gradle 6.7
代码解读
2.3 Quarkus CLI工具安装
为提升对与QUARKUS框架相关的工程文件进行有效管理的便捷性,在TERMINAL控制台中运行以下命令以完成QUARKUS CLI工具的安装:
npm install @ quarkus/cli -g
代码解读
在完成安装后, 可以通过执行quarkus list命令来列举所有可用的Quarkus指令. 例如, 在查看当前版本时
$ quarkus version
1.9.2.Final
代码解读
2.4 Maven仓库配置
因为Quarkus默认采用了Maven作为构建工具的缘故,为此需要配置相应的Maven仓库. 当前,QUIKUS推荐使用的具体信息如下: https://repo.maven.apache.org/maven2/.
为了提高效率和管理便利性, 建议将该Maven仓库加入到本地Maven配置文件中的user级别设置文件<maven:settings>中进行管理。具体步骤如下:首先, 在用户的项目目录下搜索.m2文件夹;如果未发现, 则需手动创建一个新的.m2目录. 然后, 在.mvn configure命令行界面中执行相关配置操作. 随后, 在<maven:settings>中新增一个子标签<maven:custom-settings>, 并根据需求填写必要的参数设置.
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
<!-- mirror added by wuxiaoyu -->
<mirror>
<id>nexus</id>
<name>Nexus Mirror Repository Manager</name>
<url>http://xxxxx:8081/repository/maven-public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
</settings>
代码解读
在其中,在项目开发中,请您特别提醒:在配置时,请确保您提供的所有敏感信息均经过加密处理,并避免将此类信息暴露在公共环境中。
3. Quarkus框架简介
3.1 为什么要使用Quarkus?
在传统的Java开发模式中,通常依赖Spring Boot等主流框架来构建应用。这些框架为开发者提供了丰富的工具库和接口支持快速搭建功能完善的应用程序。然而,在云技术快速发展的背景下,微服务架构逐渐成为主流技术路线。这使得单一的应用系统被分解为多个独立的服务模块运行。对于大型复杂的分布式系统而言,在设计和服务实现层面都需要对依赖的第三方库和数据库资源进行有效的管理与配置。
Quarkus是一个新型框架,旨在帮助开发者克服这些挑战.基于GraalVM构建了其运行时,通过高效的JIT编译器实现了性能优化.同时,该框架还并基于传统的JVM构建了另一个运行时.其特色包括集成了一种响应式编程模型,内置了一种嵌入式Web服务器,支持Reactive Messaging技术,提供健康检查功能以及HTTP/2兼容性等.此外,这一解决方案显著提高了开发人员的工作效率和整体开发体验.
3.2 Quarkus架构图
如图所示, Quarkus系统主要由两个关键组件构成:核心构建工具Quarkus Core和运行时GraalVM. 其中,核心构建工具Quarkus Core的主要职责是实现编译、打包以及应用测试功能;而运行时GraalVM则负责实际应用的运行. Quarkus Core的核心构建工具基于Eclipse JKube平台进行开发,该平台采用Kubernetes技术搭建容器化架构. 当利用Quarkus Core进行开发部署时,系统会自动生成两种类型的应用包文件:一个是独立的应用包(app jar),另一个是依赖关系所需公共库(dependency jar).
该应用的jar文件是一种fat类型,在其内部包含了经过编译的Java bytecode代码块、元数据信息以及一系列第三方依赖项和非Java资源项。这些第三方依赖项是在构建过程中生成的一次性依赖项,在实际部署过程中会将这些临时依赖项复制到运行时环境中。
运行时GraalVM基于OpenJDK HotSpot虚拟机,并通过编译器优化字节码以提升启动速度和内存占用效率。Quarkus提供了多种扩展功能模块来增强应用程序的行为控制能力。具体而言,在应用初始化阶段可通过一个Bootstrap类配置必要的全局变量或资源;在应用运行后可为特定事件注册相应的监听器;当应用程序发生异常时则允许自定义专门的错误处理流程。
3.3 Quarkus应用生命周期
如上图所示,Quarkus应用的生命周期分为四个阶段:构建、运行、测试、发布。
在构建阶段,开发人员会编写代码模块,并设定运行时环境参数以及创建配置文件设置等操作。Quarkus解析器会对代码进行解析处理,并将处理结果压缩成可执行jar包形式,在此过程中还会执行单元测试以验证系统的健壮性。此外,在构建完成后会自动生成对应的可执行jar文件以供部署使用
在运行阶段期间,在Quarkus运行时系统会从外部依赖库中加载所需Java虚拟机程序包(JAR文件),并开始服务进程以支持该Web应用程序。
GraalVM被指定为该环境中的JVM实现,并同时激活一个嵌入式Web服务器用于处理网络请求的Web服务器内核。
在开发项目的后期阶段,在指导员的支持下对系统进行全面评估,并根据实际结果采取相应措施;同时,在软件进入最终部署阶段前,在集成环境内对系统进行全面验证;当遇到复杂问题时,在开发团队的支持下可以在本地或远端配置相应的工具完成问题排查。
在发布阶段中, 开发人员可以将应用上传至Quarkus云端平台.借助基于CI/CD的流程自动生成构建, 测试及部署.该平台集成了构建服务(Build Service)、测试服务(Test Service)、发布管理.Release Management)以及日志分析功能模块.借助该平台的服务功能, 在线版本更新无需等待;采用灰度发布策略时可同时保障用户体验;同时提供实时监控功能以跟踪应用程序的状态变化.
4. 创建第一个Quarkus应用
在本节中我们将致力于搭建一个基础型的Quarkus应用旨在帮助我们掌握其基本架构与开发流程
4.1 创建Quarkus项目
在命令行窗口执行以下命令创建名为hello-world的Quarkus项目:
mvn io.quarkus:quarkus-maven-plugin:1.9.2.Final:create \
-DprojectGroupId=cn.itcast.demo \
-DprojectArtifactId=hello-world \
-DclassName="cn.itcast.demo.HelloWorldResource" \
-Dpath="/hello"
代码解读
该命令将创建一个名为hello-world项目的工程,并且其中包含了两个Java源文件:HelloWorldResource和Application。
4.2 配置Quarkus
为了使我们的第一个Quarkus应用能够正常运行,我们需要对Quarkus进行配置。其配置文件名为application.properties,在src/main/resources目录下的META-INF子目录中。在默认情况下,默认名称为quarkus.properties;此外还可以根据需求自定义命名。
打开配置文件,我们需要添加以下配置:
quarkus.http.port=8080
代码解读
这是告诉Quarkus HTTP服务器监听8080端口。
4.3 编写Quarkus资源
在已构建的项目环境中,该Java文件的名称为src/main/java/cn/itcast/demo/HelloWorldResource.java,它包含了实现一个基本的Hello World RESTful资源的功能。
package cn.itcast.demo;
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 HelloWorldResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello World";
}
}
代码解读
这个资源通过@注解配置了访问路径"/hello"。它提供了一个名为的方法,在这里被标记为HTTP GET方法。该方法通过指定返回的媒体类型MediaType.TEXT_PLAIN来说明其输出数据格式为文本/plain。该方法仅包含一条指令:输出'Hello World';返回值为字符串类型。
4.4 添加依赖
为了启动Quarkus应用,必须配置其依赖关系。在pom.xml文件中找到并配置所有必要的依赖项。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-vertx</artifactId>
</dependency>
代码解读
在Quarkus框架中,默认配置通常会包含io.quarkus:quarkus-resteasy和io.quarkus:quarkus-vertx这两个核心组件。这些核心组件不仅实现了RESTful API服务的核心功能,并且支持异步操作以提高处理效率。
4.5 编译运行Quarkus应用
编译并运行Quarkus应用非常简单。在命令行窗口执行以下命令:
./mvnw compile quarkus:dev
代码解读
该指令用于执行清理和打包操作;而quarkus:dev命令旨在开启开发环境。当编译完成后,默认情况下应用将启动,并开始监听8080端口以接收外部请求。
启动浏览器窗口并访问地址http://localhost:8080/hello后,在该页面上发现显示World字样时,则表明我们已经成功运行了第一个Quarkus应用。
5. Quarkus扩展机制
Quarkus借助其扩展机制实现多种功能特性, 从而让开发者能够轻松地拓展应用程序的功能. Quarkus官方网站则提供了丰富的资源库, 方便开发者查阅和参考 https://github.com/quarkusio/quarkus/tree/master/extensions .
在这一小节,我们将演示如何通过扩展机制来实现一个计数器功能。
5.1 扩展机制概述
灵活的设计使得扩展变得更为便捷;支持开发者轻松地将自开发的功能模块集成到Quarkus系统中;当Quarkus初始化时会自动识别可用的扩展并整合其功能组件
Quarkus共分为三大类扩展:
Core Add-ons:These are among the most fundamental extensions in Quarkus, comprising JDBC Driver, Logging, Security, and Configuration components.
-
标准扩展:Quarkus中的高级功能模块包含RESTEasy、JSON-B、Hibernate ORM、Messaging以及Smallrye Health等技术
-
社区扩张:由Quarkus社区开发者自愿贡献的一系列增强功能模块。其中相当数量的第三方库都提供了针对Quarkus框架的具体实现与支持。例如,在Mongodb客户端中使用Mongodb Client Quarkus扩展能够实现所需功能。
为了达成计数器功能的目的, 我们依赖于Core Extensions提供的Counted元注解工具. 这是一个元注解工具, 用于标记需进行计数的类. 方法和字段. 接着, 则可以通过该元注解工具来标注需进行计数的各类别.
5.2 安装Counted扩展
Quarkus 的计数结果包含 quarkus-extension-processor 和 quarkus-arc 两个坐标点
在pom.xml文件中,添加以下依赖:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-extension-processor</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-arc</artifactId>
</dependency>
代码解读
在其中情况下,quarkus-extension-processor基于javac提供的注解处理机制运作。因此必须配置quarkus-extension-processor的scope属性,并将其设置为provided。
5.3 使用Counted扩展
建立一个命名为Counter的对象,并配置@Counted注解机制,以确保所有需要进行计数的对象都能被正确识别。
import io.quarkus.arc.annotations.Counted;
@Counted(value = "my-counter", name = "the-count", description = "This is a test counter.")
public class Counter {
private int count;
public void increment() {
++count;
}
public int getCount() {
return count;
}
}
代码解读
在该类中، 我们创建了一个计数器, 并调用increment方法对其执行递增操作. 同时, 在该类及其相关成员(如方法和字段)上应用了@Counted注解. 其中: - value参数指定的是该计数器的唯一标识符; - name参数指定的是该计数器的名字; - description参数提供了关于该计数器的描述信息.
5.4 修改配置文件
为了实现计数器的正常运行, 我们还需要对应用配置文件application.properties进行相应设置。具体配置如下:
quarkus.arc.unremovable-types=.*Counter
代码解读
这个配置项通过Quarkus识别为我们的Counter类,并使该类被管理
5.5 测试计数器
最后一步我们可以通过编写一系列单元测试用例来验证计数器的功能
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@QuarkusTest
public class CounterTest {
@Inject
Counter counter;
@Test
public void testGetCount() {
Assertions.assertEquals(0, counter.getCount());
counter.increment();
counter.increment();
Assertions.assertEquals(2, counter.getCount());
counter.increment();
Assertions.assertEquals(3, counter.getCount());
}
}
代码解读
在该类中, 我们引入了Counter实例, 并通过@Test标记声明了一个名为testGetCount的方法. 该方法依次向计数器推送三次自增指令, 并随后检查所得计数值是否符合预期.
运行单元测试:
./mvnw test
代码解读
如果所有的测试都通过了,那就证明计数器功能正常工作。
