翻译: 白石(https://github.com/wjw465150/Vert.x-in-Action-ChineseVersion)
本章涵盖了
- 回调及其限制,如网关/边缘服务示例所示
- Futures 和 Promise - 链接异步操作的简单模型
- 反应式扩展 - 一种更强大的模型,特别适合组合异步事件流
- Kotlin 协程 - 对异步代码执行流程的语言级支持
在开发响应式应用程序时,您将需要编写各种各样的业务逻辑,并不是所有的逻辑都很容易用异步形式表示。虽然回调是异步事件通知的一种简单形式,但它们很容易使异步代码变得复杂。
让我们看一个真实的例子,说明为什么回调并不总是最好的异步编程模型。 然后我们将探索 Vert.x 支持的多个选项。
5.1 组合异步操作:边缘服务示例
我们将以一个“边缘服务”为例来说明如何使用不同的异步编程模型组合异步操作。
边缘服务也经常被称为 API 网关。 它是一种服务,作为其他服务的外观,因此请求者只需处理一个服务接口,而不必与每个服务进行对话。 边缘服务还可以执行其他任务,例如数据转换和与其他服务交互,因此它不仅仅是方便地聚合来自多个服务的数据。
5.1.1 场景
让我们回到我们在第 3 章中使用的热传感器 Verticle。假设我们有几个热传感器,并且我们想要公开一个 API 来获取和聚合所有传感器的热数据。 这是一个非常简单但有效的边缘服务示例,因为它抽象了请求者了解和联系所有传感器的需求。 为了让事情变得更有趣,我们还将有一个 snapshot 服务,在传感器值返回给请求者之前捕获并记录它们。 整个场景如图 5.1 所示。
请求者向边缘服务发出请求,边缘服务又从传感器服务中获取温度数据。 每个传感器都公开一个 HTTP/JSON API,边缘服务将所有响应聚合在一个更大的 JSON 文档中。
然后将该文档发送到快照服务,然后再发送回请求者。 交互过程总结在 图5.2 中。
这个例子允许我们推理并行和顺序操作:
- 并行异步操作:获取热传感器数据
- 顺序异步操作:聚合热传感器数据,发送到快照服务,然后返回给请求者
5.1.2 热传感器verticles
我们可以将我们的热传感器部署为多个独立的进程,每个进程都公开一个 HTTP API。 为了简化我们的示例,我们将在同一进程中部署它们,尽管 HTTP 服务器侦听不同的 TCP 端口。
下面的 HeatSensor 类是对我们之前使用的类的简单改编。 清单 5.1 显示了该类的前面一些代码,直接从第 3 章中的代码移植而来。
代码保持相同的随机更新温度逻辑,随机延迟在 1 到 6 秒之间。
以下清单显示了为公开 HTTP API 而添加的代码。
这是对 Vert.x HTTP 服务器的非常直接的使用,HTTP 端口通过配置传递。 响应以 JSON 编码。
5.1.3 快照服务verticle
快照服务也公开了一个 HTTP 服务器,如下面的清单所示。
HTTP 请求处理程序需要一个 HTTP POST 请求,使用主体处理程序提取主体,并记录接收到的数据。
定义了这两个 Verticle,现在可以开始有趣的事情了,我们可以考虑制作我们的边缘服务。