Microserviço consumer que processa eventos de criação de usuários do RabbitMQ usando Laravel 11 com arquitetura Clean Code + DDD.
O projeto segue os princípios de Clean Architecture e Domain-Driven Design (DDD):
src/
├── Domain/ # Camada de Domínio
│ └── User/
│ ├── Entity/ # Entidades
│ │ └── User.php
│ ├── ValueObject/ # Objetos de Valor
│ │ ├── UserId.php
│ │ ├── UserName.php
│ │ ├── Email.php
│ │ └── Password.php
│ └── Repository/ # Interfaces de Repositório
│ └── UserRepositoryInterface.php
│
├── Application/ # Camada de Aplicação (Casos de Uso)
│ └── UseCase/
│ └── CreateUser/
│ ├── CreateUserUseCase.php
│ ├── CreateUserInput.php
│ └── CreateUserOutput.php
│
├── Infrastructure/ # Camada de Infraestrutura
│ ├── Persistence/
│ │ └── Eloquent/
│ │ ├── Models/
│ │ │ └── UserModel.php
│ │ └── Repository/
│ │ └── EloquentUserRepository.php
│ └── Messaging/
│ └── RabbitMQ/
│ ├── RabbitMQConsumer.php
│ └── RabbitMQPublisher.php
│
└── app/ # Camada de Apresentação (Laravel)
└── Console/
└── Commands/
└── ConsumeUserCreatedCommand.php
- PHP 8.4
- Laravel 11
- MySQL 8.0
- RabbitMQ (compartilhado com ms-producer)
- Docker & Docker Compose
- Docker e Docker Compose instalados
- RabbitMQ rodando em
localhost:5672(porta 15672 para management)- Usuário:
rabbit - Senha:
rabbit
- Usuário:
- Clone o repositório e entre na pasta:
git clone https://github.com/matheuspdias/ms-users.git
cd ms-users- Suba os containers:
docker-compose up -d- Copie o arquivo de ambiente:
cp src/.env.example src/.env- Instale as dependências do Composer:
docker exec ms-users-app composer install- Gere a chave da aplicação:
docker exec ms-users-app php artisan key:generate- Execute as migrations:
docker exec ms-users-app php artisan migrateNota: A fila user_events será criada automaticamente quando o consumer rodar pela primeira vez.
As configurações do RabbitMQ estão no arquivo .env:
RABBITMQ_HOST=host.docker.internal
RABBITMQ_PORT=5672
RABBITMQ_USER=rabbit
RABBITMQ_PASSWORD=rabbit
RABBITMQ_QUEUE=user_events
RABBITMQ_NOTIFICATION_QUEUE=notification_eventsImportante: O RABBITMQ_HOST=host.docker.internal permite que o container acesse o RabbitMQ rodando no host.
O microserviço expõe uma API REST para consultar usuários criados pelo consumer.
Base URL: http://localhost:8081/api/v1
GET /usersExemplo de request:
curl http://localhost:8081/api/v1/usersResposta de sucesso (200):
{
"success": true,
"data": [
{
"id": "9bcdcc8d-4bbb-42f0-8217-3c5b133ee6c9",
"name": "Matheus",
"email": "matheus@example.com",
"created_at": "2026-01-02 16:27:16",
"updated_at": "2026-01-02 16:27:16"
}
],
"total": 1
}GET /users/{id}Exemplo de request:
curl http://localhost:8081/api/v1/users/9bcdcc8d-4bbb-42f0-8217-3c5b133ee6c9Resposta de sucesso (200):
{
"success": true,
"data": {
"id": "9bcdcc8d-4bbb-42f0-8217-3c5b133ee6c9",
"name": "Matheus",
"email": "matheus@example.com",
"created_at": "2026-01-02 16:27:16",
"updated_at": "2026-01-02 16:27:16"
}
}Resposta de erro - Usuário não encontrado (404):
{
"success": false,
"message": "User not found"
}Resposta de erro - ID inválido (400):
{
"success": false,
"message": "Invalid UUID format"
}O consumer do RabbitMQ inicia automaticamente quando o container sobe, graças ao Supervisor. Não é necessário executar comandos manuais!
O Supervisor garante que:
- O consumer inicia assim que o container é criado
- Reinicia automaticamente em caso de falha
- Continua rodando em background
Para verificar se está funcionando, veja os logs:
docker logs -f ms-users-appOu veja o log específico do consumer:
docker exec ms-users-app tail -f storage/logs/consumer.logSe precisar gerenciar manualmente o consumer via Supervisor:
# Ver status
docker exec ms-users-app supervisorctl status
# Parar o consumer
docker exec ms-users-app supervisorctl stop laravel-consumer:*
# Iniciar o consumer
docker exec ms-users-app supervisorctl start laravel-consumer:*
# Reiniciar o consumer
docker exec ms-users-app supervisorctl restart laravel-consumer:*O producer deve enviar eventos no seguinte formato:
{
"event_id": "user_unique_id",
"event_type": "user.created",
"timestamp": "2025-01-28T10:00:00+00:00",
"payload": {
"name": "João Silva",
"email": "joao@example.com",
"password": "senha123"
},
"metadata": {
"source": "ms-producer",
"version": "1.0",
"environment": "local"
}
}- Entities: Objetos com identidade única (User.php)
- Value Objects: Objetos imutáveis sem identidade (Email, Password, UserName, UserId)
- Repository Interfaces: Contratos para persistência de dados
- Use Cases: Lógica de negócio (CreateUserUseCase.php)
- DTOs: Input e Output para comunicação com casos de uso
- Persistence: Implementação dos repositórios usando Eloquent
- Messaging: Implementação do consumer RabbitMQ
- Commands: Comandos Artisan para executar os consumers
docker exec -it ms-users-app bashdocker logs -f ms-users-appdocker exec -it ms-users-app php artisan migratedocker exec -it ms-users-app php artisan cache:clear
docker exec -it ms-users-app php artisan config:clear# Logs do Supervisor
docker exec -it ms-users-app supervisorctl tail -f laravel-consumer
# Logs do Laravel
docker exec -it ms-users-app tail -f storage/logs/consumer.logdocker-compose down- Producer envia evento
user.createdpara fila RabbitMQ - Consumer recebe mensagem da fila
- Comando Laravel valida o tipo de evento
- CreateUserUseCase é executado
- Validações de domínio são aplicadas (email, nome, senha)
- Verifica se usuário já existe
- Cria entidade User
- Salva no banco de dados via Repository
- Publica evento
user.registeredna filanotification_events - ACK é enviado para RabbitMQ
- Em caso de erro, NACK é enviado e mensagem retorna para fila
- Clean Architecture: Separação de responsabilidades em camadas
- DDD: Modelagem rica de domínio com Entities e Value Objects
- SOLID: Princípios de design orientado a objetos
- Dependency Injection: Inversão de controle via Service Container do Laravel
- Repository Pattern: Abstração da camada de dados
- 8081: Nginx (API REST - opcional)
- 3306: MySQL
- 5672: RabbitMQ (compartilhado)
- 15672: RabbitMQ Management (compartilhado)