6

我们怎样用 GraphQL 分阶段重构后端系统?

 3 years ago
source link: https://www.infoq.cn/article/pNMIz537It97SNHZ116L
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

之前,我写过一篇博文,用 Go 语言重写可汗学院有 10 年历史的单体 Python 2 后端系统。这篇博文带来的一些反馈是这样的“突然大规模重写会带来巨大的风险”。当然,我非常同意。本文,我要说的是我们的做法基本上和突然大规模重写相反。

联盟的 GraphQL

我们新架构的中心是基于 GraphQL联盟 的。基于 REST 的服务已经有了 “API网关” 很多年了。当你的系统是基于 GraphQL 时,联盟提供了相同的功能。这两者之间很大的区别是:

  1. GraphQL为后端系统能提供的所有数据提供了一个单一的类型化的模板。

  2. REST API网关通常知道如何将一个请求定向到单个后端服务。 GraphQL网关生成一个查询计划,来构建一个包含来自多个后端服务的数据的响应。

从较高的层次来看,我们的系统是这样的:

ymIBVjQ.png!mobile

graphql-gateway 服务负责创建查询计划并向我们的其它服务(包括我们的单体应用)发出 GraphQL 请求。我们的 Go 服务有自己的 GraphQL 模板,因此我们使用 gqlgen 来响应请求。

我将重点介绍我们是如何定制 Apollo GraphQL服务器 ,来使我们能够安全地从 Python2 单体应用迁移到这些新服务。

通过 GraphQL 联盟,每个服务提供了整个 GraphQL 模板的一部分,网关将所有这些单独的模板合并为一个。我们的单体应用像这个配置中的其它服务一样工作。

并行测试

GraphQL 基于各种类型。知道如何查询某一个字段的值的代码称为解析器。下面是一个简单的例子,我们将用它来讨论我们的方案:

<code data-type="codeline">type Assignment {</code><code data-type="codeline">    createdDate: Time</code><code data-type="codeline">}</code>

复制代码


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK