📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Especialização em Sistemas com Go. Recomendado revisar antes de começar.
v1.0 — Redes Camada 4, Sockets TCP, Concorrência com Goroutines e Channels
Trilha de Especialização Pedagógica — Projeto 1 de 4
- ➡️ v1 (este): Load Balancer TCP (Layer 4) · Goroutines · Channels · Mutex
- v2: Servidor HTTP/2 Multiplexado em Go Puro
- v3: Protocolo de Chat em Tempo Real com WebSockets
- v4: Distributed Key-Value Store com Algoritmo de Consenso Raft
🎓 Nível Profissional Simulado: Engenheiro de Redes & Sistemas Distribuídos. Go foi criado pelo Google justamente para resolver o problema de servidores de rede de altíssima escala. Dominar Sockets TCP brutos, Goroutines, Channels e I/O Multiplexing é a fundação para entender como softwares como Envoy e Traefik funcionam.
—`
Construir um Balanceador de Carga TCP (Layer 4) em Go, capaz de receber conexões de clientes na porta 8000, escolher um servidor de backend saudável via algoritmo Round-Robin e criar uma ponte de streaming bidirecional de bytes (io.Copy) entre o cliente e o backend usando Goroutines concorrentes.
—`
“Precisamos de um balanceador TCP leve para nosso cluster de bancos de dados. Ele deve escutar conexões brutas em uma porta, redirecionar de forma alternada para 2 nós de backend e gerenciar cada conexão em uma goroutine independente sem travar a CPU e sem corromper pacotes.”
| ID | Tipo | Descrição | Origem no Briefing |
|---|---|---|---|
| RF01 | Funcional | Escutar conexões TCP de entrada via net.Listen("tcp", port). |
“escutar conexões brutas” |
| RF02 | Funcional | Selecionar o nó de destino utilizando o algoritmo Round-Robin thread-safe (sync.Mutex). |
“redirecionar de forma alternada” |
| RF03 | Funcional | Estabelecer canal bidirecional de cópia de bytes entre cliente e backend. | “ponte de streaming de bytes” |
| RNF01 | Não-Funcional | Multiplexação com Goroutines consumindo menos de 4KB de pilha inicial por conexão. | Escala Massiva |
| RNF02 | Não-Funcional | Encerramento limpo de conexões órfãs (defer conn.Close()). |
Confiabilidade de Rede |
—`
| ID | User Story | Prioridade |
|---|---|---|
| US01 | Como cliente TCP, quero me conectar ao balanceador e ser roteado transparentemente ao nó de destino. | Alta |
| US02 | Como SRE, quero que conexões simultâneas rodem em paralelo sem bloqueio de I/O. | Alta |
—`
# Branch da funcionalidade
git checkout -b feature/US01-tcp-load-balancer
# Executar o Load Balancer
go run main.go
—`
main.go)package main
import (
"io"
"log"
"net"
"sync"
)
type LoadBalancer struct {
\backends []string
\index int
\mu sync.Mutex
}
func (lb *LoadBalancer) getNextBackend() string {
\lb.mu.Lock()
\defer lb.mu.Unlock()
\backend := lb.backends[lb.index]
\lb.index = (lb.index + 1) % len(lb.backends)
\return backend
}
func handleConnection(clientConn net.Conn, backendAddr string) {
\defer clientConn.Close()
\backendConn, err := net.Dial("tcp", backendAddr)
\if err != nil {
\return
}
\defer backendConn.Close()
// Copia bidirecional concorrente
\go io.Copy(backendConn, clientConn)
\io.Copy(clientConn, backendConn)
}
—`
No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:
cd sistemas_go_01_tcp_loadbalancer
go run main.go
go test ./...
[!TIP] Dica para execução a partir da raiz do repositório: Se você abriu o repositório completo no VS Code, basta navegar até a pasta antes de executar: cd proj_aplicacoes_full_stack/projetos/sistemas_go_01_tcp_loadbalancer`
io.Copy e Goroutines para alta vazão com baixo overhead de memória.—`
# Testar conexao com netcat / telnet
nc -zv 127.0.0.1 8000
—`
- Balanceador Layer 4 roteando tráfego TCP sem perda de pacotes.
- Goroutines gerenciando conexões concorrentes isoladas.
| ⬅️ Ver Todos os Projetos no Super-Hub | 🏠 Página Inicial do Portal |