3年前 (2021-04-20)  相关技术 |   抢沙发  1059 
文章评分 1 次,平均分 5.0

Netflix开源DGS框架:GraphQL for Spring Boot

Netflix在实现其区域图服务(DGS)框架的几个月内,就向Java社区开放了源代码DGS。这个框架使得在Spring引导软件中实现GraphQL变得更简单,并且适合于每个独立的和联合的GraphQL。DGS帮助GraphQL联邦创建一个统一的API网关,在后台调用特定问题所需的各种合作问题。

DGS框架依赖于springboot基于注释的模型。除了与Spring Boot安全性的集成之外,还提供了一个单元来查看框架。通过度量和跟踪选项进行监控。

DGS在Netflix内部使用,并对各种选项进行了全面检查。在引擎盖下面,DGS使用graphqljava库。Netflix建议采用schema-first增长战略来概述合同。向后兼容性是必不可少的,特别是对于GraphQL设置,可以通过评估完全不同的模式变体来验证。

作为REST的替代GraphQL解决了过度获取或不足获取知识的困难。过度获取是指从一个端点获取所有的信息,但是只利用一部分知识,比如说,一个cell软件。这需要过滤并保留未使用的剩余知识。在fetching下面是从一个端点获取所有信息,但是没有足够的知识。这通常需要第二个端点的名称。例如,一个人可能希望检索所有男女同校学生的电子邮件地址,而另一个人可能希望检索注册学者的各种课程。

除了模式优先增长之外,DGS框架还有助于代码优先增长。使用此策略,在整个运行时主要基于代码中的定义生成模式。

实现DGS首先定义一个定义API的模式。Gradle的DGS代码技术插件可以用来生成主要基于问题对象的API

kind Question {
    films(titleFilter: String): [Movie]
}

kind Film {
    title: String
    ...
}

通过使用信息获取程序应用API。用@DgsData注释的策略实现了一个非强制性的学科知识获取器。

@DgsComponent
public class MoviesDatafetcher {


    non-public remaining Listing<Film> films= 
      Listing.of(
         new Film("The Hitchhiker's Information to the Galaxy", 2005)
     );


    @DgsData(parentType = "Question", discipline = "films")
    public Listing<Film> films(@InputArgument("titleFilter") String titleFilter) {
        if(titleFilter == null) {
            return films;
        }


        return films.stream()
            .filter(s -> s.getTitle().incorporates(titleFilter))
            .acquire(Collectors.toList());
    }
}

在启动Spring Boot软件之后,/graphql端点就在那里了。GraphiQL问题编辑器是通过/GraphiQL端点提供的。可以找到不同的选项来提高实例的安全性、度量和跟踪。

Netflix已经为Spring Boot开放了DGS框架(域图服务)GraphQL服务器框架。从公司内部的一个工具开始,它已经被慷慨地开源给我们其他人享受。

Netflix是那些超越REST的组织之一,转而采用GraphQL。Netflix没有向UI开发人员公开大量的微服务,而是选择了一个由GraphQL支持的统一API聚合层。因为他们的基础设施也使用springboot,所以合并是必然发生的。

因此,DGS框架构建在graphql java之上,本质上它在库的底层细节上提供了一层抽象。虽然只使用Kotlin编写(需要kotlin1.4),但该框架主要针对Java,因为Java与Spring的关系最为密切。那个你也可以用Kotlin编写代码。

集成库很容易,因为它也利用了springboot基于注释的模型。例如,在实现数据获取程序(返回查询数据的结构)时,可以使用以下基于注释的代码段:

@DgsComponent
public class ShowsDatafetcher {

private final List<Show> shows = List.of(
  new Show("Stranger Things", 2016),
  new Show("Ozark", 2017),
  new Show("The Crown", 2016),
  new Show("Dead to Me", 2019),
  new Show("Orange is the New Black", 2013)
);

@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());
 }
}

除此之外,它还附带了许多其他功能:

  • 基于注释的Spring-Boot编程模型
  • 将查询测试编写为单元测试的测试框架
  • Gradle代码生成插件,用于从模式创建类型
  • 与GraphQL Federation轻松集成
  • 与Spring Security集成
  • GraphQL订阅(WebSockets和SSE)
  • 文件上载
  • 错误处理
  • 许多扩展点

安装起来很容易。只需添加对库的引用com.netflix.graphql.dgs:graphql-dgs-spring-boot-starter和让它使用GraphQL模式文件,因为DGS是为模式优先开发而设计的。

要为模式中描述的每个类型生成每个GraphQL类型,以及生成数据获取程序,项目中必须包含DSG codegen插件:

plugins {
  id("com.netflix.dgs.codegen") version "4.0.12"
}

这是根据映射规则工作的,例如,基本标量类型映射到相应的Java/Kotlin类型(String、Integer等),而日期和时间类型映射到相应的Java/Kotlin类型java.time类。

代码生成器还可以创建客户机API类,您可以使用这些类使用Java从GraphQL端点查询数据。

  
 

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

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册