• R&D - Pesquisa e Desenvolvimento

KrakenD com RabbitMQ

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







37 visualizações0 comentário