您是否在如何在微服务架构中管理数据方面遇到过挑战?在本文中,我们研究了传统方法,并介绍了数据API网关(有时也称为“数据网关”),这是一种新型的数据基础设施。我们探索了数据API网关的功能,为什么您应该实现它,以及如何将其应用于您的架构。
传统的数据服务模式
首先,让我们考虑一下如何在微服务架构中管理数据。常见的模式是执行“CRUD”(创建、读取、更新、删除)操作的数据服务层。例如,考虑图1所示的名义酒店预订申请。
*图1:示例微服务架构中的数据服务*
这种微服务架构包括一层数据服务,用于管理特定数据类型,包括酒店、费率、库存、预订和客人,以及一层业务服务,实施购物和预订等特定流程。业务服务为Web和移动应用程序提供了主要接口,并将数据的存储和检索委托给数据服务。数据服务负责在基础数据库上执行CRUD操作。
虽然有很多方法可以集成和安排这些服务之间的交互,但自面向服务架构(SOA)的早期以来,分离负责数据和业务逻辑的服务的基本模式就一直存在。
识别、设计和实施数据服务
开发这些微服务的典型方法包括以下步骤:
- 使用域驱动设计等技术识别管理域中特定数据类型的服务。有关域驱动设计、服务识别和数据建模之间相互作用的更多信息,请参阅Cassandra第7章 ,最终指南:第3版。
- 设计服务,包括API和模式,以管理分配的数据类型。每个单独的服务都是特定数据类型的主要所有者,负责数据存储、检索和潜在的消息传递或流。我们将在下面详细介绍这对数据库选择的影响。
- 使用选定的语言和框架实施服务。在Java世界中,Spring Boot等框架可以轻松地使用嵌入式HTTP服务器构建服务,然后打包到虚拟机或容器中。Quarkus是一个最新的框架,可以在单个CI工作流中构建、测试和容器化服务。
数据服务和多语言持久性
许多早期的SOA架构包括与单个遗留关系数据库模式交互的服务。由此造成的一个不幸后果是倾向于“按数据库集成”,服务可以自由读写多个表。这种缺乏强大的所有权往往会导致难以调试的数据完整性问题。
随着2010年代开始向云端大规模微服务架构的转变,包括Netflix在内的大型创新者强烈主张独立服务管理自己的数据类型。其后果之一是,单个数据服务可以自由选择自己的数据库,这种模式被称为多语言持久性。图2显示了我们假设的酒店应用程序中可能是什么样子的一个例子。
*图2:微服务架构的多语言持久性方法*
在这种架构中,变化较少的适度数据,如酒店描述,可能是文档数据库或传统关系数据库的自然选择。具有高容量或高读/写流量的数据,如费率、库存和预订,可能会使用基于NoSQL的集群解决方案来有效扩展。其他数据服务可能是第三方API,例如来自客户关系管理(CRM)系统的访客信息。
用数据API网关替换数据服务
在创建多个数据服务时,开发团队经常发现,由于他们专注于在数据库后端执行简单的CRUD操作,这些实现非常相似,几乎是样板代码。认识到这种重复工作,许多组织已经开始采用数据API网关作为维护一层容器化数据服务的替代方案。
数据API网关是一种软件基础设施,通过各种风格的API(包括REST、gRPC等)提供对数据的访问。网关抽象了使用一个或多个持久存储存储和检索数据的详细信息。这允许应用程序开发人员专注于编写通过易于使用的API访问数据的业务服务,而不必学习数据库查询语言的复杂性。
图3显示了如何将此类网关应用于酒店申请示例的示例。数据API网关负责管理酒店、费率、库存和其他数据类型的数据持久性,无需整层数据服务。
*图3:数据API网关的示例使用*
可以通过提供模式或数据模型将数据类型添加到网关中。或者,文档风格的端点可以提供“无模式”的体验,其中可以存储任何有效的JSON文档,例如酒店描述,其结构可能会频繁更改。
因此,采用数据API网关与实现数据服务模式非常相似。设计包括识别关键数据类型,并创建模式或JSON格式来描述它们。然后,这些数据类型通过网关提供的API提供。
比较API样式
数据API网关为开发人员提供了通过API访问数据类型的自由,这对他们的客户服务和应用程序最有意义。图4比较了一些最常见的API样式,它们是如何构建数据的,以及它们的性能特征。
*图4:数据API网关提供的API特征*
| gRPC | GraphQL | REST | Document |
|---|---|---|---|
| 扁平结构/轻量级 | 分层或键值结构 | 基于行的结构/较弱的类型 | 基于json的结构/弱类型 |
| 低查询开销 | 低的查询开销 | 一些查询开销 | 高查询开销 |
像gRPC这样的API样式提供了更结构化的数据表示,可以带来更优化的性能。GraphQL和REST API在以额外延迟为代价表示数据方面提供了更大的灵活性。文档风格的API提供了最大的灵活性,这些API可以以客户端选择的任何格式存储和搜索JSON,代价是更复杂查询的性能可能较低。
数据API网关项目
许多组织已经构建了自己的数据API网关,其中一些处于作为开源项目发布的不同阶段。一个例子是Stargate,这是一个开源项目,在Apache Cassandra之上提供多种API样式作为无状态代理层。Apollo Supergraph平台或Netlify的OneGraph等GraphQL框架也可以被视为数据API网关模式的特定定制,因为它们聚合了来自多个持久性后端和API的数据。
部署数据API网关
部署容器化网关可能包括多个API服务和支持数据存储。让我们把Stargate看作一个数据API网关的例子,该网关本身就部署为微服务应用程序。图5显示了Stargate在Kubernetes中的部署示例。
*图5:带有Cassandra集群的Stargate在Kubernetes中部署示例*
Cassandra集群使用StatefulSet部署,它允许pods被绑定到PersistentVolumes,以获得存储数据的高可用性。无状态的Stargate协调节点和API服务,如文档、gRPC和REST,在Kubernetes部署中进行管理,这样每个微服务都可以独立扩展。Kubernetes Services提供跨多个微服务实例的负载平衡。
结论
数据API网关是一种新型的数据基础设施,可以帮助消除您必须开发和维护的CRUD风格的微服务层。虽然网关有多种样式,但它们有一套共同的功能,使开发人员和运营商都受益。数据API网关通过在单个支持数据库上提供各种API样式来提高开发人员的工作效率。从操作的角度来看,数据API网关及其支持数据库可以在容器中与其他应用程序一起运行,以简化您的整体部署过程。总之,采用数据API网关是降低微服务架构开发和维护成本的好方法。