1) Шаблон шлюза из каталога EAA Сложность «бизнес-микросервисов» была скрыта с помощью шаблона шлюза.Этот компонент отвечал за правильное перенаправление запросов к соответствующим службам на основе конфигурации.Приложение внешнего интерфейса может взаимодействовать только с этим компонентом.
Ссылка: https://martinfowler.com/eaaCatalog/gateway.html
Мне интересно, как GraphQl
может обрабатывать этот шаблон?Как мы можем реализовать этот шаблон, если у нас есть одна GraphQl
конечная точка на микросервис?
Ответ на ответ - Редактировать:
В моем проекте есть архитектура, тогда есть шлюз, и zuul
отправляет его другому (он знает по URL
Из запроса).GraphQl
является одной конечной точкой, поэтому zuul
не будет работать. Таким образом, у нас есть только два шага (всегда - можно проверить, например, в zipkin
), например:
Gateway microservice
-> Microservice X
Относительно:
Может быть, вы реализуете другой API GraphQL, который объединяет API GraphQL этих микросервисов
Именно так я и думал.В моем проекте только API gateway
будет доступно для internet
.Но в этом случае мне интересно, если мы попали в запрос, например, 5 queries
для микросервиса A
и 3 queries
для микросервиса B
как я могу передать их в этот шлюз микросервиса - я не хочу сокращатьон поштучно, так что я буду отправлять по одному (всего до 3) запросов в микросервис 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
схемы`- возможно ли этоBLE?Или каким-то другим способом решить это?
Возможно, это связано с моим недопониманием GraphQL
, но я думаю, что в case
выше мы должны настроить один GraphQl
на microservice
в java
.
Я нехочу GraphQL gateway
, который стреляет в microservice X
с классическим REST
API (не GraphQL
), причина многих вещей, которые мы теряем таким образом, например fetching optimization
см. здесь: https://youtu.be/1zIHHi2MaQE?t=1369 Иливыполнение N
запросов вместо one
к бетону microservice X