Depois de fazer um pequeno teste usando o API gateway da AWS junto com funções lambda (serverless), se optou pelo desenvolvimento do exercício usando docker-compose e o nginx como API gateway.
Embora sua função principal seja a de um servidor http, load balancer e proxy reverso, o nginx é open source e extremamente configurável, podendo facilmente ser usado também como gateway para APIs. Ele permite a distribuição de carga entre mais de um servidor, autenticação e autorização, limitação de fluxo e etc. Para casos simples como o deste exercicio, serve perfeitamente.
O desenvolvimento do exercício em docker também foi uma oportunidade para se estudar mais a fundo alguns dos conceitos por trás das apis e microserviços, já que o docker-compose permite recriar de forma fácil a relação entre vários serviços conectados através de uma rede privada.
A solução envolve múltiplos containers, um para cada serviço. são duas aplicações flask em python, um banco de dados mongoDB e o NGINX, que funciona de API gateway e é o único acessível fora da orquestração do docker -- através da porta 443 (https).
O nginx direciona as requisições para cada container de acordo com a rota da API que foi chamada. Os “microserviços” por sua vez se conectam ao banco de dados através da rede interna do compose. Desse modo os containers e o banco de dados não ficam acessíveis "externamente".
A escolha do mongoDB como banco de dados se deu pela facilidade de configuração e pelo cliente/biblioteca acessível para se usar com python.
A API usa https e também possui um sistema bem simples de autorização e autenticação através do uso de "API keys". Para se usar basta inserir um novo campo ‘apikey’ nos headers da requisição com o valor 'umachavesimples'.
"apikey":umachavesimples
Existem três rotas possíveis:
traz uma lista de todos os produtos cadastrados no sistema
exemplo de resposta:
[
{
"_id": "662555e440c80009f12c7908",
"nome": "coca-cola",
"preco": 10.5
},
{
"_id": "6625bb234536c9a9dac1baa0",
"nome": "fanta laranja",
"preco": 8.5
},
{
"_id": "6625bb354536c9a9dac1baa1",
"nome": "Doritos",
"preco": 9
}
]
busca por um produto especifico usando seu id
exemplo de resposta:
{
"_id": "662555e440c80009f12c7908",
"nome": "coca-cola",
"preco": 10.5
}
payload:
{
"nome":"Doritos",
"preco":9
}
adiciona um produto ao banco de dados
Para usar basta ter o docker instalado e rodar o comando docker-compose up
e acessar a API através do https://localhost/
. Também não se esquecer de usar a API key.