GraphQL(二)Spring boot + Netflix DGS

简介: Spring boot + Netflix Domain Graph Service(DGS) + Apollo FederationNetflix DGS根据GraphQl schema及对应实体类,加载模式并结合DataFetcher将对象的字段进行绑定,执行相应的逻辑

Netflix Domain Graph Service(DGS)是在Netflix内部创建的一个新的开放源代码框架,该框架简化并帮助了使用GraphQL实现Spring Boot应用程序。

GraphQL(一)基础介绍及应用示例

shcema

与创建关系数据库的表结构一样,我们将对GraphQL进行相同的操作,即创建schema。我们创建的必须位于以下路径/src/main/resources/schema中,并且在此路径中,Netflix DGS将负责加载模式。

对于每个模式,我们创建了一个扩展名为graphqls的不同文件。其中有一个QueryResolver类型,它将具有两个不同的搜索,以及一个MutationResolver以便能够在数据库中创建对象。
创建3个不同的方案,帐户,用户和银行:

type QueryResolver {
   
   
    users: [User]
    user(id: ID!): User!
}

type MutationResolver {
   
   
    createUser(user: UserInput!): User
}

input UserInput {
   
   
    firstName: String!
    lastName: String!
    address: String!
    country: String!
    city: String!
    age: Int
}

type User {
   
   
    id: ID!
    firstName: String!
    lastName: String!
    address: String!
    country: String!
    city: String!
    age: Int!
    bank: Bank
    accounts: [Account]
}

schema {
   
   
    query: QueryResolver
    mutation: MutationResolver
}

实体类

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class UserInput {
   
   

    private String firstName;

    private String lastName;

    private int age;

    private String address;

    private String country;

    private String city;
}

定义好schema,并创建好对应的实体类,Netflix DGS将负责加载模式。结合下述的DataFetcher即可将对象的字段绑定,执行相应的逻辑

DataFetcher

DataFetcherGraphQL Java服务器中是一个非常重要的概念,在执行查询时,通过Datafetcher获取一个字段的数据。也就是说我们需要为querymutation中定义的方法,以及对定义的对象中的字段绑定一个DataFetcher实现,这样在GraphQL执行语法后才能通过绑定的DataFetcher执行相应的逻辑。

Netflix已经创建了它的基于注释的DGS框架,该框架由Spring Boot支持,能简化DataFetcher的使用。下面为DGS框架的基本注释:

  • @DgsComponent:此注释负责指示类将要执行查询,DataFetcher类应在定义中带有此注释。
  • @DgsData:每个带有逻辑以执行查询的方法都必须使用@DgsData进行注释。我们将在其中添加父类型的位置,这是架构的类型以及在架构中定义的字段。
  • @InputArgument:用于定义在查询中作为参数传递的参数。
  • @DgsQueryparentTypeQuery@DgsData的缩写。
  • @DgsMutationparentTypeMutation@DgsData的缩写。

使用DGS能够通过实现DgsCustomContextBuilder类来创建自己的上下文。可以使用它来记录或存储状态,或保存一些通过DataFetchingEnvironment类访问的信息。

在示例类UserQuery中,可以看到DataFetchingEnvironment的用法

@DgsComponent
@RequiredArgsConstructor
public class UserQuery {
   
   

    private final UserRepository userRepository;
    private final CustomContextBuilder contextBuilder;

    @DgsData(parentType = "QueryResolver", field = "users")
    public Iterable<User> findAll(DgsDataFetchingEnvironment dfe) {
   
   
        var users = (List<User>) userRepository.findAll();
        contextBuilder.customContext(users, null, null).build();
        return users;
    }

    @DgsData(parentType = "QueryResolver", field = "user")
    public User findById(@InputArgument("id") String id, DataFetchingEnvironment dfe) {
   
   
        CustomContext customContext = DgsContext.getCustomContext(dfe);
        var users = customContext.getUsers();
        if (null != users) {
   
   
            var user = users.stream().filter(u -> u.getId().equals(UUID.fromString(id))).findFirst();
            return user.orElseGet(() -> userRepository.findById(UUID.fromString(id)).orElseThrow(DgsEntityNotFoundException::new));
        } else {
   
   
            return userRepository.findById(UUID.fromString(id)).orElseThrow(DgsEntityNotFoundException::new);
        }
    }
}

Apollo Federation

Apollo FederationGraphQL API组合成一个统一的超图(supergraph)

在联合架构中,您的各个 GraphQL API 被称为subgraphs ,它们被组合成一个supergraph。通过查询您的超图,客户端可以同时查询您的所有子图:

在这里插入图片描述

网关充当您的超图的公共访问点。它接收传入的1GraphQL1操作并智能地将它们分布在您的子图中。对于客户端来说,这看起来与查询任何其他GraphQL服务器完全相同——不需要特殊配置。
Apollo Federation可以做到,通过网关将多个graphql对外输出成一个,客户端即可通过一次请求获取多个业务线的所有Graphql

Apollo Federation目前不支持GraphQL 订阅操作

优化思路

  1. 优化关注数量获取。如果已经拿过关注列表,就从关注列表中获取关注总数

参考资料:

  1. GraphQL
  2. graphql-java-tools
  3. GraphQL Java从入门到实践
  4. DGS框架
  5. Spring Boot和Netflix DGS的GraphQL源码案例
  6. Apollo Federation
相关文章
|
11天前
|
前端开发 Java API
Spring Boot与GraphQL的集成
Spring Boot与GraphQL的集成
|
6天前
|
Java API 开发者
如何在Spring Boot中使用GraphQL
如何在Spring Boot中使用GraphQL
|
17天前
|
负载均衡 算法 Java
Spring Cloud Netflix 之 Ribbon
Spring Cloud Netflix Ribbon是客户端负载均衡器,用于在微服务架构中分发请求。它与RestTemplate结合,自动在服务发现(如Eureka)注册的服务之间进行调用。配置包括在pom.xml中添加依赖,设置application.yml以连接Eureka服务器,并在配置类中创建@LoadBalanced的RestTemplate。通过这种方式,当调用如`/user/userInfoList`的接口时,Ribbon会自动处理到多个可用服务实例的负载均衡。
|
1月前
|
安全 Java 开发者
Java一分钟之-Spring Cloud Netflix Eureka:服务注册与发现
【6月更文挑战第8天】Spring Cloud Eureka是微服务架构的关键,提供服务注册与发现功能。本文讲解Eureka工作原理、配置、常见问题及解决方案。Eureka包含Server(管理服务状态)和Client(注册服务实例并发现服务)。快速入门包括启动Eureka Server和创建Eureka Client。常见问题涉及服务注册不上、服务下线和客户端注册信息不准确,可通过检查网络、理解自我保护机制和配置元数据解决。此外,文中还提及健康检查、安全配置和集群部署等高级实践,以增强系统健壮性和扩展性。
64 8
|
12天前
|
Java
graphql dgs springboot gradle学习
https://dgraphql dgs springboot gradle学习
|
1月前
|
监控 Java UED
Java一分钟之-Spring Cloud Netflix Hystrix:容错管理
【6月更文挑战第9天】Spring Cloud Hystrix是用于微服务容错管理的库,通过断路器模式防止服务雪崩。本文介绍了Hystrix的基本概念,如断路器、线程隔离和fallback机制,并展示了如何快速上手,包括添加依赖、启用注解和编写Hystrix命令。此外,还讨论了常见问题(如断路器打开、资源泄漏和不当的Fallback策略)及其解决方案。通过自定义Hystrix指标监控,可以进一步优化系统性能。理解Hystrix工作原理并适时调整配置,对于构建健壮的微服务至关重要。
140 3
|
1月前
|
缓存 负载均衡 Java
Java一分钟之-Spring Cloud Netflix Ribbon:客户端负载均衡
【6月更文挑战第9天】Spring Cloud Netflix Ribbon是客户端负载均衡器,用于服务间的智能路由。本文介绍了Ribbon的基本概念、快速入门步骤,包括添加依赖、配置服务调用和使用RestTemplate。此外,还讨论了常见问题,如服务实例选择不均、超时和重试设置不当、服务列表更新不及时,并提供了相应的解决策略。最后,展示了如何自定义负载均衡策略。理解并正确使用Ribbon能提升微服务架构的稳定性和效率。
90 3
|
13天前
|
前端开发 Java API
|
14天前
|
缓存 安全 Java
Spring Boot与GraphQL的集成最佳实践
Spring Boot与GraphQL的集成最佳实践
|
14天前
|
Java API Spring
教程:Spring Boot中如何集成GraphQL
教程:Spring Boot中如何集成GraphQL