1、注册中心概述
- 主要作用:动态加入、动态发现、动态调整、统一配置;
- 工作流程:
1)服务提供者启动时,会向注册中心写入自己的元数据信息,同时会订阅配置元数据信息;
2)消费者启动时,也会向注册中心写入自己的元数据信息,并订阅服务提供者、路由和配置元数据信息;
3)服务治理中心启动时,会同时订阅所有消费者、服务提供者、路由和配置元数据信息;
4)当有服务提供者离开或有新的服务提供者加入时,注册中心服务提供者目录会发生变化,变化信息会动态通知给消费者、服务治理中心;
5)当消费方发起服务调用时,会异步将调用、统计信息等上报给监控中心。
- ZooKeeper原理概述:Dubbo使用ZooKeeper作为注册中心时,只会创建持久节点和临时节点两种,对创建的顺序并没有要求。在服务分类节点下是具体的Dubbo服务URL,树的根节点是注册中心分组,下面有多个服务接口,服务接口下包含4类子目录,分别是provides、consumers、routers、configuators,这个路径是持久节点。
2、订阅/发布
- ZooKeeper的实现
1)发布的实现:调用了ZooKeeper的客户端库在注册中心上创建一个目录;
2)订阅的实现:订阅通常有pull和push两种方式,目前Dubbo采用的是第一次启动拉取方式,后续接收事件重新拉取数据。在服务暴露时,服务端会订阅configurators用于监听动态配置,在消费端启动时,消费端会订阅providers、routers和configurators这三个目录;
ZooKeeper注册中心采用的是“事件通知”+“客户端拉取”的方式,客户端在第一次连接上注册中心时,会获取对应目录下全量的数据。并在订阅的节点上注册一个watcher,客户端与注册中心之间保持TCP长连接,后续每个节点有任何数据变化的时候,注册中心会根据watcher的回调主动通知客户端,客户端接到通知后,会把对应节点下的全量数据都拉取过来。此外,服务治理中心除了订阅当前节点,还会订阅这个节点下的所有子节点。
ZooKeeper的每个节点都有一个版本号,当某个节点的数据发生变化(即事务操作)时,该节点对应的版本号就会发生变化,并触发watcher事件,推送数据给订阅方。
3、缓存机制
- 消费者或服务治理中心获取注册信息后会做本地缓存。内存中会有一份,保存在Properties对象里,磁盘上也会持久化一份文件,通过file对象引用。
- 缓存的加载:在服务初始化的时候,AbstractRegistry构造函数里会从本地磁盘文件中把持久化的注册数据读到Properties对象里,并加载到内存缓存中。Properties保存了所有服务提供者的URL,使用URL#serviceKey()作为key,提供者列表、路由规则列表、配置规则列表等作为value。
- 缓存的保存与更新:缓存的保存有同步和异步两种方式。异步会使用线程池异步保存,如果线程在执行过程中出现异常,则会再次调用线程池不断重试。