Crie rapidamente uma GraphQL API de alto desempenho para o MongoDB com Hasura
Avalie esse Tutorial
Em 2012, o GraphQL foi apresentado como uma especificação de API amigável ao desenvolvedor que permite que os clientes solicitem exatamente os dados de que precisam, tornando-os eficientes e rápidos. Ao reduzir a necessidade de múltiplas solicitações e limitar a busca excessiva de dados, o GraphQL simplifica a recuperação de dados, melhorando a experiência do desenvolvedor. Isso leva a melhores aplicativos, garantindo um carregamento de dados mais eficiente e menos uso da largura de banda, o que é particularmente importante para ambientes móveis ou de baixa largura de banda.
Usar GraphQL — em vez de REST — no MongoDB é desejável para muitos casos de uso, especialmente quando há necessidade de consultar simultaneamente dados de várias instâncias do MongoDB, ou quando os engenheiros precisam unir dados NoSQL do MongoDB com dados de outra fonte.
No entanto, os engenheiros muitas vezes enfrentam desafios para implementar APIs GraphQL e colocá-los em camadas em suas fontes de dados do MongoDB. Muitas vezes, essa curva de aprendizado e a sobrecarga de manutenção inibem a adoção. O Hasura foi projetado para resolver esse desafio comum com a implementação do GraphQL.
Hasura é uma solução de API do GraphQL de código baixo. Com o Hasura, até mesmo engenheiros que não estão familiarizados com o GraphQL podem criar APIs GraphQL ricas em recursos - completas com paginação, filtragem, classificação etc. - no MongoDB e em dezenas de outras fontes de dados em minutos. O Hasura também oferece suporte à federação de dados, permitindo que os desenvolvedores criem uma GraphQL API unificada em diferentes bancos de dados e serviços. Neste guia, mostraremos como conectar rapidamente o Hasura ao MongoDB e gerar uma API GraphQL segura e de alto desempenho.
Orientaremos você pelas etapas para:
- Crie um projeto no Hasura Cloud.
- Crie um banco de dados no MongoDB Atlas.
- Conecte o Hasura ao MongoDB.
- Gere uma GraphQL API de alto desempenho instantaneamente.
- Experimente queries do GraphQL com relacionamentos.
- Analise a execução da query.
Também veremos como e por que a API gerada tem alto desempenho.
No final deste guia, você poderá criar sua própria API GraphQL de alto desempenho e pronta para produção com o Hasura para sua instância existente ou nova do MongoDB Atlas.
Você precisará de um projeto no Hasura Cloud e de um MongoDB database no Atlas para começar com as próximas etapas.
Acesse cloud.hasura.io para criar uma conta ou fazer login. Quando estiver no Cloud Dashboard, navegue até Projetos e crie um novo projeto clicando em
New Project
.Você pode criar um projeto gratuito selecionando a região de sua escolha. Neste exemplo, estou usando a infraestrutura AWS, região Oeste dos EUA.
Lembre-se da região escolhida, pois queremos co-localizar a API GraphQL implantada usando o Hasura Cloud na mesma região que o banco de dados no MongoDB Atlas. Isso será feito em uma das etapas subsequentes. Clique no botão
Create Free Project
conforme destacado. Como sempre, você pode atualizar o projeto posteriormente, conforme necessário.Depois que o projeto for criado, você será levado à página de detalhes do projeto, que exibe o ponto de extremidade GraphQL, entre outros detalhes. Observe o
Hasura Cloud IP
nessa página, pois ele é necessário durante a configuração do MongoDB Atlas para permitir a conexão do Hasura com o MongoDB.Clique em
Launch Console
para abrir o Console Hasura do projeto. Você chegará à página API Explorer do console, onde poderá experimentar as APIs GraphQL.Clique na aba
DATA
na parte superior para navegar até a seção Gerenciamento de Dados do console. Aqui você pode se conectar aos vários bancos de dados suportados pelo Hasura. Escolha MongoDB na lista e clique em Connect Existing Database
.Neste ponto, Hasura requer os detalhes de conexão do MongoDB.
Se você já tem uma instância MongoDB existente, fique à vontade para experimentar a demonstração com isso.
Para este tutorial, primeiro crie uma nova instância do MongoDB. Mas você pode pular esta etapa se já tiver um banco de dados.
A Hasura pode se conectar a um banco de dados MongoDB Atlas novo ou existente e gerar a API GraphQL para você. Agora, Go e crie um novo banco de dados e use alguns dados de amostra gerados automaticamente.
Vá para MongoDB Atlas, crie um projeto se você não tiver um e navegue até a página
Database
na seção Sistemas. Você deverá ver uma página como a abaixo:Clique no botão
Build a Database
. Na próxima página, você selecionará os detalhes da implementação.Para simplificar, comece com o cluster Free M0 , que é gratuito para sempre e ótimo para começar. Você sempre pode atualizar mais tarde, quando necessário.
Dê um nome para o cluster; para este exemplo, use
Hasura
. Você precisará selecionar a região. Para este tutorial, escolha Amazon Web Services como fornecedor e escolha a regiãous-west-2
para manter os dados próximos à instância do Hasura (lembre-se de que nosso cluster do Hasura também foi implantado no Oeste dos EUA).Lembre-se de escolher a região mais próxima dos seus usuários.
Dica: é recomendável manter o banco de dados e a região da API iguais para evitar problemas de desempenho e latência.
Na próxima etapa, adicione seu endereço IP para conectividade local e crie um novo usuário de banco de dados com a permissão
atlasAdmin
necessária para acessar o cluster do MongoDB a partir do Hasura Cloud.Anote a senha, pois precisaremos dela em uma etapa posterior.
Agora, clique em
Create Database User
. Clique emChoose a connection method
e pule as próximas etapas.Opcionalmente, você pode consultar as instruções para criar uma nova implantação do banco de dados MongoDB nos Docs, especialmente até a etapa 4, caso você esteja preso em qualquer uma das etapas acima.
Quando a implementação do banco de dados estiver concluída, talvez você queira carregar alguns dados de amostra para o cluster. Para isso, vá até a guia
Database
e, no Cluster recém-criado, clique no...
que se abre com uma opção para Load Sample Dataset
. Isso pode levar alguns segundos.Checkpoint: nesta etapa, criamos um projeto no Hasura Cloud e um banco de dados no MongoDB Atlas.
Para conectar o Hasura ao MongoDB, primeiro adicione o endereço IP do Hasura Cloud ao cluster MongoDB. Para fazer isso, navegue até a página Acesso à Rede (em Segurança) no dashboard do Atlas.
Clique em
ADD IP ADDRESS
e insira o Hasura Cloud IP
que você obteve do dashboard do Hasura Cloud na primeira etapa.Depois disso, o Hasura Cloud deverá ser capaz de se comunicar com a instância do MongoDB Atlas. A próxima etapa é obter a string de conexão do banco de dados.
No painel do Atlas, vá até a página
Database
e clique em Connect
ao lado do cluster Hasura criado algumas etapas atrás. Você terá as seguintes opções — escolha a opçãoDrivers
.Você receberá um pop-up com os detalhes da string de conexão. Copie a cadeia de conexão para o banco de dados, que será semelhante a este formato:
1 mongodb+srv://praveen:<password>@hasura.1oyflxi.mongodb.net/?retryWrites=true&w=majority
Observe que você precisa substituir
<password>
pela senha real do usuário do banco de dados que você criou anteriormente.Você pode acessar os Usuários do banco de dados na guia Acesso ao banco de dados, na seção Segurança do menu de navegação à esquerda. Lembre-se de que o usuário do banco de dados precisa ter permissão
atlasAdmin
para que a conexão funcione.Agora, vá para o dashboard do Hasura Cloud para a próxima etapa.
Como você está na página Connect Existing Database for MongoDB (Conectar banco de dados existente para MongoDB), digite os valores para o nome do banco de dados como
mongodb
, a string de conexão copiada da etapa anterior.Esta instância vem com um banco de dados de amostra chamado
sample_mflix
. Insira isso na configuraçãododb
.Finalmente, clique em
Connect Database
e está tudo pronto com a conexão do Hasura e do MongoDB, todos hospedados em suas respectivas instâncias do Cloud.Essa é a parte emocionante do guia. 😀
Para o banco de dados de amostra que foi carregado no MongoDB, você pode gerar uma API instantaneamente.
Acesse a página mongodb -> Gerenciar no Console do Hasura.
Confira as collections do banco de dados de exemplo mostrado nesta página. Por exemplo, você pode ver collections como
users
, theaters
, movies
, comments
, sessions
e embedded_movies
. Agora você pode Track
-los para garantir que Hasura gere a API GraphQL (e REST) para as coleções.Comece rastreando a coleção
movies
. Clique no botãoTrack
ao lado da coleçãomovies
.Nesta etapa, você precisará indicar ao Hasura qual é a estrutura do objeto JSON para que o Hasura possa introspecção e gerar um esquema GraphQL para isso.
Insira o seguinte JSON como entrada:
1 { 2 "_id": { 3 "$oid": "573a1390f29313caabcd42e8" 4 }, 5 "plot": "A group of bandits stage a brazen train hold-up, only to find a determined posse hot on their heels.", 6 "genres": [ 7 "Short", 8 "Western" 9 ], 10 "runtime": { 11 "$numberInt": "11" 12 }, 13 "cast": [ 14 "A.C. Abadie", 15 "Gilbert M. 'Broncho Billy' Anderson", 16 "George Barnes", 17 "Justus D. Barnes" 18 ], 19 "poster": "https://m.media-amazon.com/images/M/MV5BMTU3NjE5NzYtYTYyNS00MDVmLWIwYjgtMmYwYWIxZDYyNzU2XkEyXkFqcGdeQXVyNzQzNzQxNzI@._V1_SY1000_SX677_AL_.jpg", 20 "title": "The Great Train Robbery", 21 "fullplot": "Among the earliest existing films in American cinema - notable as the first film that presented a narrative story to tell - it depicts a group of cowboy outlaws who hold up a train and rob the passengers. They are then pursued by a Sheriff's posse. Several scenes have color included - all hand tinted.", 22 "languages": [ 23 "English" 24 ], 25 "released": { 26 "$date": { 27 "$numberLong": "-2085523200000" 28 } 29 }, 30 "directors": [ 31 "Edwin S. Porter" 32 ], 33 "rated": "TV-G", 34 "awards": { 35 "wins": { 36 "$numberInt": "1" 37 }, 38 "nominations": { 39 "$numberInt": "0" 40 }, 41 "text": "1 win." 42 }, 43 "lastupdated": "2015-08-13 00:27:59.177000000", 44 "year": { 45 "$numberInt": "1903" 46 }, 47 "imdb": { 48 "rating": { 49 "$numberDouble": "7.4" 50 }, 51 "votes": { 52 "$numberInt": "9847" 53 }, 54 "id": { 55 "$numberInt": "439" 56 } 57 }, 58 "countries": [ 59 "USA" 60 ], 61 "type": "movie", 62 "tomatoes": { 63 "viewer": { 64 "rating": { 65 "$numberDouble": "3.7" 66 }, 67 "numReviews": { 68 "$numberInt": "2559" 69 }, 70 "meter": { 71 "$numberInt": "75" 72 } 73 }, 74 "fresh": { 75 "$numberInt": "6" 76 }, 77 "critic": { 78 "rating": { 79 "$numberDouble": "7.6" 80 }, 81 "numReviews": { 82 "$numberInt": "6" 83 }, 84 "meter": { 85 "$numberInt": "100" 86 } 87 }, 88 "rotten": { 89 "$numberInt": "0" 90 }, 91 "lastUpdated": { 92 "$date": { 93 "$numberLong": "1439061370000" 94 } 95 } 96 }, 97 "num_mflix_comments": { 98 "$numberInt": "0" 99 } 100 }
Como alternativa, se quiser copiar esses objetos diretamente das coleções do Mongo, vá para a guia
Collections
na seçãoDatabase
.Clique no botão
Validate
para validar o JSON document. Na próxima etapa, você verá os modelos derivados deste documento. Por fim, clique no botão Track Collection
.Depois de acompanhar a collection, você deve navegar até a página do API Explorer no Console da Hasura para começar a experimentar algumas consultas do GraphQL.
Execute a seguinte query do GraphQL dentro da interface do GraphQL.
1 query { 2 movies (limit: 10, order_by: { released: desc }) { 3 _id 4 title 5 released 6 imdb { 7 rating { 8 numberDouble 9 } 10 } 11 } 12 }
Estamos tentando buscar 10 filmes, classificados por lançados, decrescente.
Você obterá uma resposta JSON à direita ao executar a consulta clicando no botão
play
.Pronto! A API GraphQL para a coleção
movies
agora está testada e pronta para consumo.Use queries diferentes como você as vê na aba
Explorer
na barra lateral esquerda.Você pode repetir isso para acompanhar mais coleções, como
comments
, users
, theaters
etc., e obter APIs geradas para todas elas.O fato de a Hasura ter gerado a API GraphQL instantaneamente para as coleções reduz muitos códigos padrão que, de outra forma, você teria escrito na forma de resolvedores GraphQL em qualquer servidor.
Agora, você pode estar interessado em saber o desempenho da API. Você já garantiu que o banco de dados e a API estejam na mesma região para evitar problemas de latência. Mas vamos mergulhar mais fundo em como a execução da query funciona nos detalhes.
Ele se resume essencialmente a esses fatores:
- Database pushdowns
- Compilação de query que usa pipelines agregados
O Hasura é um compilador que recebe uma query GraphQL, a enriquece com predicados como parte da query e envia a query com regras de projeção, relacionamentos e autorização ao banco de dados para lidar com o volume de trabalho. Isso evita o processamento de dados pelo lado do servidor e aproveita os recursos do banco de dados para ser altamente eficiente e ter alto desempenho.
Com a natureza do GraphQL permitir que o cliente consulte o que deseja, é essencial buscar apenas os campos exatos solicitados pelo cliente. O Hasura faz isso compilando a consulta com projeção. Sem o Hasura, uma query típica pode não ser otimizada e buscar dados desnecessários (mais dados do que o necessário).
Vamos analisar a query gerada pelo Hasura. Para o exemplo de consulta GraphQL que usamos acima, clique no botão
Analyze
na seção GraphQL da página API Explorer.Você verá que o plano de execução da consulta se parece com isto:
1 { 2 "aggregate": "movies", 3 "pipeline": [ 4 { 5 "$sort": { 6 "released": -1 7 } 8 }, 9 { 10 "$limit": 10 11 }, 12 { 13 "$replaceWith": { 14 "released": { 15 "$dateToString": { 16 "date": "$released" 17 } 18 }, 19 "_id": "$_id", 20 "imdb": { 21 "$cond": { 22 "if": "$imdb", 23 "then": { 24 "rating": { 25 "$cond": { 26 "if": "$imdb.rating", 27 "then": { 28 "numberDouble": "$imdb.rating.numberDouble" 29 }, 30 "else": null 31 } 32 } 33 }, 34 "else": null 35 } 36 }, 37 "title": "$title" 38 } 39 } 40 ], 41 "cursor": {} 42 }
Como a estrutura de um documento em uma coleção muda, deve ser tão simples quanto atualizar os metadados Hasura para adicionar ou remover os campos modificados. O esquema é flexível e você pode atualizar o modelo lógico para obter as atualizações da API. Não são necessárias migrações de banco de dados - basta adicionar ou remover campos dos metadados para refletir na API.
A integração do MongoDB com o mecanismo GraphQL da Hasura traz um novo nível de eficiência e escalabilidade para os desenvolvedores. Ao aproveitar a capacidade da Hasura de criar uma API GraphQL unificada a partir de diversas fontes de dados, os desenvolvedores podem expor rapidamente os dados do MongoDB por meio de uma API GraphQL segura, de alto desempenho e altamente personalizável.
Recomendamos alguns recursos para saber mais sobre a integração.
Participe do servidor Hasura Discord para interagir com a comunidade Hasura e fazer perguntas sobre o GraphQL ou a integração do Hasura com o MongoDB.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.