首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GraphQl usług网关模式

GraphQl usług网关模式
EN

Stack Overflow用户
提问于 2019-01-23 08:31:11
回答 1查看 1.3K关注 0票数 2

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到microservice A,3 queries to microservice B --我不能在这个微服务网关中传递它们--我不想一片片地切割它们,所以我将一个接一个地(总结到3个)从它发送到微服务B--但是一次发送3个查询。这同样适用于微型服务--我想一次从graphQL发送来的graphQL

如果我只使用这些:

代码语言:javascript
复制
    <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中,我得到了模式和一些查询,比如:

代码语言:javascript
复制
type Query {
    getAllItems: [TestEntity]
    getDataTypes: [DictionaryType]
    (...)
}

在主计长中我有:

代码语言:javascript
复制
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中使用

代码语言:javascript
复制
type Query {
    getAllItems: [TestEntity] # from microservice A
    getDataTypes: [DictionaryType] # from microservice A
    (...) # Other from microservice A,B,C,(...)
}

然后,如果用户在one request中发送getAllItemsgetDataTypes,从Microserivce A获得Z resources,如何从microservice B发送两个查询:首先使用getAllItemsgetDataTypes发送到Microservice A,其次是Z请求到microservice B

怎样才能以这种方式区分GraphQL请求?

我不想一个一个地发送reuqests -例如,当我得到:从getAllItems获得getDataTypesMicroserivce A时,我不想用:getAllItems调用两次Microservice A,第二次用getDataTypes调用。

怎样才能简单地区分microservice的查询?

例如,制造多个schemas (每个microservice) inGraphQL GraphQL一个)--有可能吗?或者其他解决方法?

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

我不想要一个使用经典的GraphQL gateway api (而不是microservice X api)(而不是GraphQL)向microservice X投篮的REST,因为我们有很多东西是以这种方式丢失的,例如,fetching optimization在这里看到:https://youtu.be/1zIHHi2MaQE?t=1369或向具体microservice X发出N请求而不是one

EN

回答 1

Stack Overflow用户

发布于 2019-01-23 10:12:26

基本上,它意味着下面的体系结构。GraphQL API是位于各种API之上的网关,如传统的Soap、、第三部分API、数据库或blalablab。

https://www.howtographql.com/basics/3-big-picture/拍摄的照片

该构成部分负责根据配置将请求正确地重定向到适当的服务。

GraphQL类型/查询/变异的每个字段都有自己的解析器函数,该解析器函数定义自己的逻辑,从不同的后端服务.So GraphQL类型系统中获取值,其解析器函数是一种配置,定义请求如何重定向到适当的服务以获取数据。

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

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

在添加了Gateway).They API之后,我们将这些麻烦的工作转移到GraphQL API中,.User只需要直接与GraphQL API通信(因此它只是调用一个API来获取他们想要的数据,而不是调用多个API)。

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

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

也许您实现了另一个GraphQL API,它合并了这些微服务的GraphQL API。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54322937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档