Load balancer HTTP em Go, escrito do zero para o PSEL PATOS/POMBO 2.0.
- fileserver/ : servidor HTTP que armazena e serve arquivos via GET/POST em
/files/{nome} - loadbalancer/ : proxy TCP na porta 9090 que distribui requisições entre fileservers usando least-connections
A documentação do processo de aprendizado se encontra em journal.md
- Go 1.21+
make(opcional)
A aplicação é composta por 4 processos que ficam rodando simultaneamente:
- 3 fileservers (nas portas 9001, 9002, 9003)
- 1 load balancer (na porta 9090)
Cada um precisa do seu próprio terminal, porque cada processo bloqueia o terminal enquanto está ativo.
Você vai precisar de:
- 4 terminais para os processos em execução
- (+1 terminal se quiser testar com curl, também dá pra testar pelo navegador)
Todos os terminais devem estar abertos na raiz do projeto (psel/).
Abra 4 terminais na raiz do projeto. Em cada um, rode um comando:
Terminal 1:
make run-backend1Terminal 2:
make run-backend2Terminal 3:
make run-backend3Terminal 4:
make run-lbOs 4 processos agora estão rodando. Para parar qualquer um, aperte Ctrl+C no terminal correspondente.
Você precisa primeiro compilar os binários (uma vez só) e depois rodar os processos (4 terminais simultâneos).
Passo 1 — Compilar
Em qualquer terminal, na raiz do projeto:
Linux/macOS:
mkdir -p bin
go build -o bin/fileserver ./fileserver
go build -o bin/loadbalancer ./loadbalancerWindows (PowerShell):
mkdir bin -Force
go build -o bin/fileserver.exe ./fileserver
go build -o bin/loadbalancer.exe ./loadbalancerPasso 2 — Rodar
Abra 4 terminais e em cada um execute um dos comandos abaixo (um terminal por linha).
Linux/macOS:
# Terminal 1
PORT=9001 ./bin/fileserver
# Terminal 2
PORT=9002 ./bin/fileserver
# Terminal 3
PORT=9003 ./bin/fileserver
# Terminal 4
./bin/loadbalancerWindows (PowerShell):
# Terminal 1
$env:PORT="9001"; .\bin\fileserver.exe
# Terminal 2
$env:PORT="9002"; .\bin\fileserver.exe
# Terminal 3
$env:PORT="9003"; .\bin\fileserver.exe
# Terminal 4
.\bin\loadbalancer.exeCada terminal vai travar mostrando os logs do seu processo. Para parar, Ctrl+C em cada terminal.
Todas as requisições devem ir para o load balancer (localhost:9090):
| Método | Rota | Efeito |
|---|---|---|
| GET | /files/{nome} |
Retorna o conteúdo do arquivo |
| POST | /files/{nome} |
Grava o body como arquivo |
Com os 4 processos rodando, abra um terminal extra para mandar requisições. Todas as requisições vão para o load balancer na porta 9090.
Atenção (Windows/PowerShell): Para usar o curl no PowerShell, escreva curl.exe (com extensão) em todos os exemplos abaixo. No cmd, Git Bash, WSL, Linux ou macOS, basta curl.
O -X POST define o método e o -d define o conteúdo (body) que vai ser gravado como arquivo:
curl -X POST -d "conteúdo do arquivo" http://localhost:9090/files/teste.txtPara enviar um arquivo do disco em vez de digitar o conteúdo, troque -d "..." por --data-binary @nome-do-arquivo. O @ indica que é um caminho de arquivo:
curl -X POST --data-binary @local.txt http://localhost:9090/files/teste.txtcurl http://localhost:9090/files/teste.txtAbra qualquer navegador e cole na barra de endereço:
http://localhost:9090/files/teste.txt
DICA: tente visualizar os arquivos pombo.txt e patos.txt !!!