Go微服务需显式处理三件事:配置http.Server超时参数、提供裸奔健康检查端点、全程透传context;服务发现须环境变量驱动并设注销超时。
Go 语言写微服务,核心不在于“能不能”,而在于“怎么避免掉进默认行为的坑里”。用 net/http 能跑起来,但离可用的微服务差三件事:服务发现、健康检查、请求上下文透传——这些不是可选项,是上线前必须显式处理的点。
用 gin 快速启动但别跳过 http.Server 配置
很多人直接 gin.Default().Run(":8080") 就开干,结果压测时连接堆积、超时混乱。根本原因是没控制底层 http.Server 的超时和连接生命周期。
-
ReadTimeout和WriteTimeout必须设(比如 5 秒),否则慢客户端会拖垮整个服务 -
IdleTimeout推荐设为 30–60 秒,防止长连接空耗资源 - 别用
gin.Run(),改用http.Server显式启动,方便加Shutdown逻辑
示例关键片段:
srv := &http.Server{
Addr: ":8080",
Handler: router,
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
IdleTimeout: 30 * time.Second,
}
go func() {
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
log.Fatal(err)
}
}()
// 退出时调用 srv.Shutdown(ctx)
健康检查端点必须独立于业务路由且不走中间件
Kubernetes 或 Consul 做存活探针时,如果健康检查路径被 JWT 鉴权、日志中间件或链路追踪拦截,就会反复失败重启。它必须是“裸奔”的、零依赖的响应。
- 路径建议固定为
/healthz,返回200 OK+ 纯文本ok - 不要挂任何中间件(包括 recovery、logger)
- 避免读数据库或调外部服务;真要校验依赖,用缓存结果 + 异步刷新
在 gin 中正确写法: