📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Especialização em Sistemas com Go. Recomendado revisar antes de começar.

🌐 Load Balancer TCP Concorrente com Go & Goroutines

v1.0 — Redes Camada 4, Sockets TCP, Concorrência com Goroutines e Channels

Trilha de Especialização Pedagógica — Projeto 1 de 4

🎓 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.

—`

🎯 Objetivo & Escopo do Projeto

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.

—`

🧑‍💼 Fase 1 — Levantamento de Requisitos

O Briefing do Cliente (Arquiteto de Infraestrutura de Nuvem)

“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.”

Requisitos Funcionais (RF) e Não-Funcionais (RNF)

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

—`

📋 Fase 2 — Backlog & User Stories

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

—`

🌿 Fase 3 — Engenharia em Equipe (Git Flow & Setup)

# Branch da funcionalidade
git checkout -b feature/US01-tcp-load-balancer

# Executar o Load Balancer
go run main.go

—`

🛠️ Fase 4 — Implementação Guiada (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)
}

—`

🚀 Como Executar no Laboratório

1. Abra o terminal na pasta deste projeto

No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:

cd sistemas_go_01_tcp_loadbalancer

2. Execute a aplicação e os testes

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`

🧭 Decisões de Arquitetura (ADRs)

—`

🧪 Testes de Validação & Conexão

# Testar conexao com netcat / telnet
nc -zv 127.0.0.1 8000

—`

✅ Checkpoint Final

  1. Balanceador Layer 4 roteando tráfego TCP sem perda de pacotes.
  2. Goroutines gerenciando conexões concorrentes isoladas.

⬅️ Ver Todos os Projetos no Super-Hub 🏠 Página Inicial do Portal