Nest JS Graphql с Apollo Federation Gateway для микросервисов #часть-1

Вся эта серия изначально была опубликована здесь https://tkssharma.com/nestjs-with-apollo-federation-for-microservices-part-1/

В конце этого блога мы должны быть в состоянии 🚀

  • написать шлюз apollo graphql в nestjs 🎉
  • писать graphql сервис, расширяющий интерфейс к graphql шлюзу 🎉
  • мы поймем, как apollo federation делает под капотом создание схемы для подграфов ваших микросервисов и как мы можем управлять всем с помощью единой конечной точки 🎉
  • мы наконец узнаем, как эта архитектура с apollo federation gateway с несколькими микросервисами является технологией, меняющей игру 🎉.

Это серия блогов

  • https://tkssharma.com/nestjs-with-apollo-federation-for-microservices-part-2
  • https://tkssharma.com/nestjs-with-apollo-federation-for-microservices-part-3
  • https://tkssharma.com/nestjs-with-apollo-federation-for-microservices-part-4

Чтобы понять всю архитектуру, мы построим все эти сервисы вместе

  • шлюз Nestjs сервис (Gateway-service)
  • graphql User service (Microservice-1) Auth/Authz
  • graphql Home manager service (Microservice-2) Schema First Graphql Service (Микросервис-2)
  • graphql Служба менеджера бронирования (Микросервис-3) Schema First Graphql Service

Что такое федерация GraphQL?

Федеративная архитектура объединяет различные сервисы в одну конечную точку API. В качестве примера представьте, что у вас есть приложение, которое предоставляет вам обзор миссий Apollo и членов их экипажей.

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

Понимание Nest JS Apollo Federation с Nest JS

Введение в Apollo Federation
Объединение API GraphQL в единый суперграф
📣 Apollo Federation 2 стал общедоступным!

Apollo Federation — это мощная, открытая архитектура, которая поможет вам создать единый суперграф, объединяющий несколько GraphQL API:

С помощью федерации вы можете ответственно разделить владение суперграфом между любым количеством команд. И даже если в настоящее время у вас есть только один GraphQL API, Apollo Federation необходима для масштабирования этого API по мере роста ваших возможностей, пользовательской базы и организации.

Federation также поддерживает бесплатный управляемый режим с Apollo Studio, который позволяет изменять и развивать ваш суперграф без простоев.

Как это работает

В федеративной архитектуре ваши отдельные GraphQL API называются подграфами, и они объединяются в суперграф. Обращаясь к вашему суперграфу, клиенты могут одновременно обращаться ко всем вашим подграфам:

Шлюз служит публичной точкой доступа к вашему суперграфу. Он получает входящие операции GraphQL и разумно распределяет их между вашими подграфами. Для клиентов это выглядит точно так же, как запрос к любому другому серверу GraphQL — никакой специальной конфигурации не требуется.

Users subgraph
type User {
  id: ID!
  name: String!
}
Products subgraph
type Product {
  upc: String!
  inStock: Boolean!
}
Вход в полноэкранный режим Выход из полноэкранного режима

Для взаимодействия со всеми вашими подграфами шлюз использует специальную схему суперграфа, которая объединяет эти схемы подграфов.

Чтобы создать схему суперграфа, используется процесс, называемый композицией. Композиция берет все ваши схемы подграфов и разумно объединяет их в одну схему для вашего шлюза:

Supergraph schema (simplified)
type User {
  id: ID!
  name: String!
}
Вход в полноэкранный режим Выход из полноэкранного режима
type Product {
  upc: String!
  inStock: Boolean!
}
Войти в полноэкранный режим Выход из полноэкранного режима

Давайте объединим вместе

Supergraph schema (simplified)
type User {
  id: ID!
  name: String!
}

type Product {
  upc: String!
  inStock: Boolean!
}
Войти в полноэкранный режим Выход из полноэкранного режима

Экземпляры сервера

В федеративной архитектуре каждый экземпляр подграфа имеет свой собственный сервер GraphQL, как и шлюз. Внешние клиенты запрашивают шлюз, а шлюз затем запрашивает отдельные подграфы для получения, объединения и возврата результатов:

  • Шлюз представляет собой одно из следующих устройств:
  • экземпляр Apollo Server, использующий специальные расширения из библиотеки @apollo/gateway
  • экземпляр Apollo Router, высокопроизводительного маршрутизатора графов на основе Rust, который в настоящее время находится в стадии публичного предварительного просмотраНа подграфах может работать Apollo Server с использованием специальных расширений из библиотеки @apollo/subgraph или любой другой совместимый с подграфами GraphQL-сервер. Разные подграфы в одном суперграфе могут даже использовать разные серверные библиотеки.

Унифицируйте ваш граф

Часто, когда организация впервые внедряет GraphQL, несколько команд делают это независимо друг от друга. Каждая команда устанавливает свой сервер GraphQL, который предоставляет данные, используемые этой командой:

Вместо этого вашей организации следует создать единый суперграф, который позволит клиентам получать все необходимые им данные из одной конечной точки:

Разбейте монолитный код

Представлять весь граф масштаба предприятия с помощью монолитного сервера GraphQL может быть непросто. Производительность может снижаться по мере увеличения количества пользователей и функций, а команды в вашей организации вносят изменения в одно и то же приложение:

С суперграфом вы можете одновременно уменьшить узкие места в производительности и продуктивности. Каждая команда может поддерживать свой собственный подграф(ы) независимо, а шлюз суперграфа служит в основном для маршрутизации входящих операций, а не для полного решения каждой из них.

Как будет выглядеть шлюз

  • мы откроем шлюз graphql с помощью nestjs apollo federation
  • мы напишем сервисы User graphql, раскрывающие интерфейс graphql
  • мы будем писать сервисы Cart graphql, экспонирующие интерфейс graphql.

GraphQL federation/Gateway позволяет вам установить один GraphQL API, или шлюз, который получает данные от всех ваших других API. Ваш сервис миссии и ваш сервис пользователя/карты/блога теперь являются подграфами.

Три основные особенности федерации apollo

  • она предоставляет единственную конечную точку в качестве шлюза graphql
  • все остальные сервисы должны использовать подграфы graphql apis
  • она объединяет все подграфы и обеспечивает (сшивание схем) под капотом, объединяя все подграфы.
  • Это решает нашу проблему получения данных из разных сервисов, все это делается внутри через схему.

Заключение

Это было лишь краткое введение в то, что такое apollo graphql federation gateway, давайте узнаем больше об этом в нашем следующем блоге, где мы рассмотрим фактическую реализацию кода graphql Gateway в nestjs.

  • https://tkssharma.com/nestjs-with-apollo-federation-for-microservices-part-2
  • https://tkssharma.com/nestjs-with-apollo-federation-for-microservices-part-3
  • https://tkssharma.com/nestjs-with-apollo-federation-for-microservices-part-4

Ссылки

  • https://www.apollographql.com/docs/federation/
  • https://www.apollographql.com/docs/federation/federation-2/new-in-federation-2
  • https://github.com/apollographql/supergraph-demo-fed2
  • https://www.apollographql.com/docs/federation/federation-spec/
  • https://docs.nestjs.com/graphql/migration-guide
  • https://docs.nestjs.com/graphql/federation

Оцените статью
Procodings.ru
Добавить комментарий