Servidor de chat em Go com gRPC bidirecional, salas em memória e suporte opcional a OpenTelemetry (traces e métricas) para ambientes locais ou baseados em containers.
Este repositório foi pensado como um laboratório prático para experimentar e validar padrões importantes em sistemas distribuídos baseados em gRPC. A ideia não é apenas fornecer um servidor de chat funcional, mas oferecer uma base enxuta e repetível para testar:
- Conectividade e streaming bidirecional: como clientes mantêm streams long‑lived com o servidor e como o servidor distribui eventos (join/leave/message) para participantes.
- Concorrência e coerência de sala: comportamento sob múltiplos clientes concorrentes (ordem de mensagens, perda de mensagens, limpeza de sessões).
- Resiliência e tratamento de erros: como o sistema reage a cancelamentos, quedas de cliente e reconexões.
- Observability / Telemetria: como instrumentar o serviço com OpenTelemetry (traces + métricas) e validar que spans e métricas chegam ao collector (OTLP gRPC/HTTP).
- Integração e deploy em containers: padrões práticos para empacotar o servidor/cliente em imagem Docker e testar redes entre serviços no Docker Compose.
- Visão geral
- Estrutura do repositório
- Pré‑requisitos
- Execução local
- Execução com Docker Compose
- Cliente CLI
- Geração de protos
- Testes e qualidade
- Comandos úteis
- Serviço gRPC com streaming bidirecional trocando envelopes (
ClientEnvelope↔ServerEvent). - Núcleo de domínio em memória que gerencia salas, sessões e broadcast sem dependências externas.
- Cliente CLI interativo para depuração e demonstrações rápidas.
cmd/chat-grpc— entrypoint do servidor gRPC.cmd/chat-client— cliente CLI interativo.api/proto— definiçãochat.protoe o código gerado emapi/proto/chatv1.internal/chat— domínio, salas, sessão, orchestrators e adapters.internal/platform— config, observability, logger adapter, servidor gRPC.infra/docker— Dockerfile + ambiente Compose.infra/observability/otel— configuração do Collector utilizado no Compose.tests/integration— suíte de integração.makefiles— alvos especializados usados pelo Makefile principal.
- Go 1.22+
- Docker 24+ e Docker Compose Plugin (opcional)
protocinstalado para regenerar protos (opcional)
- (Opcional) Garanta caches locais para builds determinísticos:
export GOCACHE=$PWD/.gocache
export GOMODCACHE=$PWD/.gomodcache- Suba o servidor diretamente:
go run ./cmd/chat-grpc- Abra quantos clientes desejar (cada um em um terminal):
go run ./cmd/chat-clientExistem três alvos principais no Makefile para o ambiente de desenvolvimento:
make build-dev— constrói a imagem Docker atualizada.make dev— sobe o ambiente completo (server + otel collector).make server— sobe apenas o serviçochat-grpc.make client— abre o cliente CLI dentro do Compose.
Fluxos recomendados:
- Primeira vez / ambiente completo:
make dev- Iteração rápida se a imagem já existe:
make server- Forçar rebuild da imagem e subir o servidor:
make build-dev
make serverModo local:
go run ./cmd/chat-clientModo via compose:
make clientSe api/proto/chat.proto for modificado, regenere os artefatos:
make protomake testOs testes de integração estão em tests/integration. Execute com:
make test-integrationmake build— compila binário do servidor localmake run— executa o servidor localmake build-dev— constrói imagem devmake dev— sobe ambiente completo (build + up)make server— sobe apenas o serviço do servidormake client— abre cliente dentro do composemake test-integration— roda testes de integração (tag integration)make lint— roda linters/formatmake proto— regenera código a partir do proto