API Gateway
Tags: todayilearned, api, webdev
Published: 2022-06-17 16:13:57

## O que é API

APIs são um conjunto de operações bem definidas com o objetivo de fornecer aos seus consumidores um serviço, produto ou integração

Na pratica o consumidor de uma API utiliza o serviço sem precisar entender os detalhes da implementação.

![Uma imagem com 4 personagens, um cozinheiro com a legenda "Backend", um casal jantando com a legenda "Frontend" e um garçom com a legenda "APIs" ](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cjs61mnx11oigtsolgrr.png)

Essa imagem ilustra bem o objetivo da API, seguindo essa analogia de restaurante um casal que pediu uma refeição geralmente não liga muito quem é a pessoa que está preparando essa refeição, eles ligam que o prato chegue até a mesa.

Da mesma forma quando vamos consumir uma API no Frontend, não importa se ela foi construída em Node, Java, Go ou qualquer outra linguagem, o que importa é o front receber o que ele espera

Existem algumas APIs famosas por serem muito bem desenhadas fazendo com que empresas ou desenvolvedores solo possam integrar facilmente com essas APIs, por exemplo a [API do twitter](https://developer.twitter.com/en/docs/twitter-api) que é super bem documentada.

## API Gateway

Os API gateways surgiram para resolver um problema gerado pela arquitetura de microsserviços, vamos imaginar que temos uma api publica e um cliente quer fazer uma integração com ela, porem nosso Backend é distribuído, já pensou falar pro cliente qual a api que ele precisa chamar para cada microsserviço que ele queira trabalhar? Isso seria inviável.

Eles são ferramentas de gerenciamento, geralmente adicionadas entre um cliente e um grupo de sistemas, atuando como um ponto unico de entrada para as APIS

![Imagem mostrando dois fronts diferentes se comunicando com uma api por um único ponto de entrada](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y8ubhkml6ni1pvnpun8u.png)
 
Nessa imagem podemos ver dois clients Front consumindo a API porem eles falam com a API Gateway e a Gateway redireciona a requisição para o microsserviço que eles querem de fato se comunicar, inclusive fazendo a tradução de protocolo pois tem duas apis REST e uma AMQP, isso fica abstraído para o front

O Gateway vai ser sim um single point of failure (ponto único de falha), portanto temos que garantir a escalabilidade e resiliência dele.

### Responsabilidades do Gateway
- Rate limiting
- Autenticação (Isso não isenta o serviço de ter uma autenticação própria com permissionamento e tudo mais)
- Controle de logs
- Gerenciamento de APIs (routing)
- Métricas padronizadas (ops team)
- Tracing Distribuido

## Tipos de API Gateway

### Enterprise Gateway

O foco dele é permitir gerenciar exposição e gerenciamento de apis voltadas ao negocio. Em geral ele permite controlar o ciclo de vida da API também.

Como o Enterprise Gateway normalmente tem muitas funcionalidades extras temos que tomar cuidado para não deixar ele fortemente acoplado com a nossa aplicação dificultando assim uma migração no futuro.

Seu proposito principal é a exposição, composição e  gerenciamento de APIs externas ou internas, a manutenção em geral é feita pelo portal do API gateway e ela suporta múltiplos ambientes.

### Micro/Microservices Gateway

Geralmente esse tipo de gateway tem a capacidade de "rotear" o trafego de entrada para APIs ou serviços. Em geral ele não tem suporte para o ciclo de vida da API e a equipe tem que cuidar disso em um processo separado. Geralmente é open source.

Em geral não possuem dependências externas, e são componentes standalone, facilitando assim o kubernets gerenciar o estado necessário para execução da aplicação

Seu proposito principal é a exposição, observabilidade e monitoramento de serviços, a manutenção é feita pelo time de API que via configuração declarativa fazem atualizações, isso faz parte do deployment do serviço ela controla um único ambiente, mas possui suporte a um roteamento mais dinâmico como por exemplo o Canary para facilitar o debug.

Algumas boas praticas são, usar a flexibilidade do deployment para "particionar" as APIs. E tentar ser Stateless o máximo possível aumentando assim muito a facilidade da escalabilidade e disponibilidade

## Vantagens e desvantagens

### Vantagens

- Padronização de alguma features como logging e segurança
- Ajuda na governança de rede da companhia
- Ponto único de entrada na rede facilitando o gerenciamento

### Desvantagens

- Adiciona complexidade na arquitetura
- Precisa de um cuidado extra, devido a disponibilidade
- Ferramenta que precisa de manutenção/atualização