Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 图形ql-usł;ug网关模式_Java_Spring Boot_Design Patterns_Graphql_Graphql Java - Fatal编程技术网

Java 图形ql-usł;ug网关模式

Java 图形ql-usł;ug网关模式,java,spring-boot,design-patterns,graphql,graphql-java,Java,Spring Boot,Design Patterns,Graphql,Graphql Java,1) EAA目录中的网关模式 使用网关模式隐藏了“业务微服务”的复杂性。此组件负责根据配置将请求正确重定向到适当的服务。前端应用程序只能与此组件通信 链接: 我想知道GraphQl如何处理这种模式? 如果每个微服务有一个GraphQl端点,我们如何实现这个模式 回答-编辑: 在我的项目中,有架构,然后有网关,zuul将其发送到另一个网关(它通过请求中的URL知道)GraphQl是一个端点,因此zuul不起作用。 所以我们只有两个步骤(例如,始终可以在zipkin中检查这一点),比如: 网关微服

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

链接:

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

回答-编辑:

在我的项目中,有架构,然后有网关,
zuul
将其发送到另一个网关(它通过请求中的
URL
知道)
GraphQl
是一个端点,因此
zuul
不起作用。 所以我们只有两个步骤(例如,始终可以在
zipkin
中检查这一点),比如:

网关微服务
->
微服务X

关于:

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

我就是这么想的。 在我的项目中,只有
API网关
可用于
互联网
。 但在这种情况下,我想知道我们是否进入了这样的查询,5个
查询
到微服务
A
和3个
查询
到微服务
B
我如何在这个微服务网关中传递它们-我不想一块一块地剪切,所以我将逐个发送(总计3个)从it向microservice 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>
在控制器中,我有:

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();
}
然后如果用户发送一个请求 从
Microserivce A
获取
getAllItems
getDataTypes
,从
microservice B
获取
Z
资源 如何发送两个查询: 首先使用
getAllItems
getDataTypes
Microservice A
第二个是
Z
请求
microservice B

我如何以这种方式分离
GraphQL
请求

我不想一个接一个地发送reuqests-例如,当我收到: 从
Microserivce A
我不想用以下方式调用两次
Microservice A
一次:
getAllItems
第二次使用
getDataTypes

如何仅通过
microservice
轻松分离查询

例如,在GraphQL网关
中创建多个
模式
(每个
微服务一个),以及
使用多个
模式配置
一个端点`-这可能吗?还是用其他方法来解决

也许这是因为我误解了
GraphQL
,但我认为在上面的
案例中,我们必须在
java
中为每个
微服务配置一个
GraphQL

我不想要一个
GraphQL网关
,它通过经典的
REST
api(而不是
GraphQL
)射向
microservice X
),这是我们失去很多东西的原因,例如
获取优化
,请参见此处:
或者提出
N
请求而不是
one
来具体
microservice X

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

照片取自

该组件负责请求的正确重定向 根据配置将其连接到相应的服务

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

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

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

添加GraphQLAPI后,我们将这些麻烦的工作转移到GraphQLAPI。用户只需直接与GraphQLAPI通信(因此它是一个网关)。他们只需调用一个API即可获得所需的数据,而无需调用多个API

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

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


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

我更新了这个问题-我还想到了
也许你实现了另一个GraphQL API来整合这些微服务的GraphQL API
,但我有点担心。如果有什么我没有写清楚的,请在评论中问我足够地通过
GraphQL网关
(仅在互联网上可用)->其他
微服务
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();
}
type Query {
    getAllItems: [TestEntity] # from microservice A
    getDataTypes: [DictionaryType] # from microservice A
    (...) # Other from microservice A,B,C,(...)
}