Quarkus 如何结合命令式和反应式编程

今年我们计划认真开发容器主题, 云原生Java и Kubernetes。 这些主题的逻辑延续将是关于 Quarkus 框架的故事,已经 经过考虑的 关于哈布雷。 今天的文章不是关于“亚原子超快 Java”的设计,而是更多关于 Quarkus 为 Enterprise 带来的承诺。

Quarkus 如何结合命令式和反应式编程

Java 和 JVM 仍然非常流行,但是在使用无服务器技术和云原生微服务时,Java 和其他 JVM 语言的使用越来越少,因为它们占用太多内存空间并且加载太慢,使得它们不太适合与短期容器一起使用。 幸运的是,由于 Quarkus,这种情况现在开始改变。

超快亚原子 Java 已达到新水平!

42 个版本、8 个月的社区工作和 177 名出色的开发人员 - 这一切的结果就是 2019 年 XNUMX 月的发布 夸库斯 1.0,这个版本标志着项目开发的一个重要里程碑,并提供了许多很酷的特性和功能(您可以在 公告).

今天,我们将向您展示 Quarkus 如何将命令式和反应式编程模型组合到单个反应式核心中。 我们将从简短的历史开始,然后详细介绍 Quarkus 的反应式核心二元论是什么以及如何实现 爪哇岛- 开发人员可以利用这些好处。

微服务, 事件驱动架构 и 无服务器-功能——正如他们所说,今天所有这些都在增加。 最近,以云为中心的架构的创建变得更加容易和容易实现,但问题仍然存在——特别是对于 Java 开发人员而言。 例如,在无服务器功能和微服务的情况下,迫切需要减少启动时间,减少内存消耗,同时仍然使它们的开发更加方便和愉快。 Java 近年来做出了一些改进,例如改进了容器的人体工程学功能等。 然而,让 Java 在容器中正常工作仍然具有挑战性。 因此,我们将首先了解 Java 的一些固有的复杂性,这些复杂性在开发面向容器的 Java 应用程序时尤其严重。

首先,让我们回顾一下历史。

Quarkus 如何结合命令式和反应式编程

流和容器

从8u131版本开始,由于人体工学功能的改进,Java开始或多或少地支持容器。 特别是,JVM 现在知道它运行在多少个处理器核心上,并且可以相应地配置线程池(通常是 fork/join 池)。 当然,这很棒,但是假设我们有一个使用 HTTP servlet 并在 Tomcat、Jetty 等中运行的传统 Web 应用程序。 因此,该应用程序将为每个请求提供一个单独的线程,并允许其在等待 I/O 操作时(例如,在访问数据库、文件或其他服务时)阻塞该线程。 也就是说,此类应用程序的大小不取决于可用核心的数量,而是取决于同时请求的数量。 此外,这意味着 Kubernetes 中对核心数量的配额或限制在这里不会有太大帮助,事情最终将以节流告终。

内存耗尽

线程是内存。 而且容器内内存限制绝不是万能的。 只要开始增加应用程序和线程的数量,迟早您会遇到切换频率的急剧增加,从而导致性能下降。 此外,如果您的应用程序使用传统的微服务框架,或者连接到数据库,或者使用缓存,或者以其他方式耗尽内存,那么您显然需要一个工具,可以让您查看 JVM 内部并了解它如何管理内存而不杀死它。 JVM 本身(例如,XX:+UseCGroupMemoryLimitForHeap)。 尽管自 Java 9 以来,JVM 已经学会接受 cgroup 并进行相应调整,但保留和管理内存仍然是一个相当复杂的问题。

配额和限制

Java 11 引入了对 CPU 配额的支持(如 PreferContainerQuotaForCPUCount)。 Kubernetes 还提供对限制和配额的支持。 是的,这一切都是有道理的,但是如果应用程序再次超出分配的配额,我们最终会再次得到大小(与传统 Java 应用程序的情况一样),该大小由核心数量以及为每个核心分配一个单独的线程决定。请求,那么这一切就没有意义了。
另外,如果使用配额和限制或者Kubernetes底层平台的横向扩展功能,问题也无法自行解决。 我们只是花费更多的资源来解决原来的问题,否则最终会超支。 如果它是公共公共云中的高负载系统,我们几乎肯定最终会使用比我们真正需要的更多的资源。

面对这一切该怎么办?

简单来说,就是使用像Netty这样的异步非阻塞I/O库和框架, 顶点.x 或阿卡。 由于其反应性,它们更适合在容器中工作。 由于非阻塞 I/O,同一线程可以同时处理多个请求。 当一个请求正在等待 I/O 结果时,处理该请求的线程将被释放并由另一请求接管。 当 I/O 结果最终到达时,第一个请求的处理将继续。 通过在同一线程内交错处理请求,可以减少线程总数并减少处理请求的资源消耗。

对于非阻塞 I/O,核心数量成为关键参数,因为它决定了可以并行执行的 I/O 线程数量。 如果使用正确,您可以有效地在内核之间分配负载,并用更少的资源处理更高的工作负载。

怎么样,就这些了吗?

不,还有别的事。 响应式编程有助于更好地利用资源,但也是有代价的。 特别是,必须根据非阻塞原则重写代码,并避免阻塞 I/O 线程。 这是一种完全不同的开发和执行模型。 而且虽然这里有很多有用的库,但这仍然是对通常思维方式的彻底改变。

首先,您需要学习如何编写异步运行的代码。 一旦开始使用非阻塞 I/O,您需要显式指定收到请求响应时应发生的情况。 简单的阻塞和等待将不再起作用。 相反,您可以传递回调、使用反应式编程或延续。 但这还不是全部:要使用非阻塞 I/O,您需要非阻塞服务器和客户端,最好是无处不在。 就 HTTP 而言,一切都很简单,但还有数据库、文件系统等等。

尽管端到端的总反应性可以最大限度地提高效率,但这种转变在实践中可能难以接受。 因此,结合反应式代码和命令式代码的能力成为以下先决条件:

  1. 有效利用软件系统负载最重区域的资源;
  2. 在其余部分使用更简单的样式代码。

夸库斯简介

实际上,这就是 Quarkus 的本质——在单个运行时环境中结合反应式模型和命令式模型。

Quarkus 基于 Vert.x 和 Netty,具有一系列响应式框架和扩展来帮助开发人员。 Quarkus 不仅设计用于构建 HTTP 微服务,还用于构建事件驱动的架构。 由于其反应性质,它可以非常有效地与消息系统(Apache Kafka、AMQP 等)配合使用。

诀窍是如何对命令式代码和反应式代码使用相同的反应式引擎。

Quarkus 如何结合命令式和反应式编程

Quarkus 在这方面做得非常出色。 命令式和反应式之间的选择是显而易见的 - 两者都使用反应式内核。 它真正有帮助的是快速、非阻塞的代码,可以处理通过事件循环线程(又名 IO 线程)的几乎所有内容。 但如果您有经典的 REST 或客户端应用程序,Quarkus 已经准备好了命令式编程模型。 例如,Quarkus 中的 HTTP 支持基于非阻塞和反应式引擎(Eclipse Vert.x 和 Netty)的使用。 应用程序接收到的所有 HTTP 请求首先通过事件循环(IO 线程)传递,然后发送到管理请求的代码部分。 根据目的地,可以在单独的线程(所谓的工作线程,在 servlet 和 Jax-RS 的情况下使用)中调用请求管理代码,或者使用源 I/O 线程(反应式路由)。

Quarkus 如何结合命令式和反应式编程

消息系统连接器使用在 Vert.x 引擎之上运行的非阻塞客户端。 因此,您可以有效地发送、接收和处理来自消息中间件系统的消息。

该网站 Quarkus.io 这里有一些很好的教程可以帮助您开始使用 Quarkus:

我们还创建了在线实践教程,教您在浏览器中进行反应式编程的各个方面,无需 IDE,也不需要计算机。 你可以找到这些课程 这里.

有用的资源

10 个关于 Quarkus 的视频课程,帮助您熟悉该主题

正如他们在网站上所说 Quarkus.io, 夸库斯 - Kubernetes面向 Java 堆栈,专为 GraalVM 和 OpenJDK HotSpot 量身定制,并由最佳 Java 库和标准组装而成。

为了帮助您理解该主题,我们选择了 10 个视频教程,涵盖 Quarkus 的各个方面及其使用示例:

1. Quarkus 简介:Kubernetes 的下一代 Java 框架

作者:托马斯·Qvarnstrom 和杰森·格林
Quarkus 项目的目标是为 Kubernetes 和无服务器环境创建一个 Java 平台,并将反应式和命令式编程模型组合到单个运行时环境中,以便开发人员在使用各种分布式应用程序架构时可以灵活地改变他们的方法。 在下面的介绍性讲座中了解更多信息。

2. Quarkus:超快亚原子 Java

作者:布尔·萨特
DevNation Live 的这个视频教程演示了如何使用 Quarkus 在 Kubernetes/OpenShift 环境中优化企业 Java 应用程序、API、微服务和无服务器功能,使其更小、更快且更具可扩展性。

3. Quarkus 和 GraalVM:将 Hibernate 加速到超高速并将其缩小到亚原子大小

作者:桑尼·格里诺韦罗
从演示中,您将了解 Quarkus 的诞生、它的工作原理以及它如何允许您创建与本机 GraalVM 映像兼容的复杂库(例如 Hibernate ORM)。

4. 学习开发无服务器应用程序

作者:马丁·路德
下面的视频展示了如何使用 Quarkus 创建一个简单的 Java 应用程序,并将其部署为 Knative 上的无服务器应用程序。

5. Quarkus:享受编码的乐趣

作者:埃德森·柳永
创建您的第一个 Quarkus 项目的视频指南,让您了解 Quarkus 为何赢得开发者的青睐。

6. Java 和容器——它们的未来会怎样

马克·利特尔发表
本演讲介绍了 Java 的历史,并解释了为什么 Quarkus 是 Java 的未来。

7. Quarkus:超快亚原子 Java

作者:迪米特里斯·安德烈亚迪斯
概述了 Quarkus 获得开发者认可的优势:简单、超高速、最好的库和标准。

8.夸克和亚原子火箭系统

作者:克莱门特·埃科菲
通过与 GraalVM 的集成,Quarkus 提供了超快速的开发体验和亚原子运行时环境。 作者讨论了 Quarkus 的反应式方面以及如何使用它来构建反应式和流式应用程序。

9. Quarkus 和 Eclipse MicroProfile 中的快速应用程序开发

作者:约翰·克林根
通过结合 Eclipse MicroProfile 和 Quarkus,开发人员可以创建功能齐全的容器化 MicroProfile 应用程序,并在数十毫秒内启动。 该视频详细介绍了如何编写容器化 MicroProfile 应用程序以在 Kubernetes 平台上部署。

10.Java,“Turbo”版本

作者:马库斯·贝尔
作者展示了如何使用 Quarkus 创建超小型、超快速的 Java 容器,从而实现真正的突破,尤其是在无服务器环境中。



来源: habr.com

添加评论