Zookeeper服务注册与发现原理浅析

 

Zookeeper服务注册与发现原理浅析

Zookeeper是一种分布式协调服务,在分布式应用中,主要用来实现分布式服务的注册与发现以及分布式锁。
Zookeeper实现服务注册与发现,主要应用的是Zookeeper的Znode数据模型和Watcher机制。

1. zookeeper数据模型

Zookeeper的数据模型,类似咱们数据结构中的树形结构,也有点类似我们操作系统的目录结构,数据模型结构图大致如下;
树由节点组成,Zookeeper的数据存储也是基于节点,数据模型中的每一个节点,Zookeeper称之为Znode。
但是与树的节点不同的是,Zookeeper中Znode的引用方式本质是路径引用,即是通过类似于目录文件访问的形式引用节点数据。

要在“汽车”节点下再创建一个“奥迪”节点,创建方式为:
create /汽车/奥迪
要获取“汽车”节点下的节点“宝马”的数据,获取方式为:
get /汽车/宝马

首先要了解zookeeper就是个分布式文件系统,每当一个服务提供者部署后都要将自己的服务注册到zookeeper的某一路径上: /{service}/{version}/{ip:port},
比如我们的HelloWorldService部署到两台机器237,238,端口一样,那么zookeeper上就会创建两条目录:分别为
机器1, /HelloWorldService/1.0.0/100.100.0.237:16888
机器1, /HelloWorldService/1.0.0/100.100.0.238:16888
基于目录的结构让每一个Znode节点拥有了唯一的路径,对不同的信息就做出了清晰的隔离,所以唯一的服务本质是不同机器上的唯一路径。

data : Znode存储的数据;
ACL:记录 Znode 的访问权限,即哪些人或哪些 IP 可以访问本节点;
stat:包含Znode的各种源数据,包括ZXID、版本号、时间戳、数据长度等;
child:子节点引用;

2. zookeeper的Watch机制

可以将Watch理解成是一个和指定Znode所绑定的监听器。
当这个Znode发生变化,也就是在这个Znode上进行了数据的写操作(create、delete、set),这个监听器监听到这些写操作之后会异步向请求Watch的客户端发送通知。
客户端调用getData方法向服务器获取某个Znode节点的数据时,设置watch为true。
服务端接到请求后,返回节点的数据,并在维护的WatchTable中插入被Watch的Znode路径以及Watcher(watch该Znode的客户端)。
当被Watch的Znode被删除或者更新之后,Zookeeper服务器会查找Watch Table,
找到在Znode上对应的所有Watcher,异步通知对应的客户端,并且删除Watch Table中对应的Key:Value。


3. zookeeper的步骤

服务注册:服务提供者(Provider)启动时,会向Zookeeper服务端注册中心注册服务信息,
即会在Zookeeper服务器上创建一个服务节点,并在节点上存储服务的相关数据(如服务提供者的服务信息,ip地址、端口、RPC协议等)。

服务发现:服务消费者(Consumer)启动时,会根据本身依赖的服务信息,向Zookeeper服务端获取注册的服务信息并设置Watch,获取到注册的服务信息之后将服务提供者信息缓存在本地,
调用服务时直接根据从Zookeeper注册中心获取到的服务注册信息调用服务,比如发现用户注册服务(user/register)并调用。

服务通知:当服务提供者因为某种原因宕机或不提供服务之后,Zookeeper服务注册中心的对应服务节点会被删除,
因为服务消费者在获取服务信息的时候在对应节点上设置了Watch,因此节点删除之后会触发对应的Watcher,
Zookeeper注册中心会异步向服务所关联的所有服务消费者发出节点删除的通知,服务消费者根据收到的通知更新缓存的服务列表。

4. zookeeper的心跳检测功能

zookeeper提供了“心跳检测”功能,它会定时向各个服务提供者发送一个请求(实际上建立的是一个 socket 长连接),
如果长期没有响应,服务中心就认为该服务提供者已经“挂了”,并将其剔除。
比如100.100.0.237这台机器如果宕机了,那么zookeeper上的路径就会只剩/HelloWorldService/1.0.0/100.100.0.238:16888。

服务消费者会去监听相应路径(/HelloWorldService/1.0.0),一旦路径上的数据有任务变化(增加或减少),zookeeper都会通知服务消费方。
服务提供者地址列表已经发生改变,从而进行更新。

 

posted @ 2020-07-31 13:43  Adamanter  阅读(919)  评论(0编辑  收藏  举报