Este é um projeto de exemplo que demonstra a implementação de um sistema de mensageria usando RabbitMQ com Go (Golang). O projeto consiste em um serviço sender (produtor) e dois consumers (consumidores) que utilizam routing keys diferentes.
- Go - Linguagem de programação
- RabbitMQ - Message Broker
- Docker - Containerização
- Fiber - Framework Web
- Swagger - Documentação da API
- Scalar - Interface moderna para documentação da API
- Air - Live Reload para desenvolvimento
- Husky - Git Hooks
- Go 1.16+
- Docker e Docker Compose
- Make (opcional, mas recomendado)
- Clone o repositório:
git clone https://github.com/vkunssec/rabbit-mq-simple.git
cd rabbit-mq-simple
- Configure as variáveis de ambiente:
make env
- Instale as dependências:
go mod download
docker-compose up -d
Para executar todos os serviços:
make run
Para executar serviços individualmente:
# Executar o sender
make sender
# Executar o consumer 1
make consumer-1
# Executar o consumer 2
make consumer-2
# Executar ambos os consumers
make consumers
.
├── cmd/
│ ├── consumer-1/ # Serviço consumidor 1
│ ├── consumer-2/ # Serviço consumidor 2
│ └── sender/ # Serviço produtor
├── pkg/
│ ├── domain/ # Domínio da aplicação
│ │ └── rabbitmq/ # Implementação base do RabbitMQ
│ └── repository/ # Camada de repositório
├── internal/ # Código interno da aplicação
├── docker-compose.yml
└── Makefile
O domínio implementa a estrutura base do RabbitMQ com as seguintes funcionalidades:
- Gerenciamento de conexões e canais
- Verificação de estado da conexão
- Reconexão automática
- Declaração de exchanges e filas
- Publicação e consumo de mensagens
- Cleanup adequado de recursos
O repositório implementa a lógica de negócio específica:
- Configuração de exchanges e filas
- Roteamento de mensagens usando routing keys
- Gerenciamento de múltiplos consumers
- Logging de mensagens
O sistema utiliza as seguintes routing keys:
route.service1
: Para mensagens destinadas ao Consumer 1route.service2
: Para mensagens destinadas ao Consumer 2
O RabbitMQ está configurado com as seguintes definições:
- Exchange:
ExchangeService1
(tipo: direct) - Filas:
QueueService1
: Vinculada à routing keyroute.service1
QueueService2
: Vinculada à routing keyroute.service2
- URL:
amqp://guest:guest@rabbitmq:5672/%2f
- Interface de gerenciamento:
http://localhost:15672
- Usuário:
guest
- Senha:
guest
- Usuário:
make run
: Compila e executa todos os serviçosmake build
: Compila os serviçosmake swagger
: Gera a documentação Swaggermake dev
: Inicia o ambiente de desenvolvimento com hot-reloadmake sender
: Executa apenas o serviço sendermake consumer-1
: Executa o consumer 1make consumer-2
: Executa o consumer 2make consumers
: Executa ambos os consumersmake env
: Cria o arquivo de variáveis de ambiente
O projeto utiliza Husky para gerenciar git hooks, implementando verificações automatizadas antes e após os commits.
Antes de cada commit, são executadas as seguintes verificações:
go mod tidy
: Organiza as dependências do projetogo fmt ./...
: Formata o código Gogo vet ./...
: Analisa problemas no códigogolangci-lint run ./...
: Executa o linterswag init
: Atualiza a documentação Swagger
O hook inclui feedback visual colorido e tratamento de erros para cada etapa.
Após cada commit, o hook gerencia automaticamente a documentação:
- Verifica alterações na pasta
docs/
- Separa commits de documentação do código principal
- Cria um commit adicional "docs: update docs" quando necessário
- Previne execução recursiva
- Fornece feedback visual do processo
- Implementa rollback automático em caso de falhas
Ambos os hooks incluem:
- Feedback visual com códigos de cores
- Tratamento robusto de erros
- Mensagens informativas sobre cada etapa
- Validações de segurança
O projeto inclui quatro containers principais:
-
sender: Serviço produtor de mensagens
- Porta: 3000
- Dockerfile:
Dockerfile.sender
-
consumer-1: Primeiro serviço consumidor
- Dockerfile:
Dockerfile.consumer-1
- Dockerfile:
-
consumer-2: Segundo serviço consumidor
- Dockerfile:
Dockerfile.consumer-2
- Dockerfile:
-
rabbitmq: Servidor RabbitMQ
- Portas: 5672 (AMQP), 15672 (Management UI)
- Imagem: rabbitmq:3.11-management
A documentação da API está disponível em dois formatos:
- URL:
http://127.0.0.1:3000/swagger
- Fornece uma interface moderna e interativa para testar os endpoints
- Documentação completa dos schemas e responses
- Modo escuro habilitado por padrão
Envia mensagens para o RabbitMQ
Payload:
{
"message": "string",
"routing_key": "string"
}
Responses:
- 200: Mensagem enviada com sucesso
- 400: Erro de validação do payload
- 500: Erro interno do servidor