Microsserviços utilizando Micronaut, Java, gRPC e RabbitMQ

Este projeto foi testado somente em ambiente Linux Ubuntu.

Este repositório possui um exemplo prático de comunicação entre microsserviços utilizando Micronaut, Java, gRPC e RabbitMQ.

Fluxo resumido

Schema

RabbitMQ e Protocol Buffers

Este exemplo utiliza o Protocol Buffers para serializar os dados enviados para as filas RabbitMQ. Os formatos de mensagem foram definidos nos arquivos .proto e a serialização padrão do Micronaut (Jackson) foi sobrescrita para atender ao propósito deste exemplo. Os arquivos com a nova implementação estão no diretório /config dos serviços que comunicam com a fila. Você pode consultar este artigo: Micronaut: Utilizando Protobuf para serialização e desserialização dos dados enviados ao RabbitMQ para obter mais detalhes.

Como executar

  • Importe a pasta do projeto na sua IDE de preferência, no exemplo uso o Intellij Community:

Import project

  • Feita a importação, execute para cada um dos serviços a task generateProto:

Execute generate proto

  • No diretório raiz, execute o docker-compose.yml para subir as instâncias do RabbitMQ e Postgres;

  • Com todos os contêineres em execução, agora precisamos configurar as exchanges e filas do RabbitMQ, para isso execute os comandos abaixo dentro do diretório raiz dos projetos (mesmo nível onde está o docker-compose.yml):

    • sudo chmod +x configure-rabbitmq.sh
    • ./configure-rabbitmq.sh
  • Agora, execute a classe principal de cada um dos serviços e deixe-as executando;

  • Para testar a comunicação utilize um client gRPC como o Insomnia, importe o arquivo order-service.proto que está no diretório shopping-cart-service/src/main/proto, configure a porta gRPC como 0.0.0.0:50051 e selecione o método order:

Import proto client gRPC

  • O corpo da requisição deverá conter este formato:
{
"customer": {
    "id": 2
    },
"product": {
   "productId": 4,
   "quantity": 4
   }
}

Credenciais de acesso ao RabbitMQ:

Os serviços com banco de dados possuem um script SQL básico que adiciona alguns dados para teste. No caso da requisição acima, o shopping-cart-service se comunicará com o customer-service e o product-service para obter respectivamente os dados de clientes e produtos. Em seguida, ele postará uma solicitação de pagamento na fila RabbitMQ do payment-service, que após processá-lo enviará a resposta para as filas individuais do send-email-service e shopping-cart-service. Você pode acompanhar tudo pelos logs impressos nos terminais de execução dos serviços.