当前位置: 首页 > 知识库问答 >
问题:

GraphQL和微服务

丌官向荣
2023-03-14

我想知道每种方法的利弊是什么。例如,在graphQL中包含所有内容似乎有点多余,因为我们将在每个服务中复制模式的部分。另一方面,我们使用GraphQL来避免一些REST缺陷。我们担心拥有RESTendpoint会抵消从GQL获得的优势。

有人遇到过类似的困境吗?我们都没有使用GraphQL的经验,所以这里是否有一些明显的利弊我们可能会遗漏?

提前道谢!

共有1个答案

劳夕
2023-03-14

好问题!听起来像是在问如何为GraphQL和微服务设置架构,以及为什么。

我建议使用GraphQL,因为它的最佳用例是以干净的方式合并数据源,并通过一个标准化API向您公开所有数据。另一方面,使用微服务的一个主要问题是,很难为您可能拥有的所有不同功能争论不休。随着应用程序的增长,整合所有这些微服务功能将成为一个主要问题。

使用这些技术的好处是巨大的,因为现在您基本上拥有了一个GraphQL API网关,它允许您从客户端访问微服务,就像它是一个单一的应用程序一样,但从性能和效率的角度来看,您也可以从使用微服务中获得许多好处。

因此,我推荐的架构是在微服务前面设置一个GraphQL代理,并在GraphQL查询和变异解析器中调用检索必要数据所需的函数。

在GraphQL微服务前面有一个GraphQL网关,还是在RESTendpoint前面有一个GraphQL网关,其实并不重要,尽管我实际上认为,将微服务功能公开为RESTendpoint会更简单,因为每个功能理论上应该只为一个目的服务。在这种情况下,您不需要额外的开销和GraphQL的复杂性,因为在后台不应该有太多的关系逻辑。

如果您正在寻找微服务提供商,我见过的最好的是AWS Lambda、Webtask、Azure函数和Google Cloud函数。并且您可以使用无服务器作为管理和部署这些微服务功能的一种方式。

例如:

import request from 'request';

// GraphQL resolver to get authors
const resolverMap = {
  Query: {
    author(obj, args, context, info) {
      // GET request to fetch authors from my microservice
      return request.get('https://example.com/my-authors-microservice');
    },
  },
};

这也是我们在Scaphold一直在探索的东西,以防您希望依赖服务来帮助您管理此工作流。我们首先提供一个GraphQL后端服务,帮助您在几分钟内开始使用GraphQL,然后允许您将自己的微服务(即自定义逻辑)作为函数组合添加到GraphQL API中。它本质上是最先进的webhook系统,它为您提供了如何调用微服务的灵活性和控制。

如果您在以下地区,也可以加入SF中的无服务器GraphQL Meetup:)

希望这有帮助!

 类似资料:
  • 我们几乎没有UI使用的微服务。AzureB2C是我们的身份验证提供程序。每个微服务(API)都需要访问令牌,并且需要与数据库进行授权。此数据库具有基于角色的门禁权限。 今天的情况是这样的: 在这方面,我们有两个问题: 由于AzureB2C不允许将多个资源的作用域添加到一个访问令牌中,我们必须获得多个访问令牌。 我们现在处于这样一个阶段,用户界面需要调用两个或更多的API来在一个页面上显示数据。 我

  • gRPC以其性能和效率似乎成为微服务内部通信的热门选择。 然而,gRPC使得查询关系数据变得更加困难,并且需要更多的工作来挂接到我们的API网关。 另一个选择是每个微服务实现它们自己的GraphQL模式,这样它们就可以使用API网关中的Apollo Federation轻松地拼接在一起。 我们如何决定使用哪种方法? 有没有什么值得我们考虑的显著优势?例如。在易用性、可维护性、可伸缩性、性能等方面?

  • 更准确地说,在我看来,BDD测试应该验证业务逻辑,而且只验证业务逻辑。在许多框架中,BDD测试场景是由滑板持有者用DSL创建的。BDD测试倾向于收敛于排他性的“不了解基础设施”的实践。另一方面,集成测试应该验证解决方案是否与目标基础结构匹配(它们由DevOps完成?),并且只与基础结构匹配。当业务功能通过微服务“分布”时,您应该模拟BDD测试环境(应该是本地环境)中的几乎所有内容(infra和bu

  • 问题内容: 我们有几个微服务项目,每个项目都是独立的(在单独的spring boot服务器上运行,公开其余服务,使用单独的DB模式…) 我们使用Maven管理依赖关系。 有一个父pom将每个微服务声明为模块是一个好主意吗?因此,有助于管理公共依赖项(例如,在每个项目中都使用lib servlet-api witch,将其全部删除并仅在父pom中声明) 问题答案: 多模块父pom的“问题”是,没有复

  • 我们有几个项目是微服务,每个项目都是独立的(在单独的spring boot服务器上运行,公开rest服务,使用单独的DB模式…) 我们使用maven来管理依赖关系 让父pom将每个微服务声明为模块是个好主意吗?因此有助于管理公共依赖项(就像每个项目中使用的lib servlet-api女巫一样,将其全部删除并仅在父pom中声明它)

  • 微服务作为一种软件架构风格正在获得牵引力,它将更好地支持持续交付,为快速部署和关注点分离提供模型。 Vert.x 3和Vert.x-Apex为构建微服务提供了一个有趣的模型。如其中一个例子所示,一个简单的verticle可以公开一个HTTP服务,因此REST服务是可用的。垂直绑定它自己的tcp端口。 当扩展到多个微服务来支持一个完整的应用程序时,您最终会有许多选择。对于哪种风格能够最终支持连续交付