Além do KrakenD ser uma solução de API Gateway extremamente performática, ela ainda também apresenta versatilidade e facilidade para uso.
O exemplo que vamos apresentar agora é muito útil em cenários que você tem que realizar o deploy das configurações do gateway em diferentes ambientes, isto pode ser na execução de pipelines CI/CD, que facilita muito o suporte para essa dinamismo em ambientes como Docker e até Kubernetes.
Sem mais delongas, vamos ao exemplo proposto, veja a estrutura de nosso exemplo:
├── Dockerfile
├── krakend.json
Vamos docker para mostrar a simplicidade do uso de variáveis de ambiente no arquivo de configuração do KrakenD (krakend.json).
O KrakenD Config
O arquivo de configuração do KrakenD é usualmente em formato JSON (mas suporta outros formatos também, como YAML/YML). Neste arquivo é exatamente onde definimos os endpoints, as configurações, os hosts, timeouts etc.
Como exemplo do krakend.json , vamos pegar um exemplo simples:
{
"$schema": "https://www.krakend.io/schema/v3.json",
"version": 3,
"extra_config": {
"telemetry/logging": {
"level": "DEBUG",
"prefix": "[KRAKEND]",
"syslog": false,
"stdout": true,
"format": "default"
}
},
"timeout": "3000ms",
"cache_ttl": "300s",
"output_encoding": "no-op",
"name": "APIS-Sample",
"endpoints": [
{
"endpoint": "/v1/cep/{CEP}",
"timeout": "10s",
"method": "GET",
"output_encoding": "no-op",
"extra_config": {},
"backend": [
{
"url_pattern": "/ws/{CEP}/json/",
"encoding": "no-op",
"method": "GET",
"extra_config": {},
"host": [
"{{ env "ENDPOINT" }}"
],
"disable_host_sanitize": false
}
]
}
]
}
Dica: Quem quiser ler um JSON de forma mais simples, recomendamos essa ferramenta online: http://json2table.com
Lendo este arquivo de configuração de forma mais visual como está abaixo, podemos entender de forma simples ao que este arquivo se destina:
Neste exemplo, podemos entender o seguinte:
Temos uma API declarada, com o endereço /v1/cep/{CEP} que é uma chamada do tipo GET, que chama um Endpoint no host como exemplo em questão: http://meuhost.com.br , neste caso, este valor de HOST, pode ser diferente de acordo com o ambiente, por exemplo:
LOCAL: http://localhost:8080
Homologação: https://qa.meuserver.com.br
Produção : https://meuserver.com.br
Dessa forma, ao invés de ter 1 arquivo de configuração para cada ambiente, podemos ter 1 único arquivo que pode inserir valores dinâmicos, de acordo com as variáveis de ambiente, por isto, nós temos essa referência a uma variável de ambiente ENDPOINT, que está declarada no arquivo de configuração, veja o exemplo:
"host": [
"{{ env "ENDPOINT" }}"
],
Com base nesse exemplo acima, poderemos apontar o endereço de forma contextual e usando o Docker para isto.
Nós criamos um arquivo Dockerfile para empacotar nossas APIs:
FROM devopsfaith/krakend
COPY config/krakend.json /etc/krakend/krakend.json
ENTRYPOINT [ "/usr/bin/krakend" ]
CMD [ "run", "-c", "/etc/krakend/krakend.json"]
Você precisará fazer o build dessa imagem Docker antes de executá-la, pode usar o comando abaixo:
docker build -t <sua organizacao ou em branco>/krakend-env-vars .
E no momento que for executar seu container, levando em consideração que nossa imagem tem o nome de: skalenatech/krakend-env-vars :
docker run -e "ENDPOINT=https://viacep.com.br/" -e "FC_ENABLE=1" -p 8080:8080 skalenatech/krakend-env-vars
Veja que nós passamos 2 variáveis de ambiente para execução do Docker:
FC_ENABLE=1 - Isto irá informar o KrakenD runtime que ele deverá ler informações externas, entre estas: variáveis de ambiente.
ENDPOINT - O endereço do seu endpoint que será injetado no seu arquivo de configuração.
A execução deste exemplo resulta nos seguintes screenshots :
Execução KrakenD via docker, veja agora a execução:
Conclusão
O arquivo krakend.json é o coração da execução do runtime para as APIs, e existem várias boas práticas para torná-los mais dinâmicos, aqui vimos uma das estratégias, mas existem outras.
Comments