Java 图形ql-usł;ug网关模式
1) EAA目录中的网关模式 使用网关模式隐藏了“业务微服务”的复杂性。此组件负责根据配置将请求正确重定向到适当的服务。前端应用程序只能与此组件通信 链接: 我想知道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中检查这一点),比如: 网关微服
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,(...)
}