Nota: Este post se refere a versão 1.4 do KrakenD
Neste post, iremos mostrar o KrakenD API Gateway (de acordo com benchmarks públicos o mais performático do mercado) integrado ao RabbitMQ, um popular middleware de processamento de mensagens.
Nosso exemplo irá seguir o seguinte exemplo:
No caso acima, o KrakenD fornecerá um back-end pronto para uso para publicar uma mensagem na troca especificada no RabbitMQ.
Componentes que usaremos
Docker - para executar facilmente o RabbitMQ
Binário KrakenD (mas você também pode usar a distribuição do Docker)
Primeiros Passos
Executando o servidor RabbitMQ e o console de gerenciamentoPor favor, execute o seguinte comando docker:
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
O resultado será o seguinte no seu console:
Você poderá ver a ferramenta web de gestão do RabbitMQ como no exemplo abaixo: (Observe que a porta de saída para o Management Console é 15672.
Criando a configuração do KrakenD
Este post é baseado na seguinte página de documentação: https://www.krakend.io/docs/backends/pubsub/, nesse caso usaremos KrakenD para definir automaticamente um Backend para publicar um Payload (conteúdo) como uma mensagem, e podemos conseguir consequentemente, lê-lo de volta (o consumindo [ Consumer] ).
Se o backend que interage com sua camada de mensagens exige muita complexidade, regras de negócios, etc, recomendamos que crie um backend específico para tratá-lo sem limitações e capaz de fazer o que você precisar, em qualquer nível de customizações.
Veja aqui o código fonte do arquivo krakend.json :
{
"version":2,
"port":8080,
"endpoints":[
{
"endpoint":"/produce/{key}",
"method":"POST",
"backend":[
{
"extra_config":{
"github.com/devopsfaith/krakend-amqp/produce":{
"exchange":"testdiuscoa",
"durable":true,
"delete":false,
"exclusive":false,
"no_wait":true,
"mandatory":true,
"immediate":false,
"name":"radiuscoa",
"routing_key":"Key"
}
},
"host":[
"amqp://guest:guest@localhost:5672"
],
"disable_host_sanitize":true
}
]
},
{
"endpoint":"/consume",
"backend":[
{
"extra_config":{
"github.com/devopsfaith/krakend-amqp/consume":{
"name":"queue-1",
"exchange":"testdiuscoa",
"durable":true,
"delete":false,
"exclusive":false,
"no_wait":true,
"no_local":false,
"routing_key":[
"#"
],
"prefetch_count":10
}
},
"host":[
"amqp://guest:guest@localhost:5672"
],
"disable_host_sanitize":true
}
]
}
]
}
Ao executar o KrakenD com o seguinte comando :
krakend run -c krakend.json
Você precisa ter o binário do krakend instalado para executar este exemplo
O console irá exibir a seguinte saída no console:
Agora podemos testar os endpoints expostos pelo KrakenD que podem publicar as mensagens:
curl -i --location --request POST 'http://localhost:8080/produce/foo' --data-raw '{"foo":"bar"}'
HTTP/1.1 200 OK
**Content-Type**: application/json; charset=utf-8
**X-Krakend**: Version 1.1.1
**X-Krakend-Completed**: false
**Date**: Wed, 18 Nov 2020 06:12:28 GMT
**Content-Length**: 5
null
Veja que a publicamos via HTTP POST um payload com o conteúdo em formato JSON, com uma propriedade chamada foo e o seu conteúdo bar. O API Gateway retornou um HTTP 200 OK, ou seja, uma resposta com sucesso, não existe mensagem de retorno por padrão, vamos nos basear no código de retorno HTTP.
Este Payload publicado, está agora na fila do RabbitMQ chamada de queue-1, e agora espera que algum consumidor poderá ler esta mensagem e processá-la. O KrakenD também tem a capacidade de consumir estas mensagens da fila, e consequentemente chamar outros microsserviços/endpoints etc.
curl -i --location --request GET 'http://localhost:8080/consume'
HTTP/1.1 200 OK
**Content-Type**: application/json; charset=utf-8
**X-Krakend**: Version 1.1.1
**X-Krakend-Completed**: true
**Date**: Wed, 18 Nov 2020 06:15:53 GMT
**Content-Length**: 14
{"foo":"bar"}
Dessa vez, ao invés de um POST , estamos chamando um HTTP GET, este por sua vez, irá ver se existe alguma mensagem na fila do RabbitMQ e nos retornar os dados, tanto que você pode ver o conteúdo do Payload, que é o mesmo enviado anteriormente.
Se você receber algum erro ou não funcionar conforme demonstrado, adicione a seguinte variável de ambiente:
export RABBIT_SERVER_URL='guest:guest@localhost:5672'
Conclusão
Este é um post que é a tradução de um material nosso em Inglês de 2020 (https://skalena.github.io/api-methodology/public/cont/krakend-with-rabbitmq/) , que resolvemos deixá-lo em Português também, para servir de referência para a comunidade e empresas que usam o KrakenD.
Atualizações no KrakenD 2.0
No KrakenD 2.0, existem algumas atualizações para tratar processamento de mensagens, para conferir veja este post: https://www.skalena.com/post/krakend-2-0-community
Async API
Vale a menção deste conceito novo, que permite o processamento orientado a eventos (assíncrono) para canais e consumidores que processam informações usando as APIs como ponto de entrada, confira mais aqui: https://www.asyncapi.com
Comments