4年前 (2021-03-22)  相关技术 |   抢沙发  1945 
文章评分 0 次,平均分 0.0

Netflix开源GraphQL框架DGS介绍

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服务器时,有一个模式优先库和一个代码优先库。

流行的代码优先库用于graphqlKotlin-kotlin.graphql-java中使用java实现模式的第一个GraphQL API最为流行,但设计为低级库。

无论您使用的是Java还是Kotlin,我们的框架都提供了一种Spring引导构建GraphQL的方法一种简单的服务方式。它可以用来构建独立服务,也可以用来组合GraphQL。

DGS框架为实现GraphQL服务提供了一种方便的方法。联合允许服务共享网关公开的统一图形。通常,服务使用Apollo的Defined@extends规则共享并扩展了第一次模拟考试中定义的类型。它是关于在微服务GraphQL之间划分大的整体的,这是一种有效的建模所有权的方法。

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/1746.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册