Criando um simples API Gateway com NodeJS e Express

Wesley Monaro
caquicoders
Published in
5 min readDec 10, 2018
Eu, sobre microsserviços…

De tempos pra cá tenho estudado bastante sobre arquitetura microsserviços, e isso deu uma bela bagunçada na minha cabeça. Por várias vezes me fez pensar coisas como:

"Como assim uma API que faz só isso?", "Mais de 20 APIs no mesmo projeto?", "Quem foi o desgraçado que pensou nisso?"

Explicando a grosso modo, a ideia é separar as funcionalidades do sistema em APIs menores, micro, cada uma com uma função específica, saindo do modelo de “API Monolítica”. Com isso, você aumenta a coesão de cada API, mantendo cada uma com responsabilidade única. Isso traz vários benefícios, como isolamento, facilita a manutenção, melhora a tolerância a erros, diminui o risco de um problema afetar o sistema todo, entre outros. Pretendo fazer depois um artigo explicando melhor as vantagens ;)

Tá. E o API Gateway?

Imagine um projeto de E-commerce com vários microsserviços. Um para usuários, um para produtos, um para pagamentos, etc.

Cada microsserviço tem um endereço. Certo?

Agora imagine que do lado front end da força, esse projeto tem um CMS web pra gerenciamento dos produtos e pedidos, um site/app para os clientes efetuarem compras e pagamentos e um sistema para a logística.

Cada aplicação precisa saber os endereços de cada microsserviço, para realizar as requisições. Caso você precise criar/separar microsserviços, você vai precisar incluir/modificar os endereços em todas as aplicações.

Será que o front end precisa mesmo saber tudo isso?

É aí que entra o API Gateway!

O API Gateway nada mais é que um serviço(putz, mais um?), que será o ponto central, e distribuirá as requisições para os microsserviços corretos. Ou seja, todas as aplicações que consomem dados dos microsserviços, irão chamar apenas um serviço, e ele será responsável por repassar a requisição para o microsserviço correto.

https://www.apiacademy.co/assets/2016/09/1-microservices-gateway-v3.png

Criando um API Gateway com NodeJS e Express

Certo. Agora que entendemos pra que raios serve um API Gateway, vamos desenvolver um bem simples em NodeJS com Express.

Caso goste de spoilers, o código do projeto está aqui ;)

Estrutura

Vamos criar 3 projetos NPM. Começando pela usersAPI:

Crie uma pasta usersAPI, e no terminal, dentro da pasta, execute o comando:

npm init -y

Isso irá criar um package.json zerado. Agora, para instalar o express, execute:

npm i express

Beleza. Dependências instaladas, agora crie um arquivo index.js e coloque o código:

O código acima instancia o Express, cria uma rota GET em /products, e mostra um "Hello Products API" na tela. O server é iniciado na porta 3002.

Agora vamos repetir o processo para a usersAPI. Crie uma pasta separada, e execute:

npm init -y && npm i express

Novamente, crie um arquivo index.js e coloque o código:

Esse trecho é praticamente igual ao de products, mas nesse caso o server é instanciado na porta 3001, e a resposta na tela é "Hello Users API".

Ok, temos as duas APIs prontas. Agora, vamos criar o API Gateway.

Em uma nova pasta, novamente, inicie um projeto npm com:

npm init -y

Agora, além do express, iremos instalar uma outra dependência, o express-http-proxy

Esse cara vai trabalhar como um proxy, permitindo fazermos um dispatch da requisição recebida para outros microsserviços. Já vamos entender melhor isso.

Execute no terminal:

npm i express express-http-proxy

Agora, vamos criar um arquivo chamado URLs.js. Esse cara será o nosso ponto central de URLs dos nossos microsserviços. Sempre que tivermos uma URL nova, ou alterada, temos que vir nesse arquivo, que servirá de ponto central:

Repare que, estou exportando duas constantes, uma chamada USERS_API_URL, e a outra PRODUCTS_API_URL. Cada uma contém o endereço e porta do serviço correspondente. Em um ambiente de produção, podemos usar variáveis de ambiente pra isso ;)

Agora, pra finalizar, crie um arquivo index.js que será o entry point do nosso API Gateway:

Repare que na linha 5, usamos a desestruturação pra 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.

Agora vem a mágica!

Na linha 15, criamos uma rota GET /users, que recebe 3 parâmetros, req, res e next. E a única coisa que essa rota faz, é repassar todos esses caras pro userServiceProxy. O mesmo acontece na linha 16 na rota /products, passando pra productsServiceProxy.

O API Gateway será iniciado na porta 3000.

Vamos testar essa bagaça?

Inicie os 3 serviços, em terminais diferentes, rodando em cada pasta o comando:

node index.js

Acessando as URLs http://localhost:3000/users e http://localhost:3000/products, teremos:

Retorno da API de Users
Retorno da API de Products

O Gateway está recebendo as requisições, e está repassando para cada microsserviço correspondente.

Caso queira, você pode incluir também os 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. Sempre que possível tentarei ajudar ;)

--

--

Wesley Monaro
caquicoders

Senior System Analyst @rchlo, Developer and Partner @ONNZE.com, and Community Manager @caquicoders