Este é um sistema de jogo de cartas multiplayer distribuído implementado em Go, onde múltiplos servidores colaboram para gerenciar jogadores e partidas. O sistema utiliza uma arquitetura distribuída com comunicação inter-servidores via API REST e comunicação servidor-cliente via TCP com protocolo JSON.
- 3 Servidores de Jogo (server-1, server-2, server-3)
- Cliente de Teste (para demonstração)
- Sistema de Token Distribuído (para gerenciamento de pacotes)
- API Inter-Servidores (comunicação REST)
- Sistema de Matchmaking Distribuído
Servidor 1: TCP:9000, HTTP:8000
Servidor 2: TCP:9001, HTTP:8001
Servidor 3: TCP:9002, HTTP:8002- Docker e Docker Compose
- Go 1.19+ (para desenvolvimento local)
# Clone o repositório
git clone <repository-url>
cd pbl2-redes
# Subir todos os serviços
docker-compose up --build# Verificar containers em execução
docker-compose ps
# Verificar logs de um servidor específico
docker-compose logs server-1
docker-compose logs server-2
docker-compose logs server-3
# Verificar logs do cliente
docker-compose logs clientPara testar com múltiplos clientes:
# Conectar cliente ao servidor 1
docker run --rm -it --network pbl2-redes_game-net \
-e SERVER_ADDR=server-1:9000 \
pingpong-client:latest
# Conectar cliente ao servidor 2
docker run --rm -it --network pbl2-redes_game-net \
-e SERVER_ADDR=server-2:9001 \
pingpong-client:latest
# Conectar cliente ao servidor 3
docker run --rm -it --network pbl2-redes_game-net \
-e SERVER_ADDR=server-3:9002 \
pingpong-client:latestEsta seção descreve como executar os servidores em máquinas separadas (ou VMs) usando docker run e --network=host, assumindo que as máquinas estão na mesma rede e podem se comunicar pelos IPs listados.
- As três máquinas (ex:
192.168.1.10,192.168.1.11,192.168.1.12) devem ter o Docker instalado e a imagempingpong-server:latestepingpong-client:latest(construída, por exemplo, comdocker-compose build). - As portas
8000(API) e9000(TCP) devem estar acessíveis entre as máquinas.
export ALL_SERVERS_LIST="http://192.168.1.10:8000,http://192.168.1.11:8000,http://192.168.1.12:8000"Na Máquina 1 (192.168.1.10):
docker run -d --rm \
--name pbl_server_1 \
--network=host \
-e "LISTEN_ADDR=:9000" \
-e "API_ADDR=:8000" \
-e "ALL_SERVERS=${ALL_SERVERS_LIST}" \
-e "HOSTNAME=192.168.1.10" \
pingpong-server:latestNa Máquina 2 (192.168.1.11):
docker run -d --rm \
--name pbl_server_2 \
--network=host \
-e "LISTEN_ADDR=:9000" \
-e "API_ADDR=:8000" \
-e "ALL_SERVERS=${ALL_SERVERS_LIST}" \
-e "HOSTNAME=192.168.1.11" \
pingpong-server:latestNa Máquina 3 (192.168.1.12):
docker run -d --rm \
--name pbl_server_3 \
--network=host \
-e "LISTEN_ADDR=:9000" \
-e "API_ADDR=:8000" \
-e "ALL_SERVERS=${ALL_SERVERS_LIST}" \
-e "HOSTNAME=192.168.1.12" \
pingpong-server:latestdocker run --rm -it \
--network=host \
-e "SERVER_ADDR=192.168.1.10:9000" \
pingpong-client:latestcd tests
go test -v packs_test.go
go test -bench=BenchmarkPackStoreConcurrency -vcd tests
go test -v stress_cluster_test.go
go test -v stress_packs.goLISTEN_ADDR=:9000
API_ADDR=:8000
ALL_SERVERS=http://server-1:8000,http://server-2:8000,http://server-3:8000
HOSTNAME=server-1
PACK_REQUEST_TIMEOUT_SEC=10SERVER_ADDR=server-1:9000
PING_INTERVAL_MS=2000curl -X GET http://localhost:8001/api/find-opponentcurl -X POST http://localhost:8002/api/request-match \
-H "Content-Type: application/json" \
-d '{
"matchId": "match_456",
"hostPlayerId": "player_123",
"guestPlayerId": "player_789"
}'curl -X POST http://localhost:8000/api/receive-token \
-H "Content-Type: application/json" \
-d '{"packStock": 1000}'{
"t": "MATCH_FOUND",
"matchId": "match_456",
"opponentId": "player_789"
}{
"t": "STATE",
"you": {"hp": 20, "hand": ["c_001", "c_002", "c_003", "c_004", "c_005"]},
"opponent": {"hp": 20, "handSize": 5},
"round": 1,
"deadlineMs": 12000
}/play <número>— Jogar carta/hand— Mostrar mão/pack— Abrir pacote/ping— Mostrar RTT/autoplay— Ativar autoplay/rematch— Nova partida/help— Ajuda/quit— Sair
cd server
go run main.go
cd client
go run main.go
cd tests
go test -v ./...docker-compose logs -f server-1
docker-compose logs -f server-2
docker-compose logs -f server-3
docker-compose ps
docker stats-
Servidor não inicia
- Verifique as portas
- Use
docker-compose logs server-1
-
Cliente não conecta
- Confirme se o servidor está rodando
-
Partidas não criam
- Certifique-se de que múltiplos servidores estão online
-
Pacotes não abrem
- Verifique o token e logs da API
- Regeneração Inteligente de Token: watchdog no líder com timeout dinâmico (4s × nº de servidores)
- Logs estruturados:
[MATCHMAKING],[HANDLER],[MATCH], etc. - Timeout Configurável:
PACK_REQUEST_TIMEOUT_SEC=10- Regras do Jogo
- Descrição do Problema
- Arquitetura Distribuída
- API e Orquestração
- Relatório de Verificação
- Fork o projeto
- Crie uma branch (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push (
git push origin feature/AmazingFeature) - Abra um Pull Request