Boas Práticas do net/http
Serviços HTTP sem framework que escalam e encerram de forma limpa.
Busque em todas as páginas da documentação
Serviços HTTP sem framework que escalam e encerram de forma limpa.
Aplique estas regras em revisões de código, modelos de serviço e testes de carga para que toda a superfície HTTP da biblioteca padrão se comporte de forma previsível sob tráfego de produção.
http.NewServeMux() em main, não http.DefaultServeMux. Previne colisões de rotas no lado da importação entre pacotes.ReadHeaderTimeout em todo http.Server de produção. Bloqueia stalls de cabeçalho estilo slowloris antes que os manipuladores sejam executados.IdleTimeout para recuperar conexões keep-alive. Para vazamentos de descritores em clientes inativos.http.MaxBytesReader. Rejeita payloads excessivos antes do trabalho de decodificação JSON.server.Shutdown(ctx). Implantações em rolo drenam o trabalho em andamento em vez de forçar o encerramento.terminationGracePeriodSeconds do Kubernetes./health barato sem middleware de autenticação. Balanceadores de carga precisam de um sinal de liveness rápido.WriteTimeout. SSE e long polls precisam de exceções explícitas de timeout.r.Context() como o primeiro argumento para todas as chamadas downstream bloqueantes. Honra desconexões do cliente e prazos do servidor.context.Canceled quando a resposta não puder ser enviada. Evita 500s enganosos após o cliente ter saído.Content-Type antes de escrever corpos JSON. Previne respostas ambíguas e clientes quebrados.WriteHeader uma vez; use http.Error para falhas. O primeiro Write trava o status em 200 se os cabeçalhos não foram enviados.r.Body em todos os caminhos. Necessário para reutilização de conexão keep-alive no lado do servidor.ResponseWriter para capturar o status para métricas e logs de acesso. O escritor padrão oculta o status final do middleware.http.Client por dependência upstream. Isola timeouts e ajuste de transporte por SLA.http.Get de manipuladores. http.DefaultClient não tem timeout e é global para o processo.defer resp.Body.Close() após client.Do. Corpos vazados esgotam pools de conexão.io.Copy(io.Discard, resp.Body) em caminhos não 2xx.MaxIdleConnsPerHost para upstreams quentes. Reduz o churn de TLS e TCP sob QPS constante.Transport personalizado em httputil.ReverseProxy. O transporte padrão é compartilhado e não ajustado para caminhos de gateway.ErrorHandler em proxies reversos. Mapeia timeouts de dial e cabeçalho para 502/504 consistentemente.tls.Config.MinVersion para TLS 1.2 ou superior. Documenta a postura de cifra aceitável para listeners externos.X-Forwarded-* apenas de balanceadores de carga conhecidos. Previne metadados de IP e esquema falsificados pelo cliente.Mux dedicado, ReadHeaderTimeout, shutdown gracioso, propagação de contexto e fechamento de corpo do cliente são bloqueadores dignos de CI.
Documente exceções no README do serviço.
Sim.
Frameworks envolvem net/http; timeouts, shutdown e higiene do cliente permanecem responsabilidades da aplicação.
A lista de verificação é a verificação de portão de implantação.
Esta lista é a política contínua da equipe para modelos e revisão.
Executar ListenAndServe com manipulador nulo em DefaultServeMux e sem timeouts.
Corrija com http.Server explícito e mux próprio.
Apenas se as necessidades de SLA e timeout corresponderem.
Upstreams diferentes devem receber clientes e transportes diferentes.
Envolva com http.MaxBytesReader por manipulador e retorne 413 em caso de overflow.
Registre violações de limite em nível de aviso.
Gere ou aceite X-Request-ID no middleware externo.
Propague para logs e wrappers RoundTripper de saída.
Elas cobrem os fundamentos do HTTP da biblioteca padrão.
Adicione WAF, limitação de taxa e autorização nas camadas de ingress ou de malha, conforme os modelos de ameaça exigirem.
Versões de Stack: Esta página foi escrita para Go 1.26.x (padrão GC Green Tea, go fix modernizers - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 18 de jul. de 2026