写点什么

Netflix 开源用于 Spring Boot 的 GraphQL 服务框架 DGS

  • 2021-02-05
  • 本文字数:3199 字

    阅读完需:约 10 分钟

Netflix 开源用于 Spring Boot的 GraphQL 服务框架DGS

Netflix 公司着力开发的 Domain Graph Service(DGS)框架现已正式成为开源项目。DGS 框架简化了针对独立与联合 GraphQL 服务的 GraphQL 实现。而在高强度的现实锤炼之后,这套框架也变得愈发稳定强健。


通过将项目开源,我们希望为 Java 及 GraphQL 社区做出贡献,同时与各位使用框架、增强框架的参与者们携手合作。


DGS 框架的主要功能包括:


  • 基于注释的 Spring Boot 编程模型

  • 用于将查询测试编写为单元测试的测试框架

  • Gradle 代码生成插件,可通过 GraphQLschema 创建 Java/Kotlin 类型

  • 与 GraphQLFederation 轻松集成

  • 与 Spring Security 相集成

  • GraphQL 订阅 (WebSockets 与 SSE)

  • 文件上传

  • 错误处理

  • 自动支持 interface/union 类型

  • 提供面向 Java 的 GraphQL 客户端

  • 可插拔 Instrumentation

我们为何需要 DGS 框架


2019 年春季,Netflix 公司开启了这段伟大的联合 GraphQL 架构探索之旅。向这种新型联合架构的过渡,意味着我们的众多后端团队需要在 Java 生态系统中使用 GraphQL。之前我们曾发表博文,提到 Netflix 已经在 Spring Boot 上实现了后端开发标准化。因此,要让这套联合架构取得成功,我们需要在 Spring Boot 中为 GraphQL 提供良好的开发者体验。


为此,我们在 Spring Boot 上创建起自有框架,其中用到 graphql-java 库。这套框架最初只供内部使用,主要强调与 Netflix 生态系统相集成以实现跟踪、日志记录及指标整理等。但在此期间,我们也一直强调应该将框架进行适当模块化。很明显,我们构建的大多数框架并不特定于 Netflix,主要用于提供一种更简便的 GraphQL 服务(独立与联合)构建方法。

Schema 优行开发


Schema 代表的是 GraphQLAPI。正是 schema 的存在,让 GraphQL 如何强大、又与 REST 有所不同。GraphQL 模式会根据查询及变异操作,配合相关类型与字段以描述 API。API 用户可以精确指定希望在查询中检索的字段,借此极大提高 GraphQLAPI 的灵活性。


GraphQL 分为两种不同方法:schema 优先与代码优先。通过选择 schema 优先开发方法,您可以使用 GraphQLSchema 语言手动定义 API 的 schema。服务中的代码将仅用于实现此 schema。


使用代码优先开发,您无需使用任何 schema 文件。相反,由运行时根据代码中的定义生成 schema。


我们的框架同时支持 schema 优先与代码优先这两种方法。在 Netflix,我们明确倾向使用 schema 优化的开发方式,理由包括:


  1. Schema 设计是开发者体验中的重中之重。

  2. 能够为工具提供一种更简便的 schema 使用方法。

  3. 由 schema 差异能够让变更引发的向下不兼容性更明显。在联合 GraphQL 架构下,向下兼容性无疑至关重要。


尽管使用代码生成 schema 一般更有速度优势,但我们愿意投入更多时间来建立起易于理解的 schema 协作模式设计,希望借此建立更出色的 API。

框架实操


此框架的核心围绕 Spring Boot 开发者所熟悉的、基于注释的编程模型进行。项目网站上提供全面的说明文档,下面我们将通过一项示例,向大家展示如何轻松使用这套框架。


让我们先从简单的 schema 开始。


要实现此 API,我们需要编写一个数据提取程序。



其中的 Show 类型是一个简单 POJO,通常由 Gradle 的 DGS 代码生成插件所生成。使用 @DgsData 注释方法,即可为字段实现数据获取程序。请注意,我们不需要为每个字段获取数据;这里可以直接返回 Java 对象,由框架完成其余工作。这套框架还具有多种其他便捷性优势,例如本示例中使用的 @InputArgument 注释。


此代码足以让 GraphQL 端点保持运行。接下来,只需要启动 Spring Boot 应用程序,即可使用 /graphql 端点以及 /graphiql 上开箱即用的 GraphiQL 查询编辑器。示例中的代码简单明了,而且即使是使用联合类型,使用 @Secured 或者使用扩展点添加指标与跟踪,代码内容也不会有太大区别。总之,框架本身将负责解决所有繁重的工作内容。


本框架的另一大关键,在于支持轻量级查询测试。通过测试流程,您无需使用 HTTP 端点即可执行查询。测试本身的使用感受与普通 Junit 测试基本一致。



关于这套框架的完整说明文档,请参见 DGS 框架 GitHub repo。

对接 GraphQL 服务器生态系统


那么,DGS 框架要如何全面适应现有 GraphQL 生态系统?当前生态系统涵盖服务器、客户端、联合网关以及工具,可帮助您进行查询测试、schema 管理、代码生成等。在使用 JVM 构建 GraphQL 服务器时,生态系统也为我们提供大量 schema 优先库与代码优先库选项。


graphql-kotlin 是一套面向 Kotlin 语言的高人气代码优先库。graphql-java 则是在 Java 当中实现 schema 优先 GraphQLAPI 的首选方案,但在设计上属于低级库。graphql-java-kickstart 入门程序由一组用于实现 GraphQL 服务的库组成,并在 graphql-java 的基础之上提供 graphql-java-tools 与 graphql-java-servlet。


无论您使用 Java 还是 Kotlin,我们的框架都能提供在 Spring Boot 中构建 GraphQL 服务的简便方法。此框架还可分别用于构建独立服务与联合 GraphQL。

联合


DGS 框架能够以便捷的方法实现联合 GraphQL 服务。联合机制,意味着各服务能够共享网关所公开的统一图。通常,服务使用由 Apollo 联合规范所定义的 @extends 指令,借此在统一 schema 中实现服务共享与类型扩展。这也是一种将大规模单体 GraphQLschema 拆分成多个微服务的有效方法。


对于传入的查询,联合网关能够构建查询计划以调用所需的服务,借此完成查询操作。每项服务又需要能够响应 _entities 查询,以便在一定程度上完成对所拥有数据的查询。


下面以 Reviews(评论)服务为例,了解如何在 reviews 字段扩展之前定义的 Show 类型:




带有 Shows 与 Reviews DGS 的联合 GraphQL 架构


在此 schema 下,Reviews DGS 需要为联合 Show 类型实现一个解析器,并在其中填充 reviews 字段。大家可以使用 @DgsEntityFetcher 注释轻松完成此项操作,如下所示:



此框架还使您可以轻松通过代码生成功能对联合查询加以测试,借此为基于 schema 的服务生成 _entities 查询。

框架架构


从开发之初,我们就专注于实现代码模块化。这是一项重要的设计选择,能够在不影响我们内部团队的前提下开源大部分框架。但我们无法使用 Java 9 中引入了模块系统,因为 Netflix 内部的多数应用程序仍在使用 java 8。但借助 Gradleapi 与 implementation 模块,我们得以创建起简单整洁的模块结构。在 Netflix,我们将大量 Spring Boot 扩展与自有基础设施集成起来。我们将这套体系称为 Spring Boot Netflix。DGS 框架基于标准的开源 Spring Boot 构建而成。最重要的是,我们也有部分模块与特定基础设施相集成,且仅使用核心框架提供的扩展点。


下图所示,为各模块如何实现装配集成:



包含 Netflix 与 OSS 模块的 DGS 框架

分布式跟踪与指标


在 Netflix,我们拥有一夶包含跟踪、指标、分布式日志记录以及身份验证 / 授权等功能的自定义基础设施。如前所述,DGS 框架能够与这套基础设施集成起来,提供开箱即用的无缝化体验。虽然这些功能并未开源,但仍可以轻松被添加到框架当中。


该框架还支持 graphql-java 库中定义的 Instrumentation 类。通过实现 Instrumentation 接口并通过 @Component 进行注释,此框架可以自动拾取这些类。感兴趣的朋友可以参阅说明文档中的相关参考示例。我们也期待更多社区参与者围绕分布式跟踪与指标的通用模式做出贡献。

立即体验


要开始使用 DGS 框架,请参阅说明文档及教程。要为 DGS 框架做出贡献,请在 GitHub 上查看 DGS 框架项目。我们还拥有一款 Gradle 代码生成插件,用于根据 GraphQLschema 生成 Java 与 Kotlin 类型。要参与代码生成插件的贡献,请在 GitHub 上查看此项目。

团队成果


DGS 框架在 Netflix 中获得的成功,离不开各参与团队的共同努力。我们要感谢来自 BFG 团队的各位同事,他们与我们共同完成了这段奇妙的探索之旅。最后,我们还要感谢各位用户给出的及时反馈与代码贡献。


原文链接:


https://netflixtechblog.com/open-sourcing-the-netflix-domain-graph-service-framework-graphql-for-spring-boot-92b9dcecda18?gi=978ff7b803d3


2021-02-05 16:234958

评论

发布
暂无评论
发现更多内容

Prometheus Exporter (三十二)Varnish Exporter

耳东@Erdong

Prometheus 28天写作 exporter 12月日更 Varnish

Java开发Excel数据导入mysql的实用小技巧

@零度

Java MySQL

Go语言逆向技术:常量字符串

华为云开发者联盟

字符串 go语言 字符 逆向技术 常量字符串

即构科技 RTC 实践与深度解析 | 内容合集

ZEGO即构

音视频 RTC 内容合集 技术实践 技术专题合集

【征集令】寻找2022年鸿蒙智联“出行新爆款产品”

HarmonyOS开发者

HarmonyOS

19《重学JAVA》--集合(一)

杨鹏Geek

Java25周年 28天写作 12月日更

建木持续集成平台v2.1.0发布

Jianmu

DevOps CI/CD 开源社区

【1分钟调研赢好礼】HarmonyOS Connect 视频课堂用户反馈问卷

HarmonyOS开发者

HarmonyOS

被灵魂问倒:这个BUG为什么没测出来?

华为云开发者联盟

测试 bug 文档 测试用例 测试工程师

以 Vuex 为引,一窥状态管理全貌

杨成功

JavaScript Vue 大前端 vuex

读《思辨与立场》-07思维的标准

wood

28天写作 批判性思维 思辨与立场

10个比较不错的 JavaScript 库

编程江湖

JavaScript 前端开发

Kotlin Maps:五个基本函数

坚果

kotlin 28天写作 12月日更

跟着动画学Go数据结构之选择排序

宇宙之一粟

golang 数据结构 选择排序 12月日更

COG云原生优化遥感影像,瓦片切分的最佳实践

华为云开发者联盟

云原生 遥感影像 瓦片切分 云上遥感影像文件 华为云地理遥感平台

netty系列之:netty对SOCKS协议的支持

程序那些事

Java Netty 程序那些事 SOCKS 12月日更

对话龙智专家,共探DevSecOps实践难点

龙智—DevSecOps解决方案

DevOps DevSecOps

实用机器学习笔记十九:模型验证

打工人!

人工智能 机器学习 深度学习 学习笔记 12月日更

Android 8.0 下载安装进入【安装未知应用】页面,两步简化一步

阿策小和尚

28天写作 Android 小菜鸟 12月日更

前端开发之JS中filter()的使用

@零度

JavaScript 前端开发

比特币挖矿与源码解析

恒生LIGHT云社区

比特币 区块链 挖矿

从 WAN 到 SD-WAN 边缘设备的网络架构

devpoint

TLS ssl SD-WAN 12月日更

GaussDB(DWS)中共享消息队列实现的三大功能

华为云开发者联盟

线程 数据同步 GaussDB(DWS) 共享消息队列 共享消息

Kubernetes 集群无损升级实践

vivo互联网技术

容器 云原生 服务器集群 Kubernetes 集群

书单 | “实战派”系列,每一本都是学好用好一门技术的“航空母舰”

博文视点Broadview

Hive查询的18种方式

编程江湖

大数据 hive

【LeetCode】在 D 天内送达包裹的能力Java题解

Albert

算法 LeetCode 12月日更

容器技术正在颠覆传统,重构整个软件世界

巨子嘉

容器 云原生

Redisson:这么强大的实现分布式锁框架,你还没有?

华为云开发者联盟

redis 分布式 分布式锁 可重入锁 Redisson框架

龙智第四次荣登“2021上海软件和信息技术服务业高成长百家”名单

龙智—DevSecOps解决方案

上海软件和信息技术服务业

龙智宣布与ConnectALL成为合作伙伴 进一步提升DevOps解决方案水平

龙智—DevSecOps解决方案

DevOps ConnectALL 价值流 价值流管理

Netflix 开源用于 Spring Boot的 GraphQL 服务框架DGS_架构_Netflix技术博客_InfoQ精选文章