O ChatApp é um sistema de mensagens em tempo real desenvolvido em Go, utilizando WebSocket para comunicação bidirecional entre clientes e servidor. O projeto oferece:
- Comunicação em tempo real entre usuários
- Histórico de mensagens persistente
- Status online/offline dos usuários
- Autenticação segura via JWT
- Arquitetura limpa e escalável
chat-app/
├── cmd/
│ └── server/
│ └── main.go # Ponto de entrada da aplicação
├── internal/
│ ├── config/
│ │ └── config.go # Configurações da aplicação
│ ├── handlers/
│ │ ├── auth.go # Middleware de autenticação
│ │ ├── common.go # Utilitários compartilhados
│ │ ├── messages.go # Manipuladores de mensagens
│ │ ├── routes.go # Configuração de rotas
│ │ ├── status.go # Manipuladores de status
│ │ └── websocket.go # Manipulador WebSocket
│ ├── models/
│ │ ├── message.go # Modelo de mensagem
│ │ └── user_status.go # Modelo de status do usuário
│ ├── repository/
│ │ ├── message_repo.go # Operações de banco para mensagens
│ │ └── status_repo.go # Operações de banco para status
│ ├── service/
│ │ ├── auth_service.go # Serviço de autenticação
│ │ ├── message_service.go # Serviço de mensagens
│ │ └── status_service.go # Serviço de status
│ └── websocket/
│ ├── client.go # Cliente WebSocket
│ ├── hub.go # Hub WebSocket
│ └── message.go # Mensagens WebSocket
├── pkg/
│ └── jwt/
│ └── jwt.go # Utilitários JWT
├── go.mod # Definição do módulo Go
├── go.sum # Dependências do módulo
├── .env.example # Exemplo de variáveis de ambiente
└── README.md # Este arquivo
- Go 1.21+
- MySQL 8.0+
- Git
Clone o repositório:
git clone https://github.com/FelipePn10/chatapp.git
cd chatappConfigure o ambiente:
cp .env.example .env
# Edite o .env com suas configuraçõesInstale as dependências:
go mod tidyInicie o servidor:
go run cmd/server/main.go| Variável | Descrição | Padrão |
|---|---|---|
| PORT | Porta do servidor | 8081 |
| DB_USER | Usuário do MySQL | root |
| DB_PASSWORD | Senha do MySQL | "" |
| DB_HOST | Host do MySQL | localhost |
| DB_NAME | Nome do banco de dados | chat_db |
| JWT_SECRET | Segredo para tokens JWT | - |
| LOG_LEVEL | Nível de logging | info |
Requer token JWT no header Authorization: Bearer <token>
GET /wsEstabelece conexão WebSocket para comunicação em tempo real
GET /api/messages/history?user_id=<id>&limit=<n>Retorna histórico de mensagens
GET /api/users/status?user_id=<id>Retorna status dos usuários
GET /healthVerifica status do servidor
- Linguagem: Go 1.21+
- Banco de Dados: MySQL 8.0
- WebSocket: gorilla/websocket
- Autenticação: JWT
- Logging: zerolog
- Router: gorilla/mux
- Configuração: godotenv
Client → HTTP/WS → Handlers → Services → Repositories → Database
↑ ↑ ↑
│ │ └── Persistência
│ └── Lógica de negócio
└── Controllers/Rotas
sequenceDiagram
participant Client
participant Server
participant DB
Client->>Server: HTTP GET /ws (Upgrade to WebSocket)
Server->>Client: 101 Switching Protocols
loop WebSocket Connection
Client->>Server: Send Message
Server->>DB: Persist Message
Server->>Client: Broadcast Message
end
Para executar os testes:
go test ./...docker build -t chatapp .
docker run -p 8081:8081 --env-file .env chatappapiVersion: apps/v1
kind: Deployment
metadata:
name: chatapp
spec:
replicas: 3
template:
spec:
containers:
- name: chatapp
image: chatapp:latest
ports:
- containerPort: 8081
envFrom:
- secretRef:
name: chatapp-secrets- Faça um fork do projeto
- Crie sua branch (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push para a branch (
git push origin feature/AmazingFeature) - Abra um Pull Request
Distribuído sob a licença MIT. Veja LICENSE para mais informações.
Felipe Panosso - panossodev@example.com
Link do Projeto: https://github.com/FelipePn10/chatapp