API Gateway com NodeJS e Express - Aprenda com a explicação de um iniciante para iniciante
Você sabe o que é Microservices?
De forma simplificada, a ideia por trás do termo é dividir as tarefas do sistema em APIs menores (micro), com funções individuais para cada, deixando o modelo de "API Monolítica"
#API MONOLÍTICA: é executada em um único servidor, mas as aplicações de microserviços se beneficiam mais do ambiente de nuvem.
API GATEWAY
Para entender o termo, imagine uma rede social como Instagram, com vários microserviços, um para o feed de notícias, outro para seguidores, outro para storys, etc.
Nesse exemplo, cada api vai ter um endereço, não é mesmo? E como fica a parte do front-end nessa história?
No ponto de vista de produtividade e lógica, o front-end precisa mesmo ter noção de todos os endereços dessas APIs?
A resposta é não, é nesse escopo que o API Gateway entra, atuando como um serviço intermediador, que se posicionará na aplicação o centro da aplicação.
Exemplo real:
O API Gateway seria porteiro de um condomínio, que atende ao interfone, recebendo uma visita, por exemplo. E liga no apartamento solicitado pelo visitante, e retorna com a resposta positiva ou negativa, referente a pessoa que mora no apartamento que atendeu a ligação.
Colocando a mão na massa - Criando um API Gateway
Passo a passo:
- Crie uma pasta em branco, exemplo: cardioAPI, acesse a pasta, abrindo o terminal do seu editor de código e execute npm init -y para criar um arquivo com as configurações iniciais, em seguida execute npm install express ou o shortcut npm i express.
- Crie o arquivo index.js e escreva, ou copie o código abaixo:
`const app = require('express')();
app.get('/cardapio', (req, res) => res.send('Hello - Pagina de Cardapio'));
app.listen(3002, () => console.log(Cardapio API listening on port 3002!
));`
Esse código instancia o Express, cria uma rota com método GET em /cardapio e exibe uma mensagem na tela, o server é iniciado na porta 3002.
Repita o processo
- Crie uma nova pasta chamada clientesAPI, e execute os mesmos 2 (dois) comandos anteriores npm init -y && npm i express
- Crie semelhantemente uma nova rota com express:
`const app = require('express')();
app.get('/clientes', (req, res) => res.send('Hello - Clientes API '));
app.listen(3001, () => console.log(Clientes API listening on port 3001!
));`
Novamente, uma rota get é criada e exibe uma mensagem, dessa vez na porta 3001, nesse momento temos duas APIS instanciadas, iniciemos agora a criação do nosso API Gateway
em uma nova pasta, exemplo: API, digite o comando npm init -y, porém além de npm i express também instale npm express-http-proxy, crie um arquivo chamado URLs.js.
Copie, ou digite o seguinte código:
module.exports = { CLIENTES_API_URL: 'http://localhost:3001', CARDAPIO_API_URL: 'http://localhost:3002', };
Esse arquivo será o ponto central de URLs dos nossos microsserviços, nele exportamos duas variavéis que na verdade são constantes, (variaveis cujo valor não permite receber novos valores, ou seja, nunca mudam) e por convenção são escritas em CAPS LOCK.
At last, but not least!
Por fim, crie um arquivo index.js que atuará como ponto de entrada (entry point) do nosso API Gateway RN
Copie, ou digite o seguinte código:
`const express = require('express');
const httpProxy = require('express-http-proxy');
const app = express();
const port = 3000;
const {
CLIENTES_API_URL,
CARDAPIO_API_URL,
} = require('./URLs');
const userServiceProxy = httpProxy(CLIENTES_API_URL);
const productsServiceProxy = httpProxy(CARDAPIO_API_URL);
app.get('/', (req, res) => res.send('Hello Gateway API'));
app.get('/clientes', (req, res, next) => userServiceProxy(req, res, next));
app.get('/cardapio', (req, res, next) => productsServiceProxy(req, res, next));
app.listen(port, () => console.log(Example app listening on port ${port}!
));
`
Descrição do que foi feito,
-
Na linha 5, usamos a desestruturação paraa importar as constantes com os endereços de cada API que colocamos lá no URLs.js.
-
Nas linhas 10 e 11, criamos as constantes userServiceProxy e productsServiceProxy, chamando o httpProxy() com os endereços de cada API.
E é Agora que a mágica acontece!
-
Na linha 15, criamos uma rota GET /clientes, que recebe 3 parâmetros, req, res e next.
E a única coisa que essa rota faz, é repassar todas APIs para o userServiceProxy. -
O mesmo acontece na linha 16 na rota /cardapio, passando pra productsServiceProxy.
Vamos testar e ver se tudo funciona?
Inicie os 3 serviços, em terminais diferentes, acesse cada pasta respectivamente e execute o comando:
node index.js
O API Gateway será iniciado na porta 3000.
Agora é só testar! Digite /clientes e /cardapio, e nosso API Gateway vai cuidar de entender qual caminho precisa ser chamado para cada parâmetro passado na rota.
Como aprofundamento nos estudos, você pode pensar em etapas de validação de segurança, usando middlewares de autenticação no API Gateway, que só repassará as requisições para os microsserviços caso o usuário tenha acesso.
Espero que esse artigo tenha ajudado você. Se tiver dúvidas, deixe nos comentários. Obrigado.