API Gateway e Microsserviços com Node.js, Express e Express Gateway
Com o crescimento da arquitetura de microsserviços, surgem várias dúvidas na cabeça de quem está vindo de uma arquitetura monolítica. Dentre elas está a mais comum que é como distribuir essa quantidade toda de serviços de forma fácil, sem que todos tenham que saber o endereço de cada microsserviço a ser consultado.
É aí que entra o famoso API Gateway, que vai te ajudar a lidar com todas as requisições para os seus microsserviços, evitando por exemplo, que o desenvolvedor front-end tenha que conhecer os endereços de todos os microsserviços, facilitando muito o trabalho dele e o seu, claro. Mas não é só nisso que o gateway vai ser útil, ele vai muito além, contando com proteção dos endereços de onde cada microsserviço está, gerenciamento de tráfego, mecanismos de segurança, um único ponto de acesso, etc.
Agora que você já tem uma noção do que é API Gateway, vamos para a parte da programação.
Iniciando o Projeto com Node.js e Express
Para o desenvolvimento estou utilizando o Visual Studio Code, mas você pode utilizar um da sua preferência.
Crie um diretório com o nome express-gateway e dentro dele, outro com o nome de service-url, que será destinado ao nosso primeiro microsserviço, que terá a função de encurtar urls.
Inicie um novo projeto dentro do diretório service-url:
npm init -y
Após iniciar nosso projeto, vamos adicionar o express como dependência:
npm install express
Agora vamos adicionar outra dependência, que usaremos para encurtar URLs:
npm install kurzer-url
Pronto, já temos todas nossas dependências, agora vamos criar um arquivo app.js na raiz do diretório service-url, deixando a estrutura da seguinte forma:
Depois do nosso projeto estruturado, iremos começar a de fato escrever código. Abra o app.js e deixe ele da seguinte forma:
O que nós fizemos aqui foi criar um endpoint /short para encurtar uma url(utilizando o pacote kurzer-url que adicionamos como dependência) passada por parâmetro e iniciamos nosso microsserviço usando express na porta 3001.
Agora, vamos criar um outro diretório dentro de express-gateway com o nome de service-correios, que será destinado ao nosso segundo microsserviço, que terá a função de rastrear encomendas dos correios.
Inicie um novo projeto dentro do diretório service-correios:
npm init -y
Após iniciar nosso projeto, vamos adicionar o express como dependência:
npm install express
Agora vamos adicionar outra dependência, que usaremos para rastrear encomendas:
npm install correios.js
Pronto, já temos todas nossas dependências, agora vamos criar um arquivo app.js na raiz do diretório service-correios, deixando a estrutura da seguinte forma:
Depois do nosso projeto estruturado, abra o app.js e deixe ele da seguinte forma:
O que nós fizemos aqui foi criar um endpoint /track para buscar um pacote nos correios(utilizando o pacote correios.js) passado por parâmetro e iniciamos nosso microsserviço usando express na porta 3002.
Express Gateway
Agora que criamos nossos dois microsserviços, vamos ao gateway, que falei sobre ele lá no começo.
Instale o express gateway globalmente:
npm install -g express-gateway
Após instalado, dentro do diretório express-gateway, inicie um novo projeto usando o seguinte comando:
eg gateway create
O express-gateway vai solicitar algumas informações, responda elas da seguinte forma:
? What’s the name of your Express Gateway? gateway
? Where would you like to install your Express Gateway? gateway
? What type of Express Gateway do you want to create? Getting Started with Express Gateway
Isso irá criar um diretório chamado gateway, com a estrutura da seguinte forma:
Pronto, nós temos um gateway e dois microsserviços criados, agora temos que realizar algumas configurações antes de colocar nossa estrutura para funcionar. Primeiro, vá até o diretório gateway criado, acesse o diretório config de dentro dele e abra o gateway.config.yml, que é onde ficará as configurações referentes ao gateway dos nossos microsserviços e deixe ele da seguinte forma:
Você pode dar uma olhada na documentação do express-gateway aqui para saber mais sobre cada uma das configurações.
Após isso, vamos criar um script no service-url e service-correios para facilitar nosso trabalho. Abra o package.json de cada um deles e deixe da seguinte forma:
Observe que alterei somente os scripts de cada um deles com um start, que será usado para iniciar cada um dos microsserviços com o comando npm start
.
Nesse ponto, já temos tudo pronto para executar nossos microsserviços, abra um terminal pra cada um dos projetos que criamos, service-url, service-correios e gateway. Execute o comando npm start
em cada um dos terminais e você terá 1 gateway e 2 microsserviços rodando nas seguintes portas:
gateway — 3000
service-url — 3001
service-correios — 3002
E aí está nossa estrutura funcionando, nesse ponto você já pode consumir seus microsserviços. Abra uma nova aba no seu navegador ou utilize o Postman para fazer um teste nas seguintes URLs:
http://localhost:3000/short/?url=medium.com
http://localhost:3000/track/?code=PW241684574BR
Observe que utilizei localhost:3000 para realizar as duas consultas, mesmo com os dois microsserviços rodando em portas distintas(3001 e 3002, respectivamente), isso só foi possível por conta do nosso gateway que está na porta 3000, realizando a tarefa de direcionar cada um dos requests para o microsserviço correto.
Considerações Finais
Agora, você já tem uma noção básica de como um gateway vai atuar em uma estrutura de microsserviços.
Ficou alguma dúvida? Tem alguma crítica? Fique a vontade para deixar um comentário. Caso tenha se interessado pelo assunto, me siga aqui no Medium que pretendo publicar muito mais sobre.
Código Fonte
O código fonte do projeto se encontra no meu repositório do Medium no GitHub.