Início rápido
Arquivos-fonte
Esta página foi gerada com base nos seguintes arquivos-fonte:
O gochat é um sistema de chat distribuído escrito em Go, projetado para oferecer comunicação em tempo real através de WebSocket e TCP. O projeto utiliza uma arquitetura baseada em microserviços com descoberta de serviços via etcd, armazenamento em Redis e gerenciamento de processos através do Supervisor.
Pré-requisitos e Ambiente Docker
O projeto gochat utiliza Docker como ambiente de execução principal, simplificando significativamente a configuração e implantação. A imagem Docker é baseada em Golang 1.18 e inclui todas as dependências necessárias pré-instaladas (docker/Dockerfile:1-29).
Dependências Instaladas
A imagem Docker inclui as seguintes dependências principais:
| Dependência | Versão | Finalidade |
|---|---|---|
| Golang | 1.18 | Runtime principal da aplicação |
| etcd | v3.4.3 | Descoberta de serviços e configuração distribuída |
| Redis | 5.0.9 | Cache e armazenamento de sessões |
| Supervisor | - | Gerenciamento de processos |
O processo de build da imagem pode ser executado localmente através do Makefile, permitindo personalizar a tag da imagem conforme necessário (Makefile:1-4).
Modos de Execução
O sistema suporta dois modos de execução configurados através da variável de ambiente RUN_MODE:
- dev: Ambiente de desenvolvimento com configurações padrão
- prod: Ambiente de produção (requer configuração adicional)
O modo padrão é dev, conforme definido no Dockerfile (docker/Dockerfile:1-29).
Instalação e Build da Imagem
Usando a Imagem Predefinida
A maneira mais rápida de iniciar é utilizando a imagem Docker predefinida disponível no Docker Hub. A imagem lockgit/gochat:1.18 já contém todas as dependências necessárias (run.sh:42-47).
Construindo a Imagem Localmente
Para arquiteturas não suportadas pela imagem predefinida (como Apple Silicon M1), é necessário construir a imagem localmente:
bash1cd docker 2docker build -t lockgit/gochat:1.18 .
Ou utilizando o Makefile:
bash1make build TAG=1.18
O Makefile demonstra o comando de build com tag personalizável (Makefile:1-4).
Executando o Projeto
O script run.sh é o ponto de entrada principal para inicialização do sistema. Este script gerencia toda a configuração e execução do container Docker.
Parâmetros Necessários
O script requer dois parâmetros obrigatórios:
- CONFIG_ENV: Ambiente de execução (
devouprod) - IPADDR: Endereço IP válido para configuração dos serviços
A validação do endereço IP é realizada através de uma função que verifica o formato IPv4 padrão (run.sh:8-22).
Comando de Inicialização
Para ambiente de desenvolvimento:
bash1sh run.sh dev 127.0.0.1
Para ambiente de produção:
bash1sh run.sh prod x.x.x.x
O script valida os parâmetros e exibe mensagens de erro apropriadas se os argumentos estiverem incorretos (run.sh:24-37).
Portas Expostas
O container expõe as seguintes portas para comunicação externa (run.sh:66-71):
| Porta | Serviço | Descrição |
|---|---|---|
| 8080 | HTTP | Interface web principal |
| 7070 | API | API HTTP para comunicação |
| 7000 | WebSocket | Conexões WebSocket |
| 7001 | WebSocket | Conexões WebSocket alternativas |
| 7002 | TCP/RPC | Comunicação RPC entre serviços |
Volumes Montados
O script configura os seguintes volumes para persistência e configuração (run.sh:61-64):
- Código fonte: diretório atual →
/go/src/gochat - Configuração do Supervisor:
docker/{env}/supervisord.d→/etc/supervisord.d - Arquivo principal do Supervisor:
docker/{env}/supervisord.conf→/etc/supervisord.conf - Configuração do Redis:
docker/{env}/redis.conf→/root/redis.conf
Processo de Inicialização
Após o container iniciar, o script reload.sh é executado automaticamente para:
- Substituir os endereços IP nos arquivos JavaScript estáticos
- Compilar o binário gochat.bin
- Reiniciar todos os serviços via Supervisor
O script de reload realiza a compilação com flags específicas para compatibilidade com SQLite3 (reload.sh:12-17).
Configuração do Supervisor
O Supervisor é utilizado para gerenciar todos os processos do sistema dentro do container Docker. A configuração principal define os parâmetros globais de execução (docker/dev/supervisord.conf:1-141).
Configuração Global
O arquivo de configuração define:
- Socket Unix para comunicação:
/tmp/supervisor.sock - Arquivo de log principal:
/tmp/supervisord.log - Nível de log:
info - PID file:
/tmp/supervisord.pid
Inclusão de Configurações
O Supervisor está configurado para incluir automaticamente todos os arquivos .ini do diretório /etc/supervisord.d (docker/dev/supervisord.conf:140-141). Isso permite modularizar a configuração de cada serviço em arquivos separados.
Os arquivos de configuração específicos de cada ambiente são montados durante a execução do container (run.sh:62-63).
Arquitetura RPC e Conexões
O sistema utiliza RPC (Remote Procedure Call) para comunicação entre os diferentes componentes distribuídos. A implementação é baseada na biblioteca rpcx com descoberta de serviços via etcd.
Descoberta de Serviços
O cliente RPC é inicializado com configurações de conexão ao etcd, incluindo timeout, credenciais e opções de persistência de conexão (connect/rpc.go:33-60). O sistema utiliza o padrão singleton para garantir uma única instância do cliente RPC.
Métodos RPC Disponíveis
O sistema implementa os seguintes métodos RPC principais:
| Método | Descrição |
|---|---|
| Connect | Estabelece conexão de um usuário |
| DisConnect | Encerra conexão de um usuário |
| PushSingleMsg | Envia mensagem para um usuário específico |
| PushRoomMsg | Envia mensagem para todos os usuários de uma sala |
| PushRoomCount | Atualiza contagem de usuários na sala |
Os métodos de push são implementados no servidor RPC para receber mensagens do serviço de lógica e distribuí-las para os clientes conectados (connect/rpc.go:110-140).
Servidores RPC
O sistema inicializa servidores RPC separados para WebSocket e TCP, permitindo que cada protocolo tenha seu próprio endpoint de comunicação (connect/rpc.go:81-105).
正在加载图表渲染器...
Verificação e Validação
Confirmação de Inicialização Bem-sucedida
Após a execução do script run.sh, o sistema exibe mensagens de confirmação indicando que os serviços foram iniciados corretamente (reload.sh:16-18):
all Done.
Beautiful ! Now, You can visit http://127.0.0.1:8080 , start the world.
Acesso à Interface Web
A interface web principal está disponível em http://127.0.0.1:8080 (ou o IP configurado durante a inicialização). Esta URL permite acessar a interface de chat do sistema.
Verificação de Serviços
Para verificar se os serviços estão rodando corretamente dentro do container:
bash1docker exec gochat-dev supervisorctl status
Este comando lista todos os processos gerenciados pelo Supervisor e seus respectivos status.
Problemas Comuns e Soluções
Erro de Validação de IP
Problema: O script exibe "ip address error !!! please check 'x.x.x.x' is ip address?"
Causa: O endereço IP fornecido não está no formato IPv4 válido.
Solução: Verificar se o IP está no formato correto (ex: 192.168.1.100) e se cada octeto está entre 0 e 255. A validação é realizada pela função valid_ip no script (run.sh:8-22).
Erro de Ambiente
Problema: O script exibe "Sorry, error! Please execute For example..."
Causa: O parâmetro de ambiente não é dev ou prod.
Solução: Utilizar apenas dev ou prod como primeiro parâmetro (run.sh:24-32):
bash1sh run.sh dev 127.0.0.1
Container Não Inicia
Problema: O container Docker falha ao iniciar.
Causas possíveis:
- Portas já em uso por outro serviço
- Docker não instalado ou sem permissões
- Imagem não disponível localmente
Solução:
- Verificar se as portas 8080, 7070, 7000-7002 estão disponíveis
- Executar com
sudose necessário - Construir a imagem localmente usando
make build TAG=1.18
Problemas de Conexão RPC
Problema: Serviços não conseguem se comunicar via RPC.
Causa: etcd não está acessível ou configurado incorretamente.
Solução: Verificar se o etcd está rodando dentro do container e se as configurações de descoberta estão corretas (connect/rpc.go:43-50). O sistema registra erros fatais se a inicialização do cliente RPC falhar.
Próximos Passos
Após a inicialização bem-sucedida do sistema, os seguintes tópicos podem ser explorados:
- Configuração de Produção: Ajustar as configurações do arquivo
docker/prod/supervisord.confpara ambiente de produção - Escalonamento: Adicionar múltiplas instâncias do serviço de conexão para suportar mais usuários
- Monitoramento: Configurar ferramentas de monitoramento para acompanhar métricas do sistema
- Personalização: Modificar a interface web localizada em
site/static/ - Integração: Utilizar a API HTTP (porta 7070) para integração com sistemas externos
O sistema está preparado para ambientes de desenvolvimento e pode ser adaptado para produção com as configurações apropriadas de segurança e escalabilidade.
