在IT世界中,今天的极限就是明天的大门。在过去的50年里,IT世界不断演进,不知疲倦地不断突破自己的极限。这些变化不仅来源于技术进步,也来源于我们这些消费者。作为消费者,我们每天持续不断地在与软件交互的过程中获得越来越多的需求。此外,我们与软件交互的方式已经完全改变。我们的生活已经离不开移动应用程序和设备,现在我们整天都在接收通知。物联网(IoT)是一个新兴市场,随着不间断处理的事件和数据数量的增加,有希望带来更多创新。云计算和Kubernetes不仅改变了我们的使用方式,而且还从根本上改变了我们设计、开发、部署和维护应用程序的方式。
但是,所有这些变革都是有代价的。虽然新技术带来了新的方法和应用程序,但也引入了巨大的复杂性。当今大多数软件系统都是分布式系统。分布式系统的设计、构建和运行都是非常困难的,尤其是在我们实现这些新的现代应用程序所需的规模上。我们需要处理故障、异步通信、不断变化的拓扑结构、资源的动态可用性等。虽然云平台承诺拥有无限的资源,但支付云平台资源的资金是一个限制因素,并且在云平台上增加部署密度(意味着使用更少的资源运行更多的程序)成为一个紧迫的问题。
那么,响应式(Reactive)呢?响应式既不是代码中使用的库,也不是神奇的框架。响应式是一组原则、工具、方法论和框架,可以帮助构建更好的分布式系统。能有多好?这取决于具体的软件系统,但遵循响应式原则的应用程序会接受分布式系统的挑战,并将重点放在弹性、可伸缩性和响应式上,正如响应式宣言( https://oreil.ly/fO6n0 )中所解释的那样。
在本书中,我们使用名词响应式(Reactive)来聚合响应式场景的各个方面,例如响应式编程、响应式系统、响应式流等。通过学习本书,你将了解“响应式”将如何帮助我们面对这些新问题,以及“响应式”如何适应云环境。阅读本书后,你将能够构建具有弹性、适应性、事件驱动的分布式系统。
目标读者
本书面向中级和高级Java开发人员。如果你对Java相当熟悉,那就最好了。然而,阅读本书并不需要预先了解响应式编程,甚至不需要了解一般的响应式编程。虽然本书中的许多概念都与分布式系统有关,但你也不需要熟悉这些概念。
响应式系统通常依赖于Apache Kafka或高级消息队列协议(AMQP)等消息代理。本书介绍了消息代理的基本知识,有助于你设计和实现响应式系统。
三个不同的群体可以从本书中受益:
· 正在构建云原生应用程序或分布式系统的开发人员。
· 寻求了解响应式和事件驱动架构作用的架构师。
· 听说过“响应式”并希望更好地理解其概念和原理的开发人员。
通过本书,你将开始理解、设计、构建和实现响应式架构的旅程。你将不仅了解响应式架构如何帮助构建更好的分布式系统和云应用程序,还将了解如何使用响应式架构来改进现有系统。
Quarkus是什么
细心的读者会注意到本书英文标题的副标题中提到了Quarkus。Quarkus是为云平台量身定制的Java框架,使用构建时技术来减少应用程序使用的内存量,并提供快速启动时间。
但Quarkus也是一个响应式框架。在其核心功能中,响应式引擎可以创建并发的、有弹性的应用程序。Quarkus还提供构建分布式系统所需的所有功能,这些系统可以适应波动的负载和不可避免的故障。
在本书中,我们使用Quarkus程序演示了响应式方法的优势,并介绍了各种模式和最佳实践。
本书着重于创建基于Quarkus功能的响应式应用程序和系统,并提供构建此类系统所需的所有知识。我们不涵盖完整的Quarkus生态系统,因为本书主要关注帮助构建响应式系统的Quarkus组件。
本书组织结构
如果你刚刚发现了响应式,并想了解更多相关知识,那么从头到尾阅读本书将大有帮助。如果你是对Quarkus及其响应式功能感兴趣的经验丰富的响应式开发人员,则可以跳过本书的第一部分,直接阅读感兴趣的章节。
第一部分是简介和背景:
· 第1章简要概述响应式环境,包括其优点和缺点。
· 第2章介绍Quarkus及其减少启动时间和内存使用的构建时方法。
第二部分概述响应式:
· 第3章解释分布式系统的复杂性和误解,这些都是响应式出现的原因。
· 第4章介绍响应式系统的设计原则。
· 第5章介绍异步开发模型的各种形式,重点是响应式编程。
第三部分解释如何使用Quarkus构建响应式应用程序:
· 第6章讨论响应式引擎,并架起命令式编程和响应式编程的桥梁。
· 第7章深入探讨在Quarkus中使用的响应式编程库SmallRye Mutiny。
· 第8章解释HTTP请求的特征,以及我们如何使用HTTP实现响应式。
· 第9章解释如何使用Quarkus构建与数据库交互的高并发、高性能的应用程序。
第四部分将各个响应点连接起来,并介绍如何基于Quarkus构建响应式系统:
· 第10章深入讨论Quarkus应用程序与消息传递技术的集成,这是响应式系统的一个重要组成部分。
· 第11章重点介绍Quarkus与Apache Kafka和AMQP的集成,以及如何使用Apache Kafka和AMQP构建响应式系统。
· 第12章探讨从Quarkus应用程序中使用HTTP端点的各种方法,以及如何增强弹性和响应能力。
· 第13章介绍响应式系统中的可观测性问题,如健康检查、追踪和监控。
阅读准备
在本书中,你将会看到许多代码示例。这些代码示例说明了本书中涉及的概念。这些例子都是在IDE中运行的,有些是基本的,有些则需要几个先决条件。
我们在本书中逐一介绍了这些代码示例,网址为 https://github.com/cescoffier/reactive-systems-in-java 。你可以通过Git使用 git clone https://github.com/cescoffier/reactive-systems-in-java.git 获取代码,或者下载ZIP文件( https://oreil.ly/Ey74z )并解压缩。
代码按章节组织。例如,与第2章相关的代码可在 chapter-2 目录(见表P-1)中找到。根据章节的不同,代码可以分为多个模块。对于代码存储库中提供的示例,书中的代码段标题表明文件在存储库中的位置。
表P-1:每章代码位置
表P-1:每章代码位置(续)
代码库中的示例使用Java 11,因此请确保在计算机上安装了合适的Java开发工具包(JDK)。示例还使用Apache Maven作为构建工具。你不必安装Maven,因为存储库使用Maven Wrapper( https://oreil.ly/0oKc9 ;自动设置Maven)。但是,如果你想安装Apache Maven,请从Apache Maven Project网站( https://oreil.ly/XgiCr )下载,并按照操作说明( https://oreil.ly/nwJV9 )进行安装。
要构建代码,请从项目的根目录运行命令 mvn verify 。Maven将下载一组工件,所以一定要连接互联网。
本书将介绍Kubernetes原生Java框架Quarkus。只要有Java和Maven,就不需要安装任何其他东西来使用Quarkus。Quarkus会自动下载其他所有内容。
你需要使用Docker为应用程序创建容器,请按照Get Docker页面( https://oreil.ly/DjBnj )上的说明安装Docker。
最后,有几章说明了我们在Kubernetes中的响应式应用程序的部署。要部署到Kubernetes,首先需要 kubectl ,这是一个与Kubernetes交互的命令行工具。按照Kubernetes Install Tools页面( https://oreil.ly/4SA4J )中的说明进行安装。除非你手里已经有了Kubernetes集群,否则我们也建议你在机器上安装minikube,以提供Kubernetes环境。按照minikube网站( https://oreil.ly/vuCs1 )上的说明安装minikube。
为什么我们需要这些工具?在本书中,你将看到,响应式的行为不仅给应用程序增加了约束,也给基础设施增加了约束。Kubernetes提供了部署应用程序、创建副本和保持系统正常运行所需的原语。另外,Quarkus提供了实现响应式应用程序所需的一组功能,包括非阻塞I/O、响应式编程、响应式API和消息传递功能。Quarkus还提供与Kubernetes的集成,以简化应用程序的部署和配置。
表P-2列出了我们将在书中使用的工具。
表P-2:本书中使用的工具
排版约定
本书中使用以下排版约定:
斜体( Italic )
表示新术语、URL、电子邮件地址、文件名和文件扩展名。
等宽字体( Constant width )
用于程序列表,以及在段落中引用程序元素,如变量或函数名、数据库、数据类型、环境变量、语句和关键字。
等宽粗体( Constant width bold )
表示应由用户输入的命令或其他文本。
等宽斜体(Constant width italic)
表示应由用户输入的值或根据上下文确定的值替换的文本。
该图标表示提示或建议。
该图标表示一般性说明。
该图标表示警告或警示。
O'Reilly在线学习平台(O ' Reilly Online Learning)
40多年来,O'Reilly Media致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们拥有独一无二的专家和创新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O'Reilly的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及O'Reilly和200多家其他出版商提供的大量教材和视频资源。有关的更多信息,请访问 http://oreilly.com 。
如何联系我们
对于本书,如果有任何意见或疑问,请按照以下地址联系本书出版商。
美国:
O'Reilly Media,Inc.
1005 Gravenstein Highway North
Sebastopol,CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
要询问技术问题或对本书提出建议,请发送电子邮件至 errata@oreilly.com.cn 。
本书配套网站 https://oreil.ly/ReactiveSysJava 上列出了勘误表、示例以及其他信息。
关于书籍、课程的更多新闻和信息,请访问我们的网站 http://oreilly.com 。
我们在Facebook上的地址: http://facebook.com/oreilly
我们在Twitter上的地址: http://twitter.com/oreillymedia
我们在YouTube上的地址: http://youtube.com/oreillymedia
致谢
写一本书从来都不是那么容易的。这是一项漫长而艰巨的任务,需要耗费大量精力,并占用大量业余时间。因此,我们首先要感谢在这场马拉松比赛中支持我们的家人。
我们也很高兴能与红帽的杰出人士合作。在这段旅程中,无数人帮助了我们,这里无法全部列举出来。特别感谢:Georgios Andrianakis、Roberto Cortez、Stuart Douglas、Stéphane Epardaud、Jason Greene、Sanne Grinovero、Gavin King、Martin Kouba、Julien Ponge、Erin Schnabel、Guillaume Smet、Michal Szynkiewicz、Ladislav Thon和Julien Viet。他们的工作不仅出色,而且令人叹为观止。能与这样顶尖的开发人员合作是我们的荣幸。
最后,我们感谢所有提供了精彩而具有建设性反馈意见的审稿人:Mary Grygleski、Adam Bellemare、Antonio Goncalves、Mark Little、Scott Morrison、Nick Keune和Chris Mayfield。