Conforme sua organização cresce, é comum que vários serviços API sejam criados, cada um fornecendo seu próprio conjunto de recursos. Juntamente com esses serviços, você desejará fornecer diferentes aplicativos cliente para que seus usuários usem seu produto. Eventualmente, sua arquitetura pode ficar assim:

Cada aplicativo cliente tem necessidades diferentes.

Existem muitos motivos pelos quais isso acontece. Com o tempo, a estrutura da equipe pode ter direcionado a criação do serviço e, no momento, era mais fácil ter uma única equipe com uma única base de código em vez de ter uma rede de equipes para a propriedade do serviço.

Outro motivo pode ser que diferentes recursos em seu produto tinham diferentes problemas de escala. Por exemplo, sua pilha de análise pode ter necessidades drasticamente diferentes das suas pilhas de login de usuário, e não faz sentido combinar as duas.

Quaisquer que sejam as razões, esse tipo de arquitetura retardará o desenvolvimento futuro para as equipes de serviço de back-end e equipes de cliente de front-end. Os aplicativos cliente precisarão interagir com vários protocolos, usar estratégias de autenticação diferentes, se preocupar com qual API fornece a eles que tipo de dados e, potencialmente, fazer várias chamadas de API para recuperar dados para uma única página.

Em vez de refatorar cada serviço de API ou reconstrução de toda a arquitetura-o que é caro e arriscado- Gateways de API pode ajudar nesta situação.

O que são gateways de API GraphQL ?

Os gateways de API não são nenhuma novidade para microsserviços. Já vi muitos desenvolvedores usá-los para fornecer uma única interface (e protocolo) para aplicativos cliente para obter dados de várias fontes.

Eles podem resolver os problemas descritos anteriormente fornecendo um único protocolo de API, um único mecanismo de autenticação e garantindo que os clientes só precisem falar com uma equipe ao desenvolver novos recursos.

Usar os gateways da API GraphQL, por outro lado, é um conceito relativamente novo que se tornou popular recentemente. Isso ocorre porque GraphQL tem algumas propriedades que se adaptam perfeitamente a gateways de API.

Um gateway de API GraphQL pode ter um esquema único definido e dados de origem de vários microsserviços diferentes, para que os clientes possam consultar uma combinação de campos sem saber de onde vêm os dados.

Com esse recurso, descobrir como recuperar os dados não é uma questão de com quem falar, mas de onde eles estão no esquema GraphQL .

Existem muitos pacotes JavaScript que ajudam no desenvolvimento. Alguns fornecem uma camada de abstração para a implementação de um gateway de API GraphQL, enquanto outros podem fazer muito mais por você.

Costura de esquema com gateways GraphQL

Agora precisamos de um serviço de gateway de API que irá ser responsável por receber operações e retornar dados de serviços novos e legados. Podemos fazer isso de duas maneiras diferentes: costura de esquema ou federação .

Por uma questão de tempo, examinaremos mais de perto a costura do esquema , mas você pode aprender mais sobre a federação GraphQL em este artigo.

Em termos de qual pacote JavaScript usar, poderíamos escrever nosso próprio servidor Node.js GraphQL personalizado com Apollo Server ou Mercurius , onde escrevemos código para interpretar as operações GraphQL provenientes dos clientes, enviá-lo para APIs downstream e retornar dados mapeados para o que o cliente espera.

Essa abordagem é demorada tenso, mas pode fazer sentido dependendo da sua situação. A vantagem é que ele pode ser ajustado especificamente para sua organização e práticas recomendadas.

Usando GraphQL Mesh como um gateway de API GraphQL

Bibliotecas como GraphQL Mesh , por outro lado, agrupa automaticamente várias fontes de dados em uma única API GraphQL. Isso pode economizar tempo de desenvolvimento, mas, como as bibliotecas que fazem muito por você, pode ser necessário fornecer substituições personalizadas.

O GraphQL Mesh não atuará apenas como nosso gateway de API GraphQL, mas também como nosso mapeador de dados. Ele oferece suporte a diferentes fontes de dados, como APIs REST OpenAPI/Swagger, APIs gRPC, bancos de dados, GraphQL (obviamente) e muito mais. Ele pegará essas fontes de dados, as transformará em APIs GraphQL e as unirá.

Para demonstrar o poder de uma biblioteca como essa, criaremos uma API simples do SpaceX Flight Journal. Nosso aplicativo irá registrar todos os lançamentos SpaceX que participamos ao longo dos anos. Aqui está o repositório GitHub para este projeto.

Nosso aplicativo usará duas fontes de dados: uma API GraphQL pública que nos informa sobre os lançamentos do SpaceX e um banco de dados MongoDB local.

A API GraphQL SpaceX estará disponível para nós por meio de um proxy (todos os nomes de operação são iguais), mas GraphQL O Mesh nos dará novas operações para nossa conexão de banco de dados MongoDB. Isso nos permitirá criar usuários e marcar os lançamentos que participamos.

Primeiro, instale as bibliotecas:

npm install @ graphql-mesh/cli @ graphql-mesh/graphql @ graphql-mesh/mongoose graphql mongoose

Agora, crie modelos básicos do Mongoose que descrevem nosso esquema MongoDB:

//./src/models.js const {model, Schema}=require (“mongoose”); const UserSchema=novo Esquema ({nome: {tipo: String,},}, {coleção:”usuários”,}); const User=model (“User”, UserSchema); const LaunchesAttendedSchema=new Schema ({spacexLaunchID: {type: String,}, userId: {type:”ObjectId”, ref:”User”},}, {collection:”launchches_attended”,}); const LaunchesAttended=model (“LaunchesAttended”, LaunchesAttendedSchema); module.exports={User, LaunchesAttended,};

A seguir, crie um arquivo de configuração GraphQL Mesh,.meshrc.yaml:

//.meshrc.yml sources:-name: SpaceX handler: graphql: endpoint: https://api.spacex.land/graphql/method: POST-name: Mongoose handler: mongoose: connectionString: mongodb://admin: password @ localhost: 27017/test? authSource=admin & readPreference=primary & appname=MongoDB% 20Compass & directConnection=true & ssl=false modelos:-name: Caminho do usuário:./src/models.js#User-name: LaunchesAttended path:./src/models.js#LaunchesAttended

Faça o upload do banco de dados MongoDB com Docker Compose ( exemplo docker-compose.yml aqui ):

docker-compose up mongo

E é isso! Sirva nosso novo servidor GraphQL com:

./node_modules/.bin/graphql-mesh serve

Isso o levará a uma instância GraphiQL, que é uma interface agradável para consultar servidores GraphQL. Clique na barra lateral do documento e explore as opções que temos disponíveis. Você perceberá que temos uma maneira de ver os lançamentos anteriores.

Para testar nossos novos recursos, podemos consultar lançamentos anteriores, escolher um id da lista e criar uma linha em o banco de dados MongoDB para o usuário iniciar a referência do SpaceX.

Primeiro, crie um usuário:

mutation CreateUser ($ input: CreateOneUserInput!) {userCreateOne (record: $ input) {recordId}}

Agora, supere os lançamentos:

query PastLaunches {launchchesPast (limit: 10) {mission_name id launch_date_local}}

Marque um lançamento como atendido:

mutation LaunchesAttendedCreateOne ($ input: CreateOneLaunchesAttendedInput!) { launchchesAttendedCreateOne (record: $ input) {recordId}}

Finalmente, veja todos os lançamentos anteriores que você atendeu:

query LaunchesAttended {launchchesAttendedFindMany {spacexLaunchID userId}}

Conclusão

Em pouco tempo (e depois de alguns arquivos de configuração), fomos capazes de construir nosso próprio gateway GraphQL API, que costurou a API SpaceX GraphQL e uma API GraphQL gerada a partir de um banco de dados MongoDB local, permitindo-nos criar um aplicativo que registra quais lançamentos atendemos. Este caso de uso foi uma demonstração de como os gateways GraphQL podem ser poderosos para a experiência do desenvolvedor do cliente.

Sem esse gateway, o cliente teria que consultar duas APIs separadamente. Em vez disso, o GraphQL Mesh nos ajudou a gerar rapidamente operações CRUD básicas que poderíamos realizar em nosso banco de dados Mongo, fazendo com que nosso aplicativo tivesse recursos específicos do usuário.

No geral, há muitas maneiras de usar gateways de API e uma infinidade de bibliotecas para escolher para ajudá-lo a construir um sistema distribuído que pode ser ajustado para desempenho, segurança e organizações com várias equipes.