微服务中如何使用API组合模式进行查询?

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 本文选自 《微服务架构设计模式》 一书。

本文选自 《微服务架构设计模式》 一书。

在微服务架构中编写查询非常具有挑战性。查询通常需要检索分散在多个服务所拥有的数据库中的数据。但是,你不能使用传统的分布式查询处理机制,因为即使技术上可行,它也会打破服务之间的隔离和封装。下面将介绍一种在微服务架构中实现查询操作的最简单方法——API组合模式。

什么是 API 组合模式

这个模式通过调用拥有数据的服务并组合结果来实现查询操作。下图显示了该模式的结构。它有两种类型的参与者:

  1. API组合器:它通过查询数据提供方的服务来实现查询操作。
  2. 数据提供方服务:拥有查询返回的部分数据的服务。

上图显示了三个提供方服务。API 组合器通过从提供方服务检索数据并组合结果来实现查询。API 组合器可能是需要数据呈现网页的客户端,例如 Web 应用程序。或者,它可能是一个服务,例如 API Gateway 及后端前置模式 ,这个模式将查询操作公开为 API 接口。

image.png

是否可以使用此模式实现特定查询操作取决于几个因素,包括数据的分区方式、拥有数据的服务公开的 API 的功能,以及服务使用数据库的功能,等等。例如,即使提供方服务拥有用于检索所需数据的 API,聚合器也可能需要执行大量数据集的低效内存连接。稍后,你将看到使用此模式无法实现查询操作的例子。但幸运的是,有许多场景可以应用这种模式。为了看到它的实际效果,我们来举个例子。

使用 API 组合模式实现 findOrder() 查询操作

findOrder() 查询操作相当于一个简单的基于主键的 equi-join 查询。可以假设每个提供方服务都有一个 API接口,用于通过 orderId 检索所需的数据。因此,采用 API 组合模式来实现 findOrder() 查询操作似乎是合情合理的。API 组合器调用四个服务并将结果组合在一起。下图显示了Find Order Composer的设计。

image.png

显而易见,API 组合模式非常简单。让我们看一下在应用此模式时必须解决的几个设计问题。

API 组合模式的设计缺陷

使用此模式时,你必须解决两个设计问题:

  • 确定架构中的哪个组件是查询操作的 API 组合器。
  • 如何编写有效的聚合逻辑。

让我们看看每个问题。

由谁来担任 API 组合器的角色

这是你必须做出的一个决定,选择由谁来扮演查询操作的 API 组合器这个角色。你有三个选择。第一个选择,如下图所示,是由服务的客户端扮演 API 组合器的角色。

image.png

实现 Order Status 视图并在同一局域网上运行的前端客户端(如 Web 应用程序)可以使用此模式有效地检索订单详细信息。对于防火墙之外的客户以及通过较慢网络访问的服务,此选择可能不实用。

第二个选择如下图所示,由实现应用程序外部 API 的 API Gateway 来扮演 API 组合器的角色,用来完成查询操作和查询结果的组合。

image.png

如果查询操作是应用程序外部 API 的一部分,则此选择有意义。API Gateway 不是将请求路由到另一个服务,而是实现 API 组合逻辑。这种方法使得在防火墙外运行的客户端(例如移动设备)能够通过单个 API 调用有效地从众多服务中检索数据。

第三个选择如下图所示,是将 API 组合器实现为独立的服务。

image.png

此选择可以用于由多个服务在内部使用的查询操作。此操作还可用于外部可访问的查询操作,由于它们的聚合逻辑过于复杂,因此无法在 API Gateway 中完成查询,必须使用单独的服务。

API 组合器应该使用响应式编程模型

在开发分布式系统时,我们一直努力降低服务之间的延迟。API 组合器应尽可能地并行调用提供方服务,最大限度地缩短查询操作的响应时间。例如,Find Order Aggregator 应该同时调用这四个服务,因为调用之间没有依赖关系。但有时,API 组合器需要一个提供方服务的结果才能调用另一个服务。在这种情况下,它需要按顺序调用一部分(但希望不是全部)提供方服务。

高效执行顺序和并行服务调用混合的逻辑可能很复杂。为了使 API 组合器达到较高的可维护性、性能和可扩展性,它应该使用基于 Java CompletableFuture、RxJava 可观测或其他类似的响应式设计。我将在后面讲 API Gateway 模式的时候再深入讨论这个主题。

API 组合模式的好处和弊端

此模式是在微服务架构中实现查询操作的简单直观方式。但它也有一些缺点:

增加了额外的开销。

带来可用性降低的风险。

缺乏事务数据一致性。

我们来逐一分析。

增加了额外的开销

这种模式的一个缺点是它需要调用多个服务和查询多个数据库,这带来了额外的开销。在单体应用程序中,客户端可以使用单个请求检索数据,这通常会执行单个数据库查询。相比之下,使用 API 组合模式会涉及多个请求和多个数据库查询。因此,它需要更多计算和网络资源,运行应用程序的成本也相应增加。

带来可用性降低的风险

这种模式的另一个缺点是导致可用性降低。如第 3 章所述,操作的可用性随着所涉及的服务数量而下降。因为查询操作的实现涉及至少三个服务:API 组合器和至少两个提供方服务,其可用性将显著小于单个服务的可用性。例如,如果单个服务的可用性为 99.5%,则调用四个提供方服务的 findOrder() 接口的可用性为 99.5%(4+1)=97.5% !

你可以使用几种策略来提高可用性。一种策略是 API 组合器在提供方服务不可用时,返回先前缓存的数据。API 组合器有时会缓存提供方服务返回的数据,以提高性能。它还可以使用此缓存来提高可用性。如果提供方服务不可用,则 API 组合器可以从缓存中返回数据,尽管这些缓存数据可能是过时的。

另一种提高可用性的策略是让 API 组合器返回不完整的数据。例如,假设KitchenService 暂时不可用。findOrder() 查询操作的 API 组合器可以从响应中省略该服务的数据,因为用户界面仍然可以显示其他有用的信息。你将在后面一章中看到有关 API 设计、缓存和可靠性的更多详细信息。

缺乏事务数据一致性

API 组合模式的另一个缺点是缺乏数据一致性。单体应用程序通常使用一个数据库事务执行查询操作。ACID 事务受制于隔离级别的约束,可以确保应用程序具有一致的数据视图,即使它执行多个数据库查询。相反,API 组合模式则是针对多个数据库执行查询。这种方式
存在一种风险,即查询操作将返回不一致的数据。

例如,从 Order Service 检索的 Order 可能处于 CANCELED 状态,而从 Kitchen Service 检索的相应 Ticket 可能尚未取消。API 组合器必须解决这种差异,因为这会增加代码复杂性。更糟糕的是,API组合器可能无法总是检测到不一致的数据,并将其返回给客户端。尽管存在这些缺点,API 组合模式还是非常有用的。你可以使用它来实现许多查询操作。但是有一些查询操作无法使用此模式有效实现。

以上内容摘自《微服务架构设计模式》一书。

文章来源:微信公众号 江南一点雨

目录
相关文章
|
5天前
|
Cloud Native API
微服务引擎 MSE 及云原生 API 网关 2024 年 9 月产品动态
微服务引擎 MSE 及云原生 API 网关 2024 年 9 月产品动态。
|
8天前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
46 3
|
12天前
|
缓存 监控 API
探索微服务架构中的API网关模式
【10月更文挑战第5天】随着微服务架构的兴起,企业纷纷采用这一模式构建复杂应用。在这种架构下,应用被拆分成若干小型、独立的服务,每个服务围绕特定业务功能构建并通过HTTP协议协作。随着服务数量增加,统一管理这些服务间的交互变得至关重要。API网关作为微服务架构的关键组件,承担起路由请求、聚合数据、处理认证与授权等功能。本文通过一个在线零售平台的具体案例,探讨API网关的优势及其实现细节,展示其在简化客户端集成、提升安全性和性能方面的关键作用。
45 2
|
16天前
|
存储 缓存 监控
探索微服务架构中的API网关模式
【10月更文挑战第1天】探索微服务架构中的API网关模式
48 2
|
11天前
|
设计模式 API 开发者
探索现代后端开发:微服务架构与API设计
【10月更文挑战第6天】探索现代后端开发:微服务架构与API设计
|
2天前
|
监控 负载均衡 API
Web、RESTful API 在微服务中有哪些作用?
在微服务架构中,Web 和 RESTful API 扮演着至关重要的角色。它们帮助实现服务之间的通信、数据交换和系统的可扩展性。
9 2
|
12天前
|
数据采集 人工智能 自然语言处理
Python实时查询股票API的FinanceAgent框架构建股票(美股/A股/港股)AI Agent
金融领域Finance AI Agents方面的工作,发现很多行业需求和用户输入的 query都是和查询股价/行情/指数/财报汇总/金融理财建议相关。如果需要准确的 金融实时数据就不能只依赖LLM 来生成了。常规的方案包括 RAG (包括调用API )再把对应数据和prompt 一起拼接送给大模型来做文本生成。稳定的一些商业机构的金融数据API基本都是收费的,如果是以科研和demo性质有一些开放爬虫API可以使用。这里主要介绍一下 FinanceAgent,github地址 https://github.com/AI-Hub-Admin/FinanceAgent
|
10天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 09 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
|
15天前
|
API 微服务
Traefik 微服务 API 网关教程(全)
Traefik 微服务 API 网关教程(全)
|
19天前
|
监控 测试技术 API
如何确保微服务的API版本控制策略能够适应不断变化的业务需求?
如何确保微服务的API版本控制策略能够适应不断变化的业务需求?