注册中心存储的服务信息一般包含三部分内容:分组、服务名以及节点信息,节点信息又包括节点地址和节点其他信息。那么注册中心是如何工作的呢?
1. 如何注册节点
知道了服务的节点信息如何存储之后,服务注册流程是怎么样的呢?可以用下面这张流程图来描述。
服务注册流程主要有下面几个步骤:
- 首先查看要注册的节点是否在白名单内?如果不在就抛出异常,在的话继续下一步。
- 其次要查看注册的 Cluster(服务的接口名)是否存在?如果不存在就抛出异常,存在的话继续下一步。
- 然后要检查 Service(服务的分组)是否存在?如果不存在则抛出异常,存在的话继续下一步。
- 最后将节点信息添加到对应的 Service 和 Cluster 下面的存储中。
2. 如何反注册
来看下服务提供者节点反注册的流程,可以用下面这张流程图来描述。
节点反注册流程主要包含下面几个步骤:
- 查看 Service(服务的分组)是否存在,不存在就抛出异常,存在就继续下一步。
- 查看 Cluster(服务的接口名)是否存在,不存在就抛出异常,存在就继续下一步。
- 删除存储中 Service 和 Cluster 下对应的节点信息。
- 更新 Cluster 的 sign 值。
3. 如何查询节点信息
关于服务消费者是如何从注册中心查询服务提供者的节点信息,可以用下面这张流程图来描述。
服务消费者查询节点信息主要分为下面几个步骤:
- 首先从 localcache(本机内存)中查找,如果没有就继续下一步。这里为什么服务消费者要把服务信息存在本机内存呢?主要是因为服务节点信息并不总是时刻变化的,并不需要每一次服务调用都要调用注册中心获取最新的节点信息,只需要在本机内存中保留最新的服务提供者的节点列表就可以。
- 接着从 snapshot(本地快照)中查找,如果没有就继续下一步。这里为什么服务消费者要在本地磁盘存储一份服务提供者的节点信息的快照呢?这是因为服务消费者同注册中心之间的网络不一定总是可靠的,服务消费者重启时,本机内存中还不存在服务提供者的节点信息,如果此时调用注册中心失败,那么服务消费者就拿不到服务节点信息了,也就没法调用了。本地快照就是为了防止这种情况的发生,即使服务消费者重启后请求注册中心失败,依然可以读取本地快照,获取到服务节点信息。
4. 如何订阅服务变更
服务消费者如何订阅服务提供者的变更信息呢?可以用下面这张流程图来描述。
主要分为下面几个步骤:
- 服务消费者从注册中心获取了服务的信息后,就订阅了服务的变化,会在本地保留 Cluster 的 sign 值。
- 服务消费者每隔一段时间,调用 getSign() 函数,从注册中心获取服务端该 Cluster 的 sign 值,并与本地保留的 sign 值做对比,如果不一致,就从服务端拉取新的节点信息,并更新 localcache 和 snapshot。
以上就是服务注册和反注册、服务查询和服务订阅变更的基本流程。