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。
如果我只使用这些:
<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请求?
我不想一个一个地发送reuqests -例如,当我得到:从getAllItems获得getDataTypes和Microserivce 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
发布于 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。
https://stackoverflow.com/questions/54322937
复制相似问题