Mejores prácticas de net/http
Servicios HTTP sin framework que escalan y se apagan limpiamente.
Busca en todas las páginas de la documentación
Servicios HTTP sin framework que escalan y se apagan limpiamente.
Aplica estas reglas en la revisión de código, plantillas de servicios y pruebas de carga para que cada superficie de stdlib HTTP se comporte de manera predecible bajo tráfico de producción.
http.NewServeMux() en main, no http.DefaultServeMux. Previene colisiones de rutas por importación entre paquetes.ReadHeaderTimeout en cada http.Server de producción. Bloquea ataques de lentitud de cabeceras estilo slowloris antes de que se ejecuten los manejadores.IdleTimeout para recuperar conexiones keep-alive. Detiene fugas de descriptores en clientes inactivos.http.MaxBytesReader. Rechaza cargas útiles sobredimensionadas antes del trabajo de decodificación JSON.server.Shutdown(ctx). Los despliegues continuos vacían el trabajo en curso en lugar de forzar el cierre.terminationGracePeriodSeconds de Kubernetes./health barato sin middleware de autenticación. Los balanceadores de carga necesitan una señal de liveness rápida.WriteTimeout. SSE y long polls necesitan excepciones explícitas de tiempo de espera.r.Context() como primer argumento a todas las llamadas bloqueantes posteriores. Honra la desconexión del cliente y los plazos del servidor.context.Canceled cuando la respuesta no se puede enviar. Evita 500s engañosos después de que el cliente se ha ido.Content-Type antes de escribir cuerpos JSON. Previene respuestas ambiguas y clientes rotos.WriteHeader una vez; usa http.Error para fallos. La primera Write bloquea el estado a 200 si las cabeceras no se enviaron.r.Body en cada ruta. Requerido para la reutilización de conexiones keep-alive en el lado del servidor.ResponseWriter para capturar el estado para métricas y registros de acceso. El escritor predeterminado oculta el estado final del middleware.http.Client por dependencia externa. Aísla los tiempos de espera y la sintonización del transporte por SLA.http.Get desde manejadores. http.DefaultClient no tiene tiempo de espera y es global para el proceso.defer resp.Body.Close() después de client.Do. Los cuerpos filtrados agotan los pools de conexiones.io.Copy(io.Discard, resp.Body) en rutas no 2xx.MaxIdleConnsPerHost para servicios externos activos. Reduce el cambio de TLS y TCP bajo QPS constante.Transport personalizado en httputil.ReverseProxy. El transporte predeterminado se comparte y no está sintonizado para rutas de gateway.ErrorHandler en proxies inversos. Mapea los tiempos de espera de conexión y cabecera a 502/504 de manera consistente.tls.Config.MinVersion a TLS 1.2 o superior. Documenta la postura de cifrado aceptable para oyentes externos.X-Forwarded-* solo de balanceadores de carga conocidos. Previene metadatos de IP y esquema falsificados por el cliente.El mux dedicado, ReadHeaderTimeout, el apagado elegante, la propagación del contexto y el cierre del cuerpo del cliente son bloqueadores dignos de CI.
Documenta las excepciones en el README del servicio.
Sí.
Los frameworks envuelven net/http; los tiempos de espera, el apagado y la higiene del cliente siguen siendo responsabilidades de la aplicación.
La lista de verificación es la verificación de la puerta de despliegue.
Esta lista es una política de equipo continua para plantillas y revisiones.
Ejecutar ListenAndServe con un manejador nulo en DefaultServeMux y sin tiempos de espera.
Corrige con http.Server explícito y un mux propio.
Solo si las necesidades de SLA y tiempo de espera coinciden.
Diferentes servicios externos deberían obtener diferentes clientes y transportes.
Envuelve con http.MaxBytesReader por manejador y retorna 413 en caso de desbordamiento.
Registra las violaciones de límites a nivel de advertencia.
Genera o acepta X-Request-ID en el middleware exterior.
Propaga a los registros y a los envoltorios RoundTripper de salida.
Cubren los fundamentos de stdlib HTTP.
Añade WAF, limitación de tasa y autorización en las capas de ingress o mesh según lo requieran los modelos de amenaza.
Versiones de la pila: Esta página fue escrita para Go 1.26.x (predeterminado GC Green Tea,
go fix modernizers- verifica el parche en la compilación), chi (última versión - verifica en la compilación), gin (última versión - verifica en la compilación), echo (última versión - verifica en la compilación), google.golang.org/grpc (última versión - verifica en la compilación), sigs.k8s.io/controller-runtime (última versión - verifica en la compilación), kubebuilder (última versión - verifica en la compilación), tinygo (última versión - verifica los objetivos de la placa en la compilación), wazero (última versión - verifica en la compilación) y golangci-lint (última versión - verifica el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 18 jul 2026