跳到主要内容

服务注册、发现与健康检查

服务发现负责把稳定的服务名解析为一组当前可用的实例地址。实例会扩缩容、重启和迁移,因此调用方需要持续接收变化,同时在注册中心短暂不可用时保留可工作的本地视图。

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 后接流量,下线时先摘流和排空连接,再退出;客户端应用增量时校验版本,发现缺口重新拉取完整快照。