QCon上海站购票倒计时最后3天!查看精彩日程 了解详情
写点什么

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

2021 年 2 月 05 日

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 年 2 月 05 日 16:233873

评论

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

使用JavaScript解析XML文件

空城机

JavaScript xml 前端 递归 4月日更

Vue3、Vuex4、Ant Design2的实战项目开发管理系统

devpoint

vite Vue3 and design of vue

我常用的两个外国应用

彭宏豪95

产品 产品经理 工具 社交 Slack

Java-技术专题-Stream.foreach和foreach

李浩宇/Alex

Java stream collection

聊聊十种常见的软件架构模式

架构精进之路

4月日更

json基础学习

ベ布小禅

4月日更

智慧城市现状调研

程序员架构进阶

华为 智慧城市 28天写作 4月日更

阿里高工熬夜18天码出Java150K字面试宝典,却遭Github全面封杀

程序员小毕

Java 程序员 架构 面试 分布式

云原生技术及可观测实践

滴滴云

2年进入苏宁,第5年入职阿里,专科学历的他是如何做到?

Java架构师迁哥

学会这15点,让你分分钟拿下Redis数据库

民工哥

linux运维 redis cluster 后端技术

从被踢出局到5个30K+的offer,一路坎坷走来,沉下心,何尝不是前程万里

北游学Java

Java 数据库 分布式 微服务

专访中寰卫星导航项目管理部负责人卜钢:如何演绎人生之路

打工人!

采访 调查采访能力考核

const与指针交集的那些事

Bob

c++ 编程语言 4月日更

重读《重构2》- 改变函数声明

顿晓

重构 4月日更

曾国藩:人生惟有常是第一美德

leoay

曾国藩 坚持 有常 天赋 成事心法

TcaplusDB直播回顾 | 数据库架构和实战分析

TcaplusDB

数据库 nosql 后端 TcaplusDB

不想搞Java了,4年经验去面试10分钟结束,现在Java面试为何这么难

云流

Java 编程 程序员 面试 计算机

mosquitto支持websocket搭建记录

风翱

4月日更 web socket mosquitto

流计算:流式处理框架

正向成长

流式计算框架

阿里内部热捧“Spring全线笔记”,不止是全家桶,太完整了

Java架构追梦

Java spring 源码 架构 微服务

建议收藏!看完全面掌握,最详细的Redis总结(2021最新版)

民工哥

运维 redis cluster NoSQL数据库 后端技术

怎么拥有个人磁力

leoay

IP 个人磁力 KOL 思想 吸引力法则

1分钟搞定 Nginx 版本的平滑升级与回滚

民工哥

nginx linux运维 后端技术

浅谈 MySQL 集群高可用架构

民工哥

MySQL MySQL 高可用 集群 linux运维

隐私安全的城池营垒,能成为手机品牌高端化的赛点吗?

脑极体

接口的幂等性怎么设计?

xcbeyond

设计 幂等性 4月日更

计算机原理学习笔记 Day6

穿过生命散发芬芳

计算机原理 4月日更

函数计算助力语雀构建稳定且安全的业务架构

阿里巴巴中间件

文档 企业架构和云服务 业务架构

你管这破玩意叫哨兵?

云流

Java 数据库 redis 程序员 架构

不愧是阿里内部“Spring Cloud Alibaba学习笔记”这细节讲解,神了!

Java架构追梦

Java 阿里巴巴 架构 微服务 SpringCloud

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