Kong API Gateway
Tags: api
Published: 2022-06-18 14:11:13

Alguns pontos sobre o kong 

- Api Gateway Open Source e gratuito
- Caracteristicas Micro Gateway
ou seja, ele não prove configurações para controles de ciclo de vida
- Deployment flexível
- Pronto para kubernets
- Extensível via [plugins](https://docs.konghq.com/hub/)

## Modelos de deployment

O kong tem 3 modelos de deployment

### DB-Less

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b5z17xdttzg3axd3zsvj.png)
 
Fazemos a configuração dele por um arquivo Yaml ou JSON e subimos ele com base no arquivo, quando ele subir essa configuração ver carregada na memoria de cada nó do Kong.

### Com danco de dados

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/84facp5odwm7cc87m4sr.png)

As configurações ficam todas em um banco de dados compartilhado por todos os nós. Um dos nós vai agir como control-plane e passar as configurações para o postgres que passa para os outros nós
 
### Hibrido

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m9jmgieba30ejoo6l6ym.png)

O modelo de deployment hibrido é o modelo recomendado pela equipe do Kong, a ideia é ter um control-plane que somente ele vai acessar o banco de dados, diferente do deploy com banco onde todas as instancias tem acesso ao banco. Nesse modelo hibrido os outros nós vão sempre receber as configurações do control-plane 

## Konga

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dz92lw9l3pf403apnvjn.png)

- Interface administrativa para o Kong
- Visualização de métricas das instâncias
- Controle de usuarios
- Gerencia mais de um Kong

## Servicos

Um serviço é uma entidade que representa uma API ou microsserviço upstream. Por exemplo um microsserviço de pagamentos ou de cadastro etc..

### Criando um novo serviço

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ub2rn44sxlviw52vp2a.png)
 
Primeiro temos que ir até a pagina de services e clickar no botão de adicionar um novo service 

e então cadastrar ele:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w06u12ytq0ha9pci8lt4.png)
 
### Rotas

As rotas são os caminhos de url que permite que um serviço cadastrado no nosso API Gateway seja acessado através do gateway

Para cadastrar uma rota temos que ir dentro do serviço cadastrado e ir na opção "Routes" quando criamos uma rota podemos definir algumas configurações uma delas sendo o Host, 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tsmh9av1c8rry9924f9b.png)

Quando definimos o Host somente requests que tem o host esperado vão conseguir acessar aquela rota

com o Host: 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/skrbr4j0vg4250v9nxqh.png)

sem o Host:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o71mfzh3boeddrqbukuq.png)
 

## Plugins

Plugins são um pedaço de código que pode ser executado dentro de um ciclo de vida de uma requisição HTTP, tanto no request como no response, em outras Gateways isso pode ser encontrado como policy mas no Kong se chama plugin

Os plugins podem ser configurados nas Rotas, Serviços, Consumers e Globalmente, tem uma precedência para as configurações

essa é a ordem de precedência, quanto menor, mais prioridade

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kahiz6ssyc0l33osiswf.png)

Podemos escrever nossos proprios plugins em Lua, Javascript e Golang. Porêm o suporte é muito maior para Lua.

## Consumers
É quem pode consumir sua API, para testar essa parte, criei dois consumidores, um que é um usuário e uma app 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5dshwopvzv3sjsg7sw8b.png)

no usuário fui até a parte de credentials e criei uma senha para esse usuário, enquanto na app fui nessa parte também porem criei uma API key

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uzsvta8gom75eiivpk7m.png)
 
Depois disso foi só utilizar o plugin basic auth que a minha api já está me retornando como unauthorized

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ctnautkjno4jg0hk26w.png)
 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b2axomjmojh3rdg80649.png)

Apesar de não ser uma solução de fato muito segura, é muito interessante a facilidade para aplicar isso 

## Observabilidade

O kong tem plugins de suporte ao prometheus além de um [dashboard oficial no grafana](https://grafana.com/grafana/dashboards/7424) basta subirmos o prometheus e o grafana no docker-compose e instalar o plugin do prometheus no kong que temos um dashboard totalmente funcional

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ovp9a081kijqyjpavm3s.png)
 
Além disso tem todo um suporte para diversos sistemas de logs sendo facilmente possivel integrar um Datadog por exemplo