GraphQl usług Шаблон шлюза - PullRequest
       27

GraphQl usług Шаблон шлюза

0 голосов
/ 23 января 2019

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

1 Ответ

0 голосов
/ 23 января 2019

В основном это означает следующую архитектуру. GraphQL API - это шлюз, который находится перед различными API, такими как устаревший Soap API, API REST Microservice, API частично или частично, база данных или blalablab.

enter image description here Фото взяты из это

Этот компонент отвечал за правильное перенаправление запросов. к соответствующим службам на основе конфигурации.

Каждое поле типа / запроса / мутации GraphQL имеет свою собственную функцию распознавателя, которая определяет свою собственную логику для получения значений от различных внутренних служб. Так что система типов GraphQL и ее функции распознавателя являются своего рода конфигурацией, которая определяет, как запросы перенаправляют в соответствующие службы для получения данных.

Шаблон шлюза из каталога EAA Сложность "бизнеса" microservices "был скрыт с помощью шаблона Gateway. Фронт Приложение может общаться только с этим компонентом.

Перед добавлением API GraphQL, чтобы данные отображались в пользовательском интерфейсе. Пользователь может сначала позвонить FooService, чтобы получить часть данных. Затем, основываясь на некоторых данных FooService, он должен вызвать BarService, чтобы получить другую часть данных. Затем, основываясь на некоторых данных BarService, он должен вызвать BazService, чтобы получить другие данные. Затем, основываясь на каком-то BazService, он должен блаблабля ........ что является очень утомительным и хлопотным процессом. Не говоря уже о том, что разные API используют разные имена для представления одной и той же бизнес-концепции.

После добавления GraphQL API мы перенесем эту хлопотную работу на GraphQL API. Пользователю нужно только напрямую взаимодействовать с GraphQL API (так что это Gateway ). Они просто вызывают один API для получения данных они хотят, а не вызывать много API.

Кроме того, GraphQL объединяет бизнес-концепции с разными именами и интерпретациями в разных сервисах в одном API. Таким образом, с точки зрения пользователя, он скрывает сложность «бизнес-микросервисов», так как его легче использовать, развивая

Как мы можем реализовать этот шаблон, если у нас есть одна конечная точка GraphQl на microservice

Возможно, вы реализуете другой API-интерфейс GraphQL, который объединяет API-интерфейс GraphQL этих микросервисов

...