构建GraphQl网关:组合,针迹或合并任何数据源
核心要点
- GraphQL网关融合了传统API网关和GraphQL的优势,使软件工程师能够从多个数据源获取数据,同时保持前端效率。
- 后端即前端(BFF)架构模式减少了前端的请求数量,通过允许向API网关发出单个请求来简化流程,然后API网关从每个后端服务获取数据并将其组合起来。
- GraphQL为BFF提供了诸多优势,包括高效的数据获取、所有请求的单一端点以及允许前端为每个请求仅选择所需数据的灵活查询。
- 建立GraphQL网关的三个推荐框架包括Hasura、StepZen和Graphweaver。这些框架提供了多种功能,例如多个数据源连接、路由、批处理、安全、跨数据源过滤和可扩展性。
本文将讨论如何从多个数据源获取数据,同时保持前端快速响应的问题,以及一个潜在的解决方案:使用GraphQL网关。
作为软件工程师,我们都面临着将来自多个系统的数据组合在一起的挑战。即使是单个页面也需要来自多个服务的数据才能呈现。
数据无处不在,从CRM到金融系统,从SaaS平台到数据库。每个企业不可避免地会购买大量的SaaS平台,然后希望在所有这些平台之上获得统一的业务视图。我们必须直面这个问题,并将所有内容整合起来。
GraphQL网关结合了传统API网关和GraphQL的优势。
我们将首先讨论API网关的优势,然后看看GraphQL是如何融入其中的。请继续阅读本文,我们将介绍一些构建我们自己的API网关的框架。
API网关的优势
保护面向公众的API免受黑客攻击是一项全天候的工作。随着时间的推移,组织已经发展到创建许多API,从面向服务的架构到微服务。组织更倾向于添加一个额外的安全层,而不是将这些API直接放在互联网上,该安全层位于所有这些API的前面,并确保对数据的访问始终遵循相同的身份验证规则。
他们使用API网关来做到这一点。
Kong或Apigee等产品从中心位置公开内部API。它们充当反向代理,具有API密钥管理、速率限制和监控等功能。
API网关允许我们控制谁以及什么可以访问每个服务,监控连接和记录访问。
最近,应用程序需要将数据从API网关和其他外部SaaS提供商组合起来。这意味着旧的集中式工具(确保我们的规则得到遵守)现在定期被绕过。
假设我们正在为公司构建一个Web应用程序。我们的任务是创建用户个人资料页面。在登录过程中,我们需要组合来自多个系统的数据:
- Salesforce CRM:保存一般的客户数据,例如名字和姓氏。
- 订单:最近的订单位于组织内的订单系统中。
- 通知服务:通知设置和最近的消息位于连接到Node.js服务的特定于应用程序的数据库中。
客户端需要发出三个单独的请求才能获取数据,如下图所示。
在上图中,Web客户端发送三个单独的API请求,然后必须在前端代码中组合结果。发送多个请求会影响应用程序的性能,并且组合这些数据会增加代码的复杂性。此外,如果有多个应用程序,现在所有应用程序都必须了解所有后端,并且一个服务中的单个API更改可能会导致我们所有应用程序的更新。
我们可以做得更好。理想情况下,我们希望将请求从三个减少到一个。我们可以创建一个新服务来执行此操作——一个协调对后端服务请求的服务。这个想法有一个名称:BFF模式。
后端即前端(BFF)架构模式允许前端发出单个请求。
但它是如何工作的呢?让我们更详细地了解一下这种模式。
BFF模式的优势
使用BFF模式,应用程序向API网关发送单个请求。然后,BFF服务向每个后端服务请求数据并将其组合起来。最后,对数据进行过滤,只返回前端所需的数据,从而减少通过网络传输的数据量。
如上图所示,我们在堆栈中引入了一个额外的层来协调请求。
用户个人资料端点返回该应用程序在个人资料页面上所需的的数据。将我们的三个请求减少到一个请求已经解决了我们之前的性能问题。
但我们还没有完成。
企业决定发布一个移动应用程序。移动应用程序也有一个个人资料页面,但此屏幕显示的个人资料信息要少得多。
此时,移动团队有两个选择。该团队可以使用Web团队的端点,这意味着我们会过度获取数据(获取移动应用程序不需要的更多数据)。另一种选择是移动团队创建自己的BFF。
不出所料,移动团队决定创建自己的BFF,因为他们希望为他们的应用程序获得良好的性能。
如上图所示,事情开始变得复杂起来,我们现在有两个新问题:
- 每个团队都必须为他们创建的每个应用程序创建一个新的BFF服务,这会减慢每个团队的速度,并使其难以标准化。
- 每个BFF都需要进行渗透测试以确保其安全。
我们如何解决这些问题?
我们需要一个解决方案,让每个应用程序都可以选择它需要的数据,并且它应该是公司所有应用程序使用的单个API。
随着BFF的成熟,许多开发人员已经开始尝试使用GraphQL而不是REST。
让我们看看这项技术如何提供帮助。
GraphQL对BFF的优势
GraphQL具有许多使其成为BFF理想技术的优势:
- 高效的数据获取。GraphQL使客户端能够准确请求所需的数据,不多不少。这通过减少从API传输的数据来提高性能。
- 单一端点。GraphQL不是通过网关公开许多端点,而是对所有请求使用单个端点。这简化了维护和版本控制的需要。
- 灵活的查询。客户端可以通过将字段和关系组合到单个请求中来构建查询。这使前端开发人员能够优化数据获取,从而提高性能。此外,如果前端的要求发生变化,可以更新它以获取不同的数据,而无需以任何方式更改后端。
前端现在可以为每个请求只选择所需的数据。
我们现在可以将我们的两个应用程序连接到同一个GraphQL服务器,从而减少对第二个BFF服务的需要。
我们现在可以为组织中的任何应用程序共享BFF。我们还有一个需要进行渗透测试的单一端点。
但是,我们又引入了一个新问题!我们仍然必须管理两个系统——API网关和GraphQL BFF。
如果我们将两者合并到一个GraphQL网关中会怎样?
接下来,让我们看看GraphQL网关是如何工作的。
什么是GraphQL网关?
GraphQL网关将API网关与GraphQL API结合起来,以获得这两种技术的最佳效果。
让我们回顾一下优势:
- 开发人员拥有一个单一的API端点来请求数据。这减少了过度或不足的获取,因为每个应用程序只选择它需要的数据。
- GraphQL网关由组织中的许多应用程序共享。这意味着我们已将安全风险降低到单个API端点。
- 我们现在只有一个服务需要管理和部署,因为BFF与网关合并了。
下图显示了用户个人资料API请求如何与GraphQL网关一起工作。
在上图中,客户端向GraphQL网关发送单个请求,请求其所需的数据。网关向每个服务发出单个请求并组合结果。我们现在只有一个服务需要管理和部署。
希望您已准备好自己尝试一下。接下来,让我们看看如何构建GraphQL网关。
构建GraphQL网关
在选择网关框架时,我们需要寻找一些关键功能:
- 多个数据源。网关必须连接到许多数据源——从数据库到SaaS——我们应该能够创建我们的连接。
- 路由。网关应该能够直接从底层服务请求数据。
- 批处理。发送到同一服务的多个查询以批处理方式发送,从而减少请求数量。
- 安全。身份验证和授权应控制谁可以访问连接的数据。
- 跨数据源过滤。应该提供强大的过滤器以避免过度获取客户端所需的数据。
- 可扩展性。开发人员应该能够使用中间件或函数扩展代码以满足他们的需求。
有很多框架可供选择,但我推荐进一步探索以下三个框架。
Hasura
Hasura 这些年来越来越受欢迎,最初是作为GraphQL-over-Postgres服务器。但是,它增加了连接到外部系统的能力。
我们可以连接一个“远程模式”,它结合了来自其他服务器的GraphQL。
这种方法有一些缺点。首先,我们需要在一个单独的服务中创建和管理我们的远程模式,并且此服务必须是GraphQL端点。这导致了第二个问题:我们无法直接连接数据源。
此外,Hasura不允许我们根据另一个数据源中的值来过滤一个数据源中的数据。这听起来可能很学术,但实际上我们经常想要表达类似“给我客户名称为‘ABC’的订单”这样的内容。
这提供了灵活性,但代价是运行多个服务。让我们看看一个可以直接连接的选项。
StepZen
StepZen允许我们直接从GraphQL服务器连接到数据源。这减少了运行多个服务以创建网关的需要。
要将Stepzen连接到数据源,我们创建如下所示的GraphQL模式文件:
<code>type Query { anything(message: String): JSON @rest ( endpoint: "https://httpbin.org/anything" method: POST headers: [ {name: "User-Agent", value: "StepZen"} {name: "X-Api-Key", value: "12345"} ] postbody: """ { "user": { "id": "1000", "name": "The User" } } """ ) } </code>
在这个例子中,我们使用自定义模式将服务器连接到数据库。
还有另一个您可能更喜欢的选项,那就是纯代码方法。让我们接下来看看。
Graphweaver
在过去的几年里,我一直在开发一个名为Graphweaver的开源产品,它可以用作GraphQL网关。
它直接连接到我们的数据源并创建一个即时的GraphQL API。此API包含我们可能期望创建、读取、更新和删除的所有CRUD操作。它自动生成过滤器、排序和分页参数,从而节省时间。我们可以用我们的代码扩展内置操作以实现完全的灵活性。
Graphweaver 为 Postgres 和 Mysql 等数据库以及 Xero 和 Contentful 等 SaaS 提供商提供了开箱即用的数据连接器。
进行更改或连接数据源涉及编写 Typescript 代码,从而使我们能够进行完全自定义。
如果您有兴趣创建自己的GraphQL API,我强烈建议您查看Graphweaver GitHub代码。
结论
在本文中,我们研究了如何用单个GraphQL网关替换我们当前的API网关和BFF模式。
我们研究了API网关的优势以及组织使用它们的原因。版本控制、速率限制和访问管理是一些原因。
我们还研究了BFF模式以及它如何为前端应用程序协调API请求。
最后,我们研究了GraphQL以及为什么它对BFF来说是一项有益的技术。
最终,这导致我们创建了一个GraphQL网关,我们研究了创建我们自己的三个选项:Hasura、StepZen和我一直在开发的产品Graphweaver。
我希望本文能说服您尝试自己使用GraphQL网关,如果可以的话,请考虑尝试Graphweaver。
GraphQL网关常见问题解答(FAQ)
GraphQL网关的主要用途是什么?
GraphQL网关充当所有GraphQL操作的单一入口点。它负责将请求路由到相应的服务,聚合响应并将它们发送回客户端。这使您可以从单个位置管理多个GraphQL模式和服务,从而使您的应用程序更具可扩展性和易于维护。
GraphQL网关与传统的API网关有何不同?
传统的API网关旨在处理RESTful API,其运行模式与GraphQL不同。另一方面,GraphQL网关专门设计用于处理GraphQL操作。它提供诸如模式拼接和合并之类的功能,这些功能允许您将多个GraphQL模式组合成一个。这是传统API网关无法做到的。
GraphQL网关中的模式拼接是什么?
模式拼接是GraphQL网关的一项功能,允许您将多个GraphQL模式组合成一个。当您有多个服务且每个服务都有自己的模式,并且您想将它们公开为单个API时,这特别有用。模式拼接负责合并模式并解决任何冲突,为客户端提供无缝的体验。
GraphQL网关如何提高性能?
GraphQL网关可以通过减少客户端和服务器之间的往返次数来显著提高性能。客户端无需向不同的服务发出多个请求,而只需向GraphQL网关发出单个请求,然后网关将请求路由到相应的服务,聚合响应并将它们发送回客户端。这减少了网络延迟并提高了整体性能。
我可以在微服务中使用GraphQL网关吗?
是的,GraphQL网关特别适合微服务架构。每个微服务都可以有自己的GraphQL模式,网关可以将这些模式拼接在一起以提供统一的API。这允许您独立管理和扩展微服务,同时仍然为您的客户端提供一致的接口。
GraphQL网关与所有编程语言兼容吗?
GraphQL网关与语言无关,这意味着它可以与任何支持GraphQL的编程语言一起使用。这包括JavaScript、Python、Ruby和Java等流行语言。
GraphQL网关如何处理错误?
GraphQL网关提供强大的错误处理功能。如果其中一项服务发生错误,网关将向客户端返回详细的错误消息,包括有关哪个服务导致错误以及发生了什么错误的信息。这使得诊断和修复问题更容易。
我可以在无服务器架构中使用GraphQL网关吗?
是的,GraphQL网关与无服务器架构兼容。您可以将网关部署为无服务器函数,这使您可以利用无服务器计算的可扩展性和成本效益。
GraphQL网关如何处理安全?
GraphQL网关提供多种安全功能,包括身份验证和授权、速率限制和请求验证。这些功能有助于保护您的服务免受未经授权的访问和滥用。
我可以将GraphQL网关与现有的RESTful API一起使用吗?
是的,您可以将GraphQL网关与现有的RESTful API一起使用。网关可以在GraphQL模式中包装您的RESTful API,允许您在仍然使用现有API的同时利用GraphQL的优势。
以上是构建GraphQl网关:组合,针迹或合并任何数据源的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

学习JavaScript不难,但有挑战。1)理解基础概念如变量、数据类型、函数等。2)掌握异步编程,通过事件循环实现。3)使用DOM操作和Promise处理异步请求。4)避免常见错误,使用调试技巧。5)优化性能,遵循最佳实践。

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

实现视差滚动和元素动画效果的探讨本文将探讨如何实现类似资生堂官网(https://www.shiseido.co.jp/sb/wonderland/)中�...

深入探讨console.log输出差异的根源本文将分析一段代码中console.log函数输出结果的差异,并解释其背后的原因。�...
