面试题答案
一键面试1. 服务动态注册与注销
- 注册中心选型:选用如 Consul、Etcd 或 Zookeeper 这类高可用的分布式注册中心。以 Consul 为例,它提供了 HTTP 和 DNS 两种接口用于服务注册与发现,同时具备健康检查功能。
- 动态注册:每个微服务实例启动时,通过调用注册中心 API,将自身的服务信息(如服务名称、IP 地址、端口、元数据等)注册到注册中心。例如,使用 Consul 的 HTTP API 发送 POST 请求到
/v1/agent/service/register
端点进行注册。 - 动态注销:当微服务实例停止运行时,主动向注册中心发送注销请求。如在 Consul 中,通过发送 DELETE 请求到
/v1/agent/service/deregister/<service - id>
端点。若实例异常崩溃,注册中心的健康检查机制(如基于心跳的检测)能够及时发现并将其从服务列表中移除。
2. 负载均衡策略的实时调整
- 负载均衡器选型:可以采用如 Nginx、HAProxy 等作为负载均衡器,或者在客户端集成负载均衡逻辑,如 Netflix Ribbon。
- 实时监控:通过 Prometheus、Grafana 等工具实时监控每个微服务实例的负载指标,如 CPU 使用率、内存使用率、请求响应时间、每秒请求数等。
- 动态策略调整:
- 基于负载的策略:如果某个实例的 CPU 使用率超过设定阈值(如 80%),负载均衡器减少分配到该实例的流量。可以采用加权轮询策略,根据实时负载动态调整每个实例的权重。例如,对于负载较低的实例给予较高权重,负载高的实例给予较低权重。
- 基于流量的策略:当检测到服务流量动态变化频繁时,根据不同时间段的流量模式进行负载均衡策略调整。如在流量高峰期,采用一致性哈希策略来提高缓存命中率,减少后端实例的压力;在流量低谷期,切换为简单轮询策略以均衡负载。
3. 应对网络分区等异常情况
- 分区检测:注册中心和负载均衡器之间通过心跳机制相互检测网络连接状态。例如,Consul 中各个节点之间通过 gossip 协议交换状态信息,能够快速检测到网络分区的发生。
- 本地缓存:负载均衡器在本地缓存一份服务实例列表,当发生网络分区导致与注册中心短暂失联时,仍能基于本地缓存的实例列表继续提供负载均衡服务。但同时开启定时重试机制,尝试重新连接注册中心获取最新的服务列表。
- 分区恢复:一旦网络分区恢复,负载均衡器立即与注册中心同步最新的服务实例信息,重新调整负载均衡策略,确保系统恢复到正常的运行状态。同时,对在网络分区期间可能出现的请求积压、数据不一致等问题进行相应的处理,如重试积压请求、进行数据一致性修复等。