用数据API简化你的微服务架构
在这篇文章中,我们将学习如何采用数据API网关来大幅降低微服务架构的开发和维护成本。
你是否遇到过如何在微服务架构中管理数据的挑战?在这篇文章中,我们研究了传统的方法,并介绍了数据API网关(有时也被称为 "数据网关"),一种新型的数据基础设施。我们探讨了数据API网关的特点,为什么你应该实现它,以及如何将它应用于你的架构。
传统的数据服务模式
首先,让我们考虑在微服务架构中如何管理数据。一个常见的模式是一个数据服务层,执行 "CRUD"(创建、读取、更新、删除)操作。例如,考虑图1中所示的名义上的酒店预订应用程序。
图1:微服务架构样本中的数据服务
这个微服务架构包括一层数据服务,管理特定的数据类型,包括酒店、房价、库存、预订和客人,以及一层业务服务,实现特定的流程,如购物和预订。业务服务为网络和移动应用提供主要接口,并将数据的存储和检索委托给数据服务。数据服务负责在底层数据库上执行CRUD操作。
虽然有很多方法来整合和协调这些服务之间的互动,但自从面向服务架构(SOA)的早期,负责数据和业务逻辑的服务分离的基本模式一直存在。
识别、设计和实现数据服务
开发这些微服务的典型方法包括以下步骤:
- 使用领域驱动设计等技术识别服务,以管理领域中的特定数据类型。关于领域驱动设计、服务识别和数据建模之间的互动,请参见《Cassandra, The Definitive Guide》第7章。第三版。
- 设计包括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这样的API风格提供了更多的结构化数据表示,可以带来更多的最佳性能。GraphQL和REST API在如何表示数据方面提供了更多的灵活性,但代价是额外的延迟。文档风格的API提供了最大的灵活性,它可以以客户选择的任何格式存储和搜索JSON,代价是更复杂的查询可能会降低性能。
数据API网关项目
许多组织已经建立了他们自己的数据API网关,其中一些处于不同的阶段,被作为开源项目发布。一个例子是Stargate,一个开源项目,作为Apache Cassandra之上的无状态代理层,提供多种API样式。GraphQL框架,如Apollo Supergraph Platform或Netlify的OneGraph,也可以被认为是数据API网关模式的一个特定定制,因为它们从多个持久化后端和API中聚集数据。
部署数据API网关
部署一个容器化的网关可能包括多个API服务和支持的数据存储。让我们看看Stargate,作为数据API网关的一个例子,它本身被部署为一个微服务应用程序。图5显示了在Kubernetes中部署Stargate的例子。
图5:在Kubernetes中部署Stargate的例子,有一个支持的Cassandra集群
一个Cassandra集群使用StatefulSet进行部署,它允许将pod绑定到PersistentVolumes,以实现存储数据的高可用性。无状态的星门协调器节点和API服务,如文档、gRPC和REST,在Kubernetes部署中被管理,以便每个微服务可以独立扩展。Kubernetes服务提供跨多个微服务实例的负载平衡。
结论
数据API网关是一种新型的数据基础设施,可以帮助消除你必须开发和维护的CRUD式微服务层。虽然有多种风格的网关,但它们有一套共同的功能,对开发者和运营商都有好处。数据API网关通过在一个支持的数据库上提供各种API风格,使开发者的生产力得到提高。从操作的角度来看,数据API网关及其支持的数据库可以在容器中与其他应用程序一起运行,以简化你的整体部署过程。总之,采用数据API网关是降低微服务架构的开发和维护成本的一个好方法。