Uma API Gateway é uma API que fica na frente de outros serviços internos, todas as requisições HTTP são recebidas pelo gateway e ela sabe como repassar a requisição para o serviço interno correto. No nosso caso, ela faz isso baseado num arquivo de configuração. Além de somente repassar requisições, existem plugins que afetam seus comportamentos, por exemplo, antes de repassar, validar um token JWT de autenticação, ou bloquear a requisição se o tamanho dela for acima de um número de bytes permitido. Na seção Links Relacionados você tem acesso a um arquivo config.yaml e a um docker-compose.yaml que sobe os serviços internos.
Requisitos
Crie uma API que lê o config.yaml e repassa as requisições para os serviços internos definidos no arquivo.
A requisição é repassada do Gateway pro serviço interno, o que significa que todos os cabeçalhos HTTP e corpo da requisição são enviados nessa comunicação.
A resposta do serviço interno para o Gateway também é repassada de volta pro cliente, mantendo os cabeçalhos HTTP e corpo da resposta.
Ex: Uma request pro Gateway com endpoint POST /payments e corpo {amount: 100} é repassada para o serviço interno payments no mesmo endpoint, mantendo cabeçalhos e corpo, se houver um serviço/rota relacionado no arquivo yaml.
As rotas no arquivo yaml podem ter o formato /endpoint/{id} o que significa que qualquer valor alfanumérico para {id} é aceito.
Pense no seguinte cenário; você não quer desligar e subir a API a cada alteração no arquivo config.yaml, a API precisa atualizar sua configuração em memória automaticamente.
Além de repassar requests você precisa implementar um suporte a plugins.
Um plugin está associado a um serviço interno, e é executado antes de repassar a request para esse serviço. Ele pode bloquear ou alterar a própria request. Os plugins que você deve suportar são:
Plugin `add_header` adiciona cabeçalhos na requisição HTTP.
Plugin `http_log` loga cada nova requisição pro gateway.
Plugin `request_size_limiting` bloqueia requests que tenham um tamanho em bytes acima de um limite.
Plugin `jwt_auth` bloqueia requests sem um token jwt válido ou no cabeçalho ou na query string.
Para desenvolver essa API, você só pode usar somente duas bibliotecas externas: