服务发现:为服务提供自动发现下游服务地址列表的能力。
1.注册与发现
服务注册中心
- 管理每个服务的地址列表(注册)
- 将某服务的地址告知调用者(发现)
2.可用地址管理
服务的创建、销毁、升级、扩容/缩容都会造成服务地址列表的变更,所以服务的每个实例在启动时都需要向服务注册中心注册自己的地址,并在退出时注销地址。
但是需要考虑异常情况。比如服务实例突然挂掉,还没有来得及向服务注册中心注销地址。
因此,服务注册中心需要有对已注册服务地址的探活能力。
两种思路:
- 主动探活,周期性向每个已注册服务发起探活请求
- 心跳探活,服务实例定时向服务注册中心发送一个心跳包
在某些常见下摘除地址的风险
- 摘除逻辑bug导致某服务地址被全部摘除
- 某服务有5个实例,每个实例可承受的最大QPS为1000,当前后台该服务的总QPS为3000,每个实例承受的QPS为600。此时三个实例被摘除,所有请求打到两个实例,每个实例承受1500QPS,导致被打垮
解决方案:
- 为服务注册中心摘除地址增加简单的保护策略,如果已摘除的地址数超过了某个阈值(如30%),那么服务注册中心就停止摘除地址,并向服务负责人报警以寻求人工处理,防止出现不可控的故障
3.地址变更推送
推送风暴问题:服务地址变更时,需要向很多订阅者推送数据。
解决方案:
- 建议推送的数据是增量数据,而不是全量地址列表
- 服务注册中心部署成多实例,多实例分摊推送
- 采用推拉结合方式,服务注册中心最多给N个调用者推送地址信息,其他节点周期性从服务注册中心拉取最新地址列表