Um sistema de marketplace para venda de ingressos de eventos, desenvolvido com Spring Boot 4.0.5 usando uma arquitetura modular baseada em domínios. O projeto é estruturado em módulos independentes (Registration, Catalog e Ticketing), cada um com sua própria base de dados e responsabilidades específicas.
O Marketplace é uma aplicação que permite:
- Cadastro de Clientes (Registration): Gerenciar informações de clientes na plataforma
- Catálogo de Eventos (Catalog): Visualizar e gerenciar eventos disponíveis com metadados enriquecidos
- Seleção de Ingressos (Ticketing): Selecionar e reservar assento com controle de concorrência
- Java 25 com Spring Boot 4.0.5
- Banco de Dados:
- MySQL (Registration e Catalog)
- PostgreSQL (Ticketing)
- MongoDB (Metadados do Catalog)
- Cache: Redis (Catalog e Ticketing)
- Build: Gradle com Docker Compose
O projeto segue a arquitetura modular com separação por domínios, onde cada módulo é uma unidade independente com suas responsabilidades claras.
marketplace/
├── MarketplaceApplication.java # Classe principal da aplicação
├── catalog/ # Módulo de Catálogo de Eventos
├── registration/ # Módulo de Registro de Clientes
├── ticketing/ # Módulo de Compra de Ingressos
└── common/ # Código compartilhado entre módulos
Responsabilidade: Gerenciar o catálogo de eventos e suas informações
Database:
- MySQL (porta 3308) - dados estruturados
- MongoDB (porta 27018) - metadados dos eventos
- Redis (porta 6380) - cache
Estrutura:
catalog/
├── application/ # Casos de uso e DTOs
│ ├── BrowseShowcaseUseCase.java # Use case para navegar no catálogo
│ ├── EventEnricher.java # Enriquece eventos com metadados
│ └── dto/
│ └── EventOutput.java # DTO para resposta de eventos
│
├── domain/ # Entidades e lógica de negócio
│ ├── Event.java # Entidade: Evento
│ ├── EventId.java # Value Object: ID do evento
│ ├── EventMetadata.java # Entidade: Metadados do evento
│ ├── EventMetadataRepository.java # Interface do repositório
│ ├── EventRepository.java # Interface do repositório
│ ├── Seat.java # Entidade: Assento
│ ├── SeatId.java # Value Object: ID do assento
│ ├── Sector.java # Entidade: Setor de assentos
│ └── SectorId.java # Value Object: ID do setor
│
└── infrastructure/ # Implementações técnicas
├── event/ # Event listeners para integração
│ ├── EventListener.java
│ └── EventMetadataEventListener.java
├── http/
│ └── ShowcaseController.java # REST Controller
└── persistence/ # Persistência em BD
├── entity/ # Entidades JPA/MongoDB
│ ├── Event.java
│ └── EventMetadata.java
└── repository/ # Implementações de repositórios
├── EventEntityRepository.java
├── EventMetadataEntityRepository.java
├── JpaEventRepository.java
└── MongoEventMetadataRepository.java
Fluxo de Dados:
- Controlador recebe requisição de catálogo
- Use case
BrowseShowcaseUseCaserecupera eventos EventEnricherenriquece com metadados do MongoDB- Dados são cacheados em Redis
- Resposta retornada como
EventOutput
Responsabilidade: Gerenciar o registro e informações de clientes
Database:
- MySQL (porta 3307) - dados de clientes
Estrutura:
registration/
├── application/ # Casos de uso
│
├── domain/ # Entidades de negócio
│ ├── Customer.java # Entidade: Cliente
│ ├── CustomerId.java # Value Object: ID do cliente
│ └── CustomeRepository.java # Interface do repositório (typo: CustomeRepository)
│
└── infrastructure/ # Implementações técnicas
├── RegistrationConfiguration.java # Configuração do módulo
├── event/
│ └── CustomerEventHandler.java # Manipulador de eventos
└── persistence/
├── entity/
│ ├── Address.java # Entidade: Endereço
│ └── ... # Outras entidades
└── repository/ # Repositórios JPA
Responsabilidades:
- Criar e manter registros de clientes
- Gerenciar endereços e informações de contato
- Publicar eventos quando clientes são criados (usado por outros módulos)
Responsabilidade: Gerenciar seleção e reserva de ingressos (assentos)
Database:
- PostgreSQL (porta 5433) - dados de transações críticas
- Redis (porta 6381) - controle de concorrência/locks
Estrutura:
ticketing/
├── application/ # Casos de uso
│ ├── CreateCustomerUseCase.java # Use case: Criar cliente no ticketing
│ ├── CreateEventUseCase.java # Use case: Criar evento no ticketing
│ └── SelectSeatUseCase.java # Use case: Selecionar assento
│
├── domain/ # Entidades críticas
│ ├── Customer.java # Entidade: Cliente
│ ├── CustomerId.java # Value Object: ID do cliente
│ ├── CustomerRepository.java # Interface do repositório
│ ├── Event.java # Entidade: Evento
│ ├── EventId.java # Value Object: ID do evento
│ ├── EventRepository.java # Interface do repositório
│ ├── Seat.java # Entidade: Assento
│ ├── SeatId.java # Value Object: ID do assento
│ ├── SeatAlreadyReservedException.java # Exceção específica
│ ├── SeatNotFoundException.java # Exceção específica
│ ├── Sector.java # Entidade: Setor
│ └── SectorId.java # Value Object: ID do setor
│
└── infrastructure/ # Implementações técnicas
├── TicketingConfiguration.java # Configuração do módulo
├── event/
│ └── TicketingEventListener.java # Listener para eventos de entrada
├── http/
│ ├── SeatSelectionController.java # REST Controller
│ └── request/ # Request DTOs
└── persistence/
├── entity/ # Entidades JPA
└── repository/ # Repositórios com locks
Características Críticas:
- Usa locks distribuídos (Redis) para evitar reserva duplicada de assentos
- Integração com eventos do módulo de Catalog
- Transações críticas em PostgreSQL para garantir integridade
Responsabilidade: Código reutilizável entre módulos
Estrutura:
common/
└── infrastructure/
└── event/
└── dto/
├── CustomerCreated.java # Evento: Cliente criado
└── EventUpdated.java # Evento: Evento atualizado
Propósito: Definir estruturas de eventos que são publicadas por um módulo e consumidas por outro, permitindo comunicação assíncrona.
O projeto utiliza 3 bancos de dados diferentes para cada módulo:
| Módulo | BD Principal | BD Secundária | Cache | Porta |
|---|---|---|---|---|
| Registration | MySQL | - | - | 3307 |
| Catalog | MySQL | MongoDB | Redis | 3308, 27018, 6380 |
| Ticketing | PostgreSQL | - | Redis | 5433, 6381 |
- Registration DB:
jdbc:mysql://localhost:3307/registration - Catalog DB:
jdbc:mysql://localhost:3308/catalog - Catalog Metadata: MongoDB na porta 27018
- Catalog Cache: Redis porta 6380
- Ticketing DB:
jdbc:postgresql://localhost:5433/ticketing - Ticketing Locking: Redis porta 6381
- Java 25+
- Docker e Docker Compose
- Git
docker-compose up -dIsso iniciará:
- MySQL (Registration)
- MySQL (Catalog)
- MongoDB (Metadados do Catalog)
- Redis (Cache do Catalog)
- PostgreSQL (Ticketing)
- Redis (Locks do Ticketing)
./gradlew build
./gradlew bootRunOu no Windows:
gradlew.bat build
gradlew.bat bootRun- API Principal:
http://localhost:8080 - Health Check:
http://localhost:8080/actuator/health - Dados REST:
http://localhost:8080/data-rest-explorer
O projeto segue os princípios do DDD:
- Entidades:
Event,Customer,Seat,Sector - Value Objects:
EventId,CustomerId,SeatId,SectorId - Repositórios: Interfaces de acesso aos dados em cada domínio
- Use Cases: Casos de uso específicos de cada módulo
- Event Sourcing: Comunicação entre módulos via eventos
Domain Layer → Lógica de Negócio Pura
Application Layer → Use Cases e Orquestração
Infrastructure → BD, HTTP, Cache, etc
Os módulos se comunicam através de eventos de domínio:
- Um módulo publica um evento (ex:
CustomerCreated) - Outro módulo escuta e reage (ex:
TicketingEventListener) - Isso mantém os módulos desacoplados e independentes
- Virtual Threads: Habilitado no Spring (
spring.threads.virtual.enabled=true) para melhor performance - Validação: Spring Validation em todas as entradas
- Async Processing: Habilitado com
@EnableAsyncpara operações não-bloqueantes - Caching: Habilitado com
@EnableCachingpara otimizar consultas - Lock Distribuído: Redis utilizado para locks no Ticketing, evitando race conditions
| Propriedade | Valor | Descrição |
|---|---|---|
spring.threads.virtual.enabled |
true | Ativa Virtual Threads do Java 21+ |
spring.data.redis.client-type |
jedis | Cliente Redis |
spring.mongodb.representation.uuid |
standard | Representação padrão de UUID no MongoDB |
**.jpa.properties.hibernate.hbm2ddl.auto |
update | Auto-criar/atualizar esquemas |
Execute os testes com:
./gradlew testA suite de testes inclui:
- Testes unitários das entidades de domínio
- Testes de integração dos repositórios
- Testes dos controllers REST
marketplace/
├── build.gradle # Configuração de dependências Gradle
├── compose.yml # Definição dos serviços Docker
├── settings.gradle # Configurações globais Gradle
├── gradle/ # Wrapper do Gradle
└── build/ # Artefatos compilados (ignorar no versionamento)
- Spring Boot: 4.0.5
- Java: 25
- Spring Data JPA: ORM para MySQL e PostgreSQL
- Spring Data MongoDB: ODM para MongoDB
- Spring Data Redis: Client Redis
- Spring Web: REST APIs
- Spring Actuator: Monitoramento e Health Check
- Spring Validation: Validação de dados
- Spring Data REST: Auto-geração de APIs REST
- Lombok: Redução de boilerplate com anotações
- MySQL Connector: Driver MySQL
- PostgreSQL Driver: Driver PostgreSQL
- Jedis: Cliente Redis em Java
✅ Arquitetura Modular: Cada módulo é independente e testável
✅ Multi-Banco de Dados: Adequado para cada caso de uso
✅ Cache Distribuído: Redis integrado para performance
✅ Comunicação Assíncrona: Event-driven entre módulos
✅ Controle de Concorrência: Locks distribuídos para operações críticas
✅ Validação Automática: Spring Validation em todos os endpoints
✅ Health Checks: Monitoramento via Actuator
✅ Docker Compose: Stack completo containerizado
Este é um projeto educacional para aprender:
- Spring Boot e sua arquitetura
- Domain-Driven Design (DDD)
- Arquiteturas modulares distribuídas
- Integração com múltiplos bancos de dados
Versão: 0.0.1-SNAPSHOT
Autor: Marcio
Data de Atualização: 2026-01-20