go服务不实现蓝绿部署,只负责暴露真实就绪状态、扛住中断信号、干净退出;切换由k8s service等外部系统完成,关键在于/readyz探测核心依赖并缓存结果、用srv.shutdown()优雅关闭、通过标签切换service selector实现秒级流量切换。

Go 服务本身不负责“切换流量”,它只负责告诉外部系统“我能不能收流量”——蓝绿部署的切换动作由 Kubernetes Service、Ingress、Nginx upstream 或 API 网关完成;Go 的任务是正确暴露就绪状态、扛住中断信号、干净退出。
/health 端点必须检查真实依赖,不能只返回 {"status": "up"}
很多团队把健康检查写成静态响应,结果新 Pod 还没连上数据库,K8s 就把流量导进来了,第一个请求就 panic。关键不是“进程起来了”,而是“它真能干活了”。
- 必须同步或异步探测核心依赖:
database.PingContext()、redis.Client.Ping()、下游 gRPC 的HealthCheck方法 - 避免在
/healthhandler 里做耗时操作;推荐启动时起 goroutine 定期探测,用本地变量缓存结果,/health只读缓存 - K8s 中若设
initialDelaySeconds: 5,但 DB 初始化要 8 秒,Pod 会被直接 kill;应配minReadySeconds: 10,并在 Go 启动后主动time.Sleep(2 * time.Second)再开放就绪 - 更健壮的做法:定义
var ready = make(chan struct{}),所有初始化完成后close(ready),/healthhandler 阻塞等待该 channel
HTTP Server 必须用 srv.Shutdown(),不能用 srv.Close()
收到 SIGTERM 后只调 srv.Close() 会立刻断开 listener,正在处理的请求被丢弃,gRPC 流中断,事务回滚不完整。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
- 监听
os.Interrupt和syscall.SIGTERM,收到信号后先调srv.Shutdown(),传入带超时的context.WithTimeout(ctx, 15*time.Second) - 后台 goroutine(如消息消费、定时指标上报)必须接收
context.Context,并在ctx.Done()时退出;不要用全局 bool flag 或无缓冲 channel 控制生命周期 - 别在 K8s
preStophook 里加sleep 15来“等关机”——这是掩盖 shutdown 逻辑缺失,不是解决方案
Kubernetes 中用 Service 标签切换实现秒级蓝绿
蓝绿不是靠重启 Pod 或改 Deployment,而是靠让同一个 Service 动态指向不同标签的 Pod。绿色环境上线后,只需改一行 selector,流量瞬间切走。
- 蓝环境 Pod 打标:
version: blue,对应 Service 的selector: {version: blue} - 绿环境部署后,验证通过,执行:
kubectl patch service myapp -p '{"spec":{"selector":{"version":"green"}}}' - 若出问题,立刻切回:
kubectl patch service myapp -p '{"spec":{"selector":{"version":"blue"}}}',回滚耗时通常 - 注意:两个环境的 Pod 必须在同一个 Namespace,且 Service 的
clusterIP不变,否则客户端 DNS 缓存或连接池可能失效
最容易被忽略的是数据库兼容性——蓝绿期间新旧版本共存,而数据库 schema 只能有一套。所有字段变更必须向前兼容:新增字段加默认值、删除字段先废弃再下线、索引变更需提前建好。否则绿色环境可能跑通,蓝色环境一查新字段就 panic。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










