服务注册、发现与健康检查
服务发现负责把稳定的服务名解析为一组当前可用的实例地址。实例会扩缩容、重启和迁移,因此调用方需要持续接收变化,同时在注册中心短暂不可用时保留可工作的本地视图。
1. 注册信息描述实例位置和属性
服务实例启动后,可以主动向注册中心登记地址、端口、版本、区域和路由标签,也可以由部署平台根据期望状态生成服务端点。
注册信息必须有生命周期。使用租约或心跳时,实例需要周期续约,超时未续约才被标记为不可用;部署平台托管时,则由控制器根据 Pod 和 Service 状态维护 EndpointSlice。
注册地址要让调用方实际可达。容器内部地址、NAT 后地址或错误网卡常会出现“注册成功但无法调用”。
2. 客户端发现和服务端发现分配不同责任
客户端发现让调用方直接获取实例列表,并在本地做负载均衡。它少一次代理转发,但每种语言的客户端都要实现订阅、健康、负载均衡和重试。
服务端发现让调用方访问稳定入口,由负载均衡器、网关或 sidecar 选择后端实例。治理逻辑更集中,但代理成为额外容量与故障点。
两种方式都可能使用同一个注册数据源。区别在于谁消费实例表、谁执行路由,而不是有没有注册中心。
3. 健康检查要区分存活与可接流量
- Liveness 判断进程是否陷入无法自行恢复的状态,失败可能触发重启。
- Readiness 判断实例当前能否接收请求,失败应先从流量端点移除。
- Startup 给慢启动应用留出初始化时间,在成功前不执行其他探针。
数据库短暂超时通常不应直接导致 liveness 失败,否则所有实例可能同时重启,进一步扩大故障。readiness 也不应依赖过多非关键下游,避免一个共享依赖让全部服务同时摘流。
4. 主动检查和被动观测需要组合
注册中心或负载均衡器可以主动探测健康接口;调用方也可以根据连接失败、超时和异常响应做被动摘除。
主动检查有固定间隔,发现故障存在延迟;被动判断更快,但一次偶发超时不代表实例失效。应设置连续失败阈值、最短摘除时间和恢复探测,并限制最多摘除比例,避免高负载时把全部实例判为异常。
5. 注册中心断连时保留最后可用实例表
注册中心属于治理控制面,已有请求转发不应每次同步查询它。客户端应在本地缓存带版本的实例快照,订阅变更并原子替换。
短暂断连时,直接清空本地列表会让仍然健康的数据面立即不可用。更合理的默认行为是继续使用最后一次成功快照,同时:
- 标记数据年龄并告警。
- 对实际调用失败的实例临时降权或摘除。
- 定期重连并获取完整快照校正增量。
- 超过业务允许的陈旧时间后按风险降级。
保留旧列表可能继续访问已经下线的实例,所以连接超时、失败重试和被动健康仍然必要。
6. 实例上下线需要排空连接
新实例应先完成启动、配置加载和必要预热,再进入 readiness;旧实例则应先停止接收新请求,等待在途请求和长连接排空,再退出进程。
注册变化、负载均衡刷新和客户端缓存都有传播延迟。仅在进程退出前调用一次注销,不能保证所有调用方立即停止访问。部署流程要预留 termination grace period,并让服务能够拒绝或安全结束过期请求。
7. 用版本化快照处理乱序更新
订阅连接重建、网络重传和控制器并发可能让增量事件乱序。客户端应根据版本或资源版本应用更新,检测缺口时重新拉取完整快照。
实例列表切换应一次性生效,不能先删旧列表再逐个加入新实例,否则短窗口内会出现空列表或不完整路由。更新失败时继续使用最后一份通过校验的快照。
8. 常见问题
8.1 心跳正常是否表示业务一定可用
不表示。进程可以继续发送心跳,但业务线程池、连接池或关键路径已经耗尽。健康检查应覆盖实例是否能够完成轻量核心操作,同时结合真实请求的错误率和延迟。
8.2 DNS 是否也算服务发现
算。DNS 用稳定名称返回地址,是常见服务端点发现方式。调用方仍要正确处理 TTL、连接复用和地址变化;已经建立的长连接不会因为 DNS 记录更新自动迁移。
9. 面试题
9.1 注册中心短暂不可用时,客户端应该如何处理实例列表
出现公司:美团、阿里巴巴
考察重点
- 控制面更新与数据面转发的分离。
- 本地快照、版本和被动健康检查。
- 实例摘流、连接排空与陈旧数据边界。
相关内容:第 3 节“健康检查要区分存活与可接流量”至第 7 节“用版本化快照处理乱序更新”。
参考回答
调用不应在每次请求时同步依赖注册中心。客户端应缓存带版本的最后可用实例快照,通过订阅或轮询更新;注册中心短暂断连时继续路由,并根据真实调用失败临时摘除异常实例,同时记录快照年龄并重连校正。直接清空列表会把控制面故障立即扩散到数据面。
保留旧列表也可能访问已经下线的实例,所以还需要连接超时、有限重试和被动健康。实例发布时先 readiness 后接流量,下线时先摘流和排空连接,再退出;客户端应用增量时校验版本,发现缺口重新拉取完整快照。