Netflix开源了领域图形服务 Domain Graph Service (DGS)框架,DGS简化了框架的独立性和联合GraphQL服务的实现。
通过开源项目,希望对Java和GraphQL社区做出贡献,并向所有使用该框架的人学习和合作,使其变得更好。
DGS框架的主要功能包括:
- 基于注解的Spring-Boot编程模型
- 将查询测试编写为单元测试的测试框架
- Gradle代码生成插件,可以从GraphQL模式创建Java/Kotlin类型获得
- 和GraphQL Federation易于集成
- 与Spring Security集成
- GraphQL订阅(WebSocket和SSE)
- 上传文件
- 错误处理
- 自动支持接口/工会类型
- GraphQL客户端的Java
- 可插拔仪器
为什么Netflix需要DGS框架
我们使用Spring Boot创建并使用了graphql-java库。该框架最初仅用于内部使用,侧重于与Netflix生态系统的通信集成,用于跟踪、记录、指标等。但是,始终适当地模块化框架始终是首要任务。显然,我们构建的许多框架实际上并不特定于Netflix。该框架主要是关于构建GraphQL服务(独立和联合),这是一种简单的方法。
GraphQL模式
GraphQL模式根据schema
的查询和变异操作以及相关的类型和字段来描述API,API规范用户可以在查询中精确地指定要检索的字段,因此GraphQL API非常灵活。模式使GraphQL如此强大,与REST的连接也不同。
GraphQL有两种不同的开发方法:模式优先开发和代码优先开发。通过模式架构先行开发,可以使用GraphQL架构语言手工定义API架构。服务中的代码仅实现此体系结构。
使用代码优先开发,您没有模式文件。相反,模式是在运行时根据代码中的定义生成的。
我们的框架支持模式优先和代码优先的方法。作为Netflix,我们强烈希望采用架构优先的开发方法,因为:
1. 模式架构设计是开发人员体验的重中之重。
2. 它提供了一种使用工具模式的简单方法。
3. 模式差异使后向不相容变化更加明显。在架构中工作时,在联邦GraphQL中,向后兼容性更为重要。
虽然从代码生成模式可能要快一点,但是花时间以一种易于理解的协作方式设计模式是值得的,这样可以争取更好的API。
DGS框架的核心
框架的核心是Spring Boot,开发人员熟悉基于注解的编程模型。
让我们看一个例子,向您展示使用这个框架是多么容易。
让我们从一个简单的模式开始。
type Query {
shows(titleFilter: String): [Show]
}
type Show {
title: String
releaseYear: Int
}
为了实现这个API,我们需要编写一个数据提取程序。
@DgsComponent
public class ShowsDatafetcher {
private final List<Show> shows =
List.of(
new Show("Stranger Things", 2016),
new Show("Ozark", 2017)
);
@DgsData(parentType = "Query", field = "shows")
public List<Show> shows(@InputArgument("titleFilter") String titleFilter) {
if(titleFilter == null) {
return shows;
}
return shows.stream()
.filter(s -> s.getTitle().contains(titleFilter))
.collect(Collectors.toList());
}
}
Show Type
是一个简单的POJO,通常使用Gradle的DGS代码生成插件生成。使用@DgsData
注记的方法是实现野外数据采集程序。请注意,我们不需要每个领域都有数据采集程序,我们可以回到Java对象,框架将处理剩下的工作。该框架还有许多便利,例如,@InputArgument
注释。
此代码足以使GraphQL成为端点运行。只要启动SpringBoot应用程序,就可以使用/graphql
端点。
另一个关键功能是支持轻量级查询测试。这些测试消除了端点可以执行查询时使用HTTP的需要。这些测试看起来和感觉上都像正常的JUnit测试。
@SpringBootTest(classes = {DgsAutoConfiguration.class, ShowsDatafetcher.class})
class ShowsDatafetcherTest {
@Autowired
DgsQueryExecutor dgsQueryExecutor;
@Test
void shows() {
List<String> titles = dgsQueryExecutor.executeAndExtractJsonPath(
" { shows { title releaseYear }}",
"data.shows<li>.title");
assertThat(titles).contains("Ozark");
}
}
框架的完整文档,请参见存储库中的DGS框架:https://netflix.github.io/dgs/
适应GraphQL服务器生态系统
DGS框架如何完美地融入现有的GraphQL生态系统?当前的生态系统包括服务器、客户端、联邦网关和工具,以帮助进行查询测试、模式管理、代码生成等。在使用JVM结构GraphQL服务器时,有一个模式优先库和一个代码优先库。
流行的代码优先库用于graphql的Kotlin-kotlin.graphql-java
中使用java实现模式的第一个GraphQL API最为流行,但设计为低级库。
无论您使用的是Java还是Kotlin,我们的框架都提供了一种Spring引导构建GraphQL的方法一种简单的服务方式。它可以用来构建独立服务,也可以用来组合GraphQL。
DGS框架为实现GraphQL服务提供了一种方便的方法。联合允许服务共享网关公开的统一图形。通常,服务使用Apollo的Defined@extends
规则共享并扩展了第一次模拟考试中定义的类型。它是关于在微服务GraphQL之间划分大的整体的,这是一种有效的建模所有权的方法。
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/1746.html
暂无评论