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 request
从getAllItems
得到我getDataTypes
和Microserivce A
,从Z
得到resources
microservice B
我如何发送两个查询:
首先使用getAllItems
和getDataTypes
至Microservice A
Z
对microservice B
的请求中排名第二?
我该如何分隔GraphQL
请求?
我不想一一发送要求,例如,当我得到:
从getAllItems
让我getDataTypes
和Microserivce 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
答案 0 :(得分:2)
基本上,它表示以下体系结构。 GraphQL API是位于不同API(例如旧版Soap API,REST Microservice API,第三部分API,数据库或blalablab)前面的网关。
图片取自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