1. 什么是注册中心
注册中心是服务实例信息的存储仓库,也是服务提供者和服务消费者进行交互的桥梁。它主要提供了服务注册和服务发现这两大核心功能。
我我们看这张服务注册流程图就知道,对于注册中心而言,服务的提供者和消费者都相当于是它的客户端,所以都内嵌了专门与注册中心实现交互的客户端组件。
针对服务的提供者而言,每当服务启动,就会通过这个注册中心的客户端组件,自动将自己注册到注册中心,这就是服务注册过程,有时候也叫服务发布过程。
而对于服务消费者来说,执行的是订阅操作而不是注册操作,也就是说它会对那些自己感兴趣的服务进行订阅,通过订阅操作就能从注册中心中,自动获取那些已经注册的服务提供者信息,这就是服务发现过程。
从图中我们还能发现服务消费者与提供者之间的一个明显差异点,也就是消费者持有一个本地缓存,保存着那些已经获取到的服务提供者的实例信息。
这个本地缓存有两方面的作用。一方面,服务消费者可以先通过查询本地缓存,来快速获取目标服务的实例信息,从而提高服务发现的效率;另一方面,如果注册中心出现不可用或者网络访问出现异常,那么消费者就无法从注册中心中获取服务实例信息,这时候基于本地缓存,也同样可以实现对已注册服务的正常调用。
2.注册信息变更通知机制
一旦服务的运行时状态发生了变更,我们又该如何有效获取这些变更信息呢?
答案:引入变更通知机制
变更通知机制是实现注册中心的一大难点,因为这个过程涉及服务提供者、消费者和注册中心三者之间的数据同步问题,想要在分布式环境下实现数据同步是有挑战的。下面我就来给你介绍下两种主流的实现方法,一种是监听机制,一种是轮询机制。
2.1. 监听机制
从架构设计来讲,状态变更管理可以采用注册中心本身具有的发布 – 订阅模式。
因此也就诞生了服务监听机制。它可以用来确保服务消费者能够实时监控服务的更新状态,是一种被动接收变更通知的实现方案,一般是采用监听器和回调机制。
我们看服务监听机制图,服务消费者可以对这些具体的服务实例节点添加监听器,当这些节点发生变化时,例如服务 B 的第一个实例变得不可用、服务 C 的第一个实例地址发生变更,或者是服务 D 新增了一个实例 3,那么注册中心就能触发监听器中的回调函数,确保更新通知到每一个服务消费者。
所以很显然,使用监听和通知机制具备实时的数据同步效果。
2.2. 轮询机制
采用轮询机制。这是一种主动拉取策略,即服务的消费者会定期调用注册中心提供的服务获取接口,以此获取最新的服务列表,并更新本地缓存。参考 Eruka,Nacos