最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

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


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2021-02-05 16:234780

评论

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

同样是初级测试,凭什么他比我薪资高5000块?

程序员阿沐

软件测试 自动化测试

跳槽要不要找猎头

SwiftDD

面试

云算力矿机挖矿系统搭建,Bzz节点挖矿APP源码

常用 Git 命令总结

编程三昧

git 大前端 工具

数字化的三大本质

CECBC

JavaScript 学习(十二)--- String对象中的模式匹配方法

空城机

JavaScript 大前端 6月日更

推荐5个免费YouTube视频下载方法

资源君

分享 工具软件 教程 youtube视频下载 下载youtube视频

干货!!学习CSRF跨站请求伪造,看这一篇就够了

网络安全学海

网络安全 安全 CSRF 渗透测试 漏洞修复

攻击方式学习之- 拒绝服务(DOS/DDOS/DRDOS)

网络安全学海

网络安全 信息安全 渗透测试

带老弟做个实时排行榜

程序员鱼皮

Java c++ 大前端 后端 项目实战

字节跳动移动架构师学习笔记,一文说清!

欢喜学安卓

android 程序员 面试 移动开发

2021年最危险的七大攻击技术,我不信你不知道

网络安全学海

程序员 网络安全 信息安全 漏洞扫描 攻击技术

持续交付时代,Scrum中还有必要进行 Sprint Review 么?

万事ONES

项目管理 敏捷开发 持续交付 ONES

字节跳动8年老Android面试官经验谈,看完跪了

欢喜学安卓

android 程序员 面试 移动开发

5分钟速读之Rust权威指南(三十一)线程通信

wzx

rust

架构实战营 - 模块 7- 作业

请弄脏我的身体

架构实战营

提高项目管理效率,技术管理者该怎么做?

万事ONES

项目管理 技术管理 ONES

极狐GitLab14.0正式面世!

极狐GitLab

vivo商城促销系统架构设计与实践-概览篇

vivo互联网技术

架构 服务器 商城项目

阿里巴巴6月新作:“Java辟邪剑谱”,看完必让你直呼好家伙!

Java架构师迁哥

从设计模式看如何提升程序员的工程素养

学无止境的阿奔

Linux 后端 设计模式 C/C++ 服务器

深度学习在推荐系统中的应用(二十一)

数据与智能

深度学习 算法 推荐系统

区块链服务网络全球首发 将极大降低政务、金融、能源等领域区块链应用成本

CECBC

币安智能链DAPP系统开发

Geek_23f0c3

DAPP系统开发 #区块链# 币安智能链

浪潮云荣获“2021中国智能运维领导厂商”奖项

浪潮云

服务频繁出现100毫秒的延迟,原因是什么?

BUG侦探

运维 开发

数据治理

奔向架构师

大数据 数据架构 数据治理

电池战争:“新石油”与中欧分野

脑极体

AQS知多少

卢卡多多

AQS 6月日更 锁分析

Java后端,想找一份20k以上的工作需要掌握哪些知识?

Java架构师迁哥

Spring Cloud Alibaba 优势在哪?未来会如何演进?

Java架构师迁哥

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