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