代码之家  ›  专栏  ›  技术社区  ›  tryingHard

GraphQl usug网关模式

  •  1
  • tryingHard  · 技术社区  · 7 年前

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

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

    我想知道怎么做 GraphQl 你能处理这种模式吗? 如果我们有一个模式,我们如何实现这个模式 GraphQl 每个微服务的端点?

    回答-编辑:

    在我的项目中,有架构,然后是网关,然后 zuul 将其发送给另一个(它通过 URL (根据要求)。 GraphQl 一个端点是这样吗 祖尔 行不通。 所以我们只有两个步骤(总是可以检查) zipkin 例如)比如:

    Gateway microservice -> Microservice X

    关于:

    也许您可以实现另一个GraphQL API来整合这些功能 微服务的GraphQL API

    我就是这么想的。 仅在我的项目中 API gateway 将提供给 internet . 但在这种情况下,我想知道我们是否得到了,5 queries 微服务 A 和3 询问 微服务 B 我如何在这个微服务网关中传递它们——我不想一块一块地剪切它,所以我将从它向微服务B发送一个接一个(总计3个)的查询——但一次发送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 我得到了schema和一些查询,比如:

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

    那么如果我们 网关微服务 同样依赖于 GraphQl 我们会在 schema :

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

    然后如果用户发送 one request 抓住我 getAllItems getDataTypes 从…起 Microserivce A 得到 Z resources 从…起 microservice B 如何发送两个查询: 首先是 getAllItems getDataTypes Microservice A 第二 Z 请求 微服务B ?

    我怎样才能分开 GraphQL 这样吗?

    我不想一个接一个地发送reuqests,例如当我收到: 抓住我 getAllItems getDataTypes 从…起 微球菌A 我不想打两次电话 微服务 一旦与: getAllItems 第二次是 getDataTypes .

    我怎样才能轻松地通过 microservice 只有

    例如制造许多 schemas (每人一个) microservice) in GraphQL网关 and 配置 one endpoint with many -可能吗?或者其他解决方法?

    也许是因为我的误会 GraphQL 但我认为 case 上面我们必须配置一个 GraphQl 微服务 在里面 java .

    我不想要一个 GraphQL gateway 射向 微服务X 经典的 REST api(不是 GraphQL )例如,因为我们失去了很多东西 fetching optimization 请看这里: https://youtu.be/1zIHHi2MaQE?t=1369 或制造 N 请求而不是 one 具体化 微服务X

    1 回复  |  直到 7 年前
        1
  •  3
  •   Ken Chan    7 年前

    基本上,它意味着以下架构。GraphQL API是位于不同API前面的网关,如遗留Soap API、REST微服务API、第三部分API、数据库或Blalab。

    enter image description here 照片取自 this

    该组件负责请求的正确重定向 根据配置向相应的服务发送。

    GraphQL type/query/mutation的每个字段都有自己的解析器函数,它们定义自己的逻辑来从不同的后端服务获取值。因此,GraphQL类型的系统及其解析器函数是一种配置,定义了请求如何重定向到适当的服务以获取数据。

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

    在添加GraphQL API之前,请先获取要在UI中显示的数据。用户可以先打电话 FooService 获取部分数据。然后根据一些 餐饮服务 数据,他必须打电话 BarService 获取另一部分数据。然后根据一些 酒吧服务 数据,他必须打电话 BazService 获取另一个数据。然后根据一些 BazService 他不得不喋喋不休。。。。。。。。这是一个非常乏味和麻烦的过程。更不用说,不同的API使用不同的名称来表示相同的业务概念。

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

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

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

    也许您可以实现另一个GraphQLAPI来整合这些微服务的GraphQLAPI

    推荐文章