Gerenciar eficientemente sua API GraphQL com API Gateway

GraphQL é uma poderosa linguagem de consulta para APIs que permite que os desenvolvedores definam a estrutura dos dados que precisam do servidor, e o servidor responde apenas com esses dados. Isso o torna muito mais eficiente e flexível do que as tradicionais APIs REST, que frequentemente exigem múltiplas requisições para recuperar os mesmos dados. No entanto, gerenciar APIs GraphQL pode ser complexo e demorado, especialmente em escala. É aí que um API Gateway entra em cena.

Uma das principais características dos modernos API Gateways, como o Apache APISIX, é o suporte a APIs GraphQL. O APISIX facilita o gerenciamento e a escalabilidade de APIs GraphQL usando seu sistema de configuração flexível e plugins poderosos. Um desses plugins é o degrapghql, que nos permite converter a API GraphQL em uma API REST. Neste post, exploraremos essa funcionalidade com um exemplo.

Objetivos de aprendizagem

Você aprenderá e descobrirá respostas para as seguintes perguntas ao longo do artigo:

  • O que é o plugin DeGraphQL?
  • Quais são os casos de uso e as funcionalidades do plugin DeGraphQL?
  • Como usar o plugin DeGraphQL.
  • Como transformar REST em GraphQL?
  • Como gerenciar o tráfego de API GraphQL?

Gerencie sua API GraphQL com API Gateway

Por que usar o plugin DeGraphQL?

Este plugin é capaz de transformar APIs expostas por um upstream GraphQL (serviço de backend) em um endpoint REST tradicional mapeando URIs em consultas GraphQL. Chamar APIs REST de um cliente típico abre os benefícios do GraphQL para mais pessoas, considere os seguintes casos de uso:

Caso de uso 1: Seus clientes existentes estão acostumados a consumir APIs REST e não estão muito familiarizados com como escrever consultas GraphQL. Para manter as coisas simples para eles, você pode usar o API Gateway Apache APISIX para converter a API GraphQL em uma API REST.

Caso de uso 2: Você está em uma equipe de desenvolvimento front-end que deseja experimentar as funcionalidades existentes da API GraphQL sem pedir à equipe de back-end para implementar um novo servidor GraphQL.

Caso de uso 3: Você não tem acesso para alterar o backend porque é um conjunto existente de APIs GraphQL, potencialmente gerenciado por um terceiro.

Caso de uso 4: Você tem uma infraestrutura de API REST existente, mas está avaliando se o GraphQL pode atender às suas necessidades.

Caso de uso 5: Você tem uma grande base de código, e a migração para GraphQL está acontecendo no backend, mas você quer usar o GraphQL agora sem esperar.

Caso de uso 6: Você tem vários microsserviços e eles usam uma combinação de ambas as abordagens. Você deseja permitir uma comunicação suave entre eles.

Quais são as funcionalidades do plugin DeGraphQL?

O plugin DeGraphQL fornece uma série de funcionalidades úteis que facilitam a configuração e o gerenciamento de sua API GraphQL, incluindo:

Validação de Requisições: Ele pode validar requisições GraphQL recebidas para garantir que atendam a certos critérios. Isso pode incluir verificar a estrutura da consulta, impor restrições de tipo de entrada e muito mais. Ao validar as requisições, você pode garantir que sua API sempre receba requisições válidas e bem formadas.

Análise de Consultas: Ele também pode analisar consultas GraphQL, permitindo que você extraia informações específicas da consulta e as use para informar o comportamento da sua API. Isso pode incluir coisas como selecionar o serviço de backend apropriado com base nos dados solicitados ou modificar a resposta com base em certos parâmetros da consulta.

Transformação de Resposta: Por fim, ele pode transformar respostas GraphQL antes que sejam retornadas ao cliente. Isso pode ser útil para coisas como normalizar estruturas de dados, remover informações sensíveis ou adicionar dados adicionais à resposta.

Com essa capacidade, o Apache APISIX não apenas facilita o uso de REST e GraphQL juntos, mas você também pode definir limites de taxa, impor autenticação e autorização, bloquear clientes que tentam abusar de uma API e garantir que as APIs funcionem perfeitamente à medida que são atualizadas com a ajuda de outros plugins integrados.

Como usar o plugin DeGraphQL (Demo)

Com conhecimento teórico suficiente em mente, agora podemos mergulhar em uma demonstração prática do plugin DeGraphQL. O DeGraphQL precisa de um endpoint GraphQL para consultar. Como exemplo, vamos usar uma das APIs GraphQL públicas gratuitas que recuperam informações sobre países, continentes e idiomas https://countries.trevorblades.com/.

Se você navegar até o link da API de Países acima, ele abrirá um playground onde você pode escrever algumas consultas contra a API GraphQL na interface do usuário.

Consultando a API GraphQL

Você também pode construir sua própria API GraphQL usando StepZen ou ApollographQL fornecido por estúdios GraphQL que ajudam você a construir e implantar sua própria API GraphQL combinando APIs pré-construídas como Accuweather, Airtable, GitHub, Twitter, Trello e muito mais. Por exemplo, você pode compor duas APIs Accuteweather e Countries juntas para coletar as informações meteorológicas fornecidas por um nome de país/cidade e colocar o APISIX na frente para consultar a API a partir do REST.

Agora, nossa tarefa é transformar a definição de consulta acima em uma chamada REST simples e enviá-la como dados JSON. Como resultado, o API Gateway Apache APISIX expõe o endpoint REST e deve ser capaz de rotear todas as requisições para a API GraphQL.

Por exemplo, todas as requisições REST para o caminho URI /country-info do API Gateway com uma consulta subjacente por um código de país devem ser convertidas e passadas para a API GraphQL de países https://countries.trevorblades.com/graphql.

Um exemplo de comando curl que se parece com isso:

curl -i http://127.0.0.1:9080/country-info  -X POST -d \
'{
   "code": "EE"
}'

E devemos obter uma resposta da API da seguinte forma:

{
  "data": {
    "country": {
      "code": "EE",
      "capital": "Tallinn",
      "currency": "EUR",
      "languages": [
        {
          "name": "Estonian"
        }
      ]
    }
  }
}

Nas próximas seções, aprenderemos como alcançar isso passo a passo.

Vamos colocar o Apache APISIX em funcionamento

Antes de usar o plugin degrapghql, você precisará instalar o Apache APISIX. Você pode seguir as instruções de instalação no site do Apache APISIX para começar.

Pré-requisitos

  • Docker é usado para instalar o etcd e o APISIX em contêineres.
  • curl é usado para enviar requisições ao APISIX para validação. Você também pode usar ferramentas fáceis como Postman para interagir com a API.

O APISIX pode ser facilmente instalado e iniciado com o seguinte script de início rápido:

curl -sL https://run.api7.ai/apisix/quickstart | sh

Isso criará dois contêineres Docker – um etcd para armazenar a configuração e o próprio APISIX Gateway. Quando você vir a mensagem “✔ APISIX is ready!”, podemos configurar um upstream, plugin e rota via a API Admin do APISIX que proxy as requisições para a API GraphQL.

Criar um Upstream

Em seguida, criaremos um objeto Upstream para registrar nossa API GraphQL de Países no API Gateway:

curl "http://127.0.0.1:9180/apisix/admin/upstreams/1" -X PUT -d '
{
  "name": "GraphQL API upstream",
  "desc": "Registrar a API GraphQL de Países como o upstream",
  "type": "roundrobin",
  "scheme": "https",
  "nodes": {
    "countries.trevorblades.com": 1
  }
}'

Criar uma Configuração de Plugin

Em seguida, configuramos um novo objeto de configuração de plugin. Usaremos dois plugins de transformação proxy-rewrite e degraphql para reescrever o host e o URI da requisição e fazer uma consulta à API GraphQL, respectivamente.

curl http://127.0.0.1:9180/apisix/admin/plugin_configs/1 -X PUT -d '
{
   "plugins":{
      "proxy-rewrite":{
         "uri":"/graphql",
         "host":"countries.trevorblades.com"
      },
      "degraphql":{
         "query":"query Country($code: ID!) {
                country(code: $code) {
                    code
                    capital
                    currency
                    languages {
                        name
                    }
                }  
          }",
         "variables":[
            "code"
         ]
      }
   }
}'

Na configuração do plugin DeGraphQL acima, definimos dois atributos, como query e variables. As variáveis de consulta GraphQL podem ser definidas no corpo da requisição Post ou nos URIs em uma chamada REST.

A consulta que estamos executando, neste caso, se parece com o seguinte e você pode substituí-la pela sua própria:

query ($code: ID!) {
  country(code: $code) {
    code
    capital
    currency
    languages {
      name
    }
  }
}

Criar uma Rota com o Plugin DeGraphQL

Esta etapa envolve a configuração de uma nova rota que usa a configuração do plugin e a configuração da rota para funcionar com o upstream (referenciando seus IDs) que criamos nas etapas anteriores:

curl -i http://127.0.0.1:9180/apisix/admin/routes/1 -X PUT -d '
{
   "name":"Rota da API GraphQL",
   "desc":"Criar uma nova rota no APISIX para a API GraphQL de Países",
   "uri":"/country-info",
   "upstream_id":"1",
   "plugin_config_id":1
}'

Testar a Ativação do Plugin DeGraphQL

Agora vamos testar essa nova configuração com o seguinte comando curl.

curl -i http://127.0.0.1:9080/country-info  -X POST -d \
'{
   "code": "EE"
}'

Receberemos uma resposta do APISIX:

{
  "data": {
    "country": {
      "code": "EE",
      "capital": "Tallinn",
      "currency": "EUR",
      "languages": [
        {
          "name": "Estonian"
        }
      ]
    }
  }
}

A mesma variável code também pode ser fornecida como argumentos GET:

curl -i http://127.0.0.1:9080/country-info?code=EE

Transformação de Resposta

Com a ajuda do plugin response-rewrite do Apisix, é possível transformar respostas GraphQL antes que sejam retornadas ao cliente. Vamos usar este plugin para remover a chave currency e o valor da resposta JSON para mostrar apenas todo o resto. Para fazer isso, precisamos adicionar o plugin response-rewrite à configuração de plugin existente.

curl http://127.0.0.1:9180/apisix/admin/plugin_configs/1 -X PATCH -d '
{
  "plugins":{
   "response-rewrite": {
      "filters":[
        {
          "regex":"(?:\"currency\":\")(.*?)(?:\")",
          "scope":"once",
          "replace":""
        }
      ],
      "vars":[
        [
          "status",
          "==",
          200
        ]
      ]
   }
  }
}'

Após a instalação deste plugin, você pode fazer uma requisição para /country-info novamente e ver a resposta transformada:

{
  "data": {
    "country": {
      "code": "EE",
      "capital": "Tallinn",
      "languages": [
        {
          "name": "Estonian"
        }
      ]
    }
  }
}

Resumo

No geral, o plugin DeGraphQL é uma ferramenta essencial para qualquer desenvolvedor que esteja construindo uma API GraphQL com o APISIX. Ele tem funcionalidades poderosas e uma configuração fácil de usar, o que facilita a integração em seu gateway de API existente, enquanto o suporte para funcionalidades específicas do GraphQL garante que sua API seja performática, confiável e escalável.

Recursos relacionados

Share article link