GraphQl使用网关模式

时间:2019-01-23 08:31:12

标签: java spring-boot design-patterns graphql graphql-java

1)EAA目录中的网关模式 通过使用网关模式,隐藏了“业务微服务”的复杂性。该组件负责根据配置将请求正确重定向到适当的服务。前端应用程序只能与此组件通信。

链接: https://martinfowler.com/eaaCatalog/gateway.html

我想知道GraphQl如何处理这种模式? 如果每个微服务有一个GraphQl端点,如何实现这种模式?

答复-编辑:

在我的项目中,有体系结构,然后有网关,zuul将其发送给另一个网关(URL从请求中知道)。 GraphQl是一个端点,因此zuul无法正常工作。 所以我们只有两个步骤(例如-始终可以在zipkin中进行检查),例如:

Gateway microservice-> Microservice X

关于:

  

也许您实现了另一个GraphQL API来整合这些   微服务的GraphQL API

这就是我的想法。 在我的项目中,API gateway仅可使用internet。 但是在这种情况下,我想知道我们是否像5 queries到微服务A到3 queries到微服务B这样的查询中如何在它们中传递它们网关-我不想一刀切,所以我会从中向微服务B逐一(最多3个)发送查询-但三合一。 微服务A->我想一次从graphQL发送邮件。

如果我仅使用这些:

    <dependency>
        <groupId>com.graphql-java</groupId>
        <artifactId>graphql-spring-boot-starter</artifactId>
        <version>5.0.2</version>
    </dependency>
    <dependency>
        <groupId>com.graphql-java</groupId>
        <artifactId>graphiql-spring-boot-starter</artifactId>
        <version>4.0.0</version> <!--5.0.2 http://localhost:8999/graphiql fails to load-->
    </dependency>

然后在microservice X中,我得到了架构和一些查询,例如:

type Query {
    getAllItems: [TestEntity]
    getDataTypes: [DictionaryType]
    (...)
}

在控制器中,我有:

private DataFetcher<List<TestEntity>> allDictionaryItemsFetcher;
private DataFetcher<Set<DictionaryType>> dictionaryTypeFetcher;

@Value("classpath:test.graphqls")
private Resource schemaResource;
private GraphQL graphQL;
(...)
        allDictionaryItemsFetcher = dataFetchingEnvironment -> dictionaryService.getAllDictionaryItemsAsStrings();
        dictionaryTypeFetcher = dataFetchingEnvironment -> dictionaryService.getDictionaryTypes();


@PostConstruct
private void loadSchema() throws IOException {
    File schemaFile = schemaResource.getFile();
    TypeDefinitionRegistry registry = new SchemaParser().parse(schemaFile);
    RuntimeWiring wiring = buildWiring();
    GraphQLSchema schema = new SchemaGenerator().makeExecutableSchema(registry, wiring);
    graphQL = GraphQL.newGraphQL(schema).build();
}

private RuntimeWiring buildWiring() {
    return RuntimeWiring.newRuntimeWiring()
            .type("Query", typeWriting -> typeWriting
                    .dataFetcher("getAllItems", allDictionaryItemsFetcher)
                    .dataFetcher("getDataTypes", dictionaryTypeFetcher)

            )
            .build();
}

然后,如果我们对Gateway microservice进行相同操作的GraphQl,将在schema中进行:

type Query {
    getAllItems: [TestEntity] # from microservice A
    getDataTypes: [DictionaryType] # from microservice A
    (...) # Other from microservice A,B,C,(...)
}

然后,如果用户发送one requestgetAllItems得到我getDataTypesMicroserivce A,从Z得到resources microservice B 我如何发送两个查询: 首先使用getAllItemsgetDataTypesMicroservice A Zmicroservice B的请求中排名第二?

我该如何分隔GraphQL请求?

我不想一一发送要求,例如,当我得到: 从getAllItems让我getDataTypesMicroserivce A 我不想打两次Microservice A一次:  getAllItems 并第二次使用getDataTypes

如何轻松地仅按microservice分隔查询?

例如,进行许多schemas(每个microservice) in GraphQL网关and配置one endpoint with many方案`-可能吗?或通过其他方法解决吗?

也许是由于我对GraphQL的误解而引起的,但是我认为在上面的case中,我们必须在GraphQl中为每个microservice配置一个java

我不希望使用经典的GraphQL gateway API(而非microservice X)将REST射向GraphQL的原因,因为很多东西使我们迷失了方向,因为示例fetching optimization参见此处: https://youtu.be/1zIHHi2MaQE?t=1369 或发出N而不是one的具体microservice X

请求

1 个答案:

答案 0 :(得分:2)

基本上,它表示以下体系结构。 GraphQL API是位于不同API(例如旧版Soap API,REST Microservice API,第三部分API,数据库或blalablab)前面的网关。

enter image description here 图片取自this

  

此组件负责正确重定向请求   根据配置访问适当的服务。

GraphQL类型/查询/突变的每个字段都有自己的解析程序功能,这些功能定义自己的逻辑以从不同的后端服务获取值。因此GraphQL类型系统及其解析程序功能是一种定义如何配置的配置。请求重定向到适当的服务以获取数据。

  

EAA目录中的网关模式“业务的复杂性   微服务”通过使用网关模式被隐藏。   应用程序只能与此组件进行通信。

在添加GraphQL API之前,要获取要在UI中显示的数据。用户可以首先调用FooService来获取一部分数据,然后基于某些FooService数据,他必须调用BarService来获取另一部分数据。然后,他必须根据一些BarService数据来调用BazService以获取另一个数据。然后,根据某些BazService,他必须责备……..这是一个非常繁琐且麻烦的过程。更不用说不同的API使用不同的名称表示相同的业务概念。

添加GraphQL API之后,我们将这些麻烦的工作移至GraphQL API。用户只需要直接与GraphQL API通信(因此它是网关)。他们只需调用一个API即可获得他们想要的数据,而不是调用许多API。

此外,GraphQL在一个API中整合了在不同服务中具有不同名称和解释的业务概念。因此,从用户的角度来看,它隐藏了“业务微服务”的复杂性,因为它更易于使用开发。

  

如果每个节点都有一个GraphQl端点,我们如何实现此模式   微服务?

也许您实现了另一个GraphQL API,以整合这些微服务的GraphQL API