适用场景与边界
适合以下场景:
- 服务运行在 Kubernetes 中。
- 服务同时注册到 Nacos,调用方通过 Nacos 做服务发现。
- 发布或重启时偶发
Connection refused、Read timed out、5xx。 - 服务是 Spring Boot / Spring Cloud 微服务,支持优雅关闭。
不适合直接照搬的场景:
- 服务只通过 Kubernetes Service 调用,不接入 Nacos。
- 使用 Dubbo、Consul、Eureka 等其他注册中心,API 语义不同。
- 服务是长连接、消息消费或批处理任务,需要单独设计 drain 逻辑。
一、为什么 K8s 滚动更新还会请求失败
Kubernetes 终止 Pod 的流程大致是:
1. Pod 进入 Terminating 2. 从 Service Endpoints 中移除 3. 执行 preStop hook 4. 给容器主进程发送 SIGTERM 5. 等待 terminationGracePeriodSeconds 6. 超时后 SIGKILL 强杀如果服务只通过 Kubernetes Service 调用,这套机制基本够用。
但很多 Spring Cl