Este projeto demonstra uma implementação prática de Space-Based Architecture (SBA) usando Java, Spring Boot e Hazelcast. O sistema simula um ambiente distribuído com Processing Units (PUs) e um Data Grid em memória para gerenciamento de pedidos.
A Space-Based Architecture é um padrão arquitetural que utiliza um espaço de dados compartilhado em memória para comunicação entre componentes distribuídos. Neste exemplo:
- Gateway: API REST que recebe requisições e interage com o espaço distribuído
- Processing Units: Serviços que processam pedidos e armazenam dados no cluster Hazelcast
- Data Grid: Hazelcast como espaço distribuído em memória para compartilhamento de dados
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Gateway │ │ PU-1 │ │ PU-2 │
│ (API REST) │ │ (Processing │ │ (Processing │
│ │ │ Unit) │ │ Unit) │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└──────────────────┼──────────────────┘
│
┌─────────▼─────────┐
│ Hazelcast │
│ Data Grid │
│ (Shared Space) │
└───────────────────┘
- Java 17+
- Spring Boot 3.2.0
- Maven (Multi-módulo)
- Hazelcast 5.3.6 (Data Grid distribuído)
- Docker & Docker Compose
space-based-architecture-demo/
├── pom.xml # POM principal
├── docker-compose.yml # Orquestração de containers
├── docker-compose.dev.yml # Configuração de desenvolvimento
├── common/ # Módulo compartilhado
│ ├── pom.xml
│ └── src/main/java/com/example/common/
│ ├── entity/ # Entidades (Order, OrderStatus)
│ └── dto/ # DTOs (CreateOrderRequest, OrderResponse)
├── gateway/ # API REST Gateway
│ ├── pom.xml
│ ├── Dockerfile
│ └── src/main/java/com/example/gateway/
│ ├── config/ # Configuração Hazelcast
│ ├── controller/ # REST Controllers
│ ├── service/ # Serviços de negócio
│ └── GatewayApplication.java
└── processing-unit/ # Processing Unit
├── pom.xml
├── Dockerfile
└── src/main/java/com/example/processing/
├── config/ # Configuração Hazelcast
├── service/ # Serviços de processamento
└── ProcessingUnitApplication.java
- Java 17 ou superior
- Maven 3.6+
- Docker e Docker Compose (opcional)
Suba o cluster com escala de Processing Units ajustável via parâmetro (padrão 3):
./scripts/start-docker.sh # escala padrão: 3
./scripts/start-docker.sh 5 # exemplo com 5 PUsPara parar:
./scripts/stop-docker.shAlternativamente, você pode usar o Docker Compose diretamente:
mvn clean package -DskipTests
docker compose up --build -d --scale processing-unit=3
docker compose downCompilar o projeto:
mvn clean installExecutar Processing Units (terminais separados):
# Terminal 1
cd processing-unit
mvn spring-boot:run -Dspring-boot.run.arguments="--hazelcast.discovery.mode=tcp"
# Terminal 2
cd processing-unit
mvn spring-boot:run -Dspring-boot.run.arguments="--hazelcast.discovery.mode=tcp"
# Terminal 3
cd gateway
mvn spring-boot:run -Dspring-boot.run.arguments="--hazelcast.discovery.mode=tcp"| Serviço | URL | Descrição |
|---|---|---|
| Gateway API | http://localhost:8080 | API REST principal |
| Management Center | — | (opcional, não incluído por padrão) |
Docker: use ./scripts/stop-docker.sh ou docker compose down
Gateway (http://localhost:8080)
| Método | Endpoint | Descrição |
|---|---|---|
POST |
/api/orders |
Criar novo pedido |
GET |
/api/orders/{id} |
Buscar pedido por ID |
GET |
/api/orders |
Listar todos os pedidos |
PUT |
/api/orders/{id}/status |
Atualizar status do pedido |
GET |
/api/orders/statistics |
Obter estatísticas do sistema |
GET |
/api/orders/health |
Health check |
curl -X POST http://localhost:8080/api/orders \
-H "Content-Type: application/json" \
-d '{
"cliente": "João Silva",
"produto": "Notebook Dell",
"quantidade": 1
}'curl http://localhost:8080/api/orders/{order-id}curl http://localhost:8080/api/orderscurl http://localhost:8080/api/orders/statisticsPara observar o comportamento distribuído, execute múltiplas instâncias do Processing Unit:
# Terminal 1 - Processing Unit 1
cd processing-unit
mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=8081"
# Terminal 2 - Processing Unit 2
cd processing-unit
mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=8082"
# Terminal 3 - Gateway
cd gateway
mvn spring-boot:runOs logs mostrarão:
- Conexão ao cluster Hazelcast
- Processamento de pedidos pelas PUs
- Replicação de dados no espaço distribuído
- Estatísticas em tempo real
- Crie pedidos via API
- Observe os logs das Processing Units
- Verifique as estatísticas para ver a distribuição
- Pare uma PU e veja como o sistema continua funcionando
- gateway: API REST na porta 8080
- processing-unit-1: Primeira Processing Unit
- processing-unit-2: Segunda Processing Unit
- processing-unit-3: Terceira Processing Unit
# Ver logs de todos os serviços
docker-compose logs -f
# Ver logs de um serviço específico
docker-compose logs -f gateway
# Escalar Processing Units
docker-compose up --scale processing-unit=5
# Reiniciar um serviço
docker-compose restart gateway- Gateway: http://localhost:8080/actuator/health
- Processing Units: Logs no console
- Estatísticas do sistema via API
- Logs de processamento em tempo real
- Informações do cluster Hazelcast
| Variável | Descrição | Padrão |
|---|---|---|
HAZELCAST_PORT |
Porta do Hazelcast | 5701 |
HAZELCAST_CLUSTER_NAME |
Nome do cluster | space-based-cluster |
PROCESSING_UNIT_ID |
ID da Processing Unit | PU-${random.uuid} |
SPRING_PROFILES_ACTIVE |
Perfil ativo | dev |
- dev: Desenvolvimento com logs detalhados
- prod: Produção com logs otimizados
- docker: Configuração para containers
- Execute o sistema
- Crie vários pedidos via API
- Observe como as PUs processam os pedidos
- Verifique as estatísticas
- Execute múltiplas PUs
- Crie pedidos
- Pare uma PU durante o processamento
- Verifique se o sistema continua funcionando
- Execute com 1 PU
- Crie muitos pedidos
- Adicione mais PUs
- Observe a distribuição de carga
=== GATEWAY INICIADO ===
Conectado ao cluster Hazelcast
API REST disponível em: http://localhost:8080/api/orders
=== PROCESSING UNIT INICIADO ===
Conectado ao cluster Hazelcast
Aguardando pedidos para processamento...
Processing Unit PU-1 iniciando processamento do pedido: 123e4567-e89b-12d3-a456-426614174000
Pedido 123e4567-e89b-12d3-a456-426614174000 salvo no espaço distribuído pela PU PU-1
Pedido 123e4567-e89b-12d3-a456-426614174000 processado com sucesso pela PU PU-1
- Fork o projeto
- Crie uma branch para sua feature
- Commit suas mudanças
- Push para a branch
- Abra um Pull Request
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
Para dúvidas ou problemas:
- Verifique os logs dos serviços
- Consulte a documentação do Hazelcast
- Abra uma issue no repositório
🎯 Objetivo: Este projeto demonstra como implementar uma arquitetura baseada em espaço usando Java, mostrando os conceitos de distribuição, tolerância a falhas e escalabilidade em um ambiente prático e funcional.