了解Zookeeper的我们都知道,Zookeeper是一种分布式协调服务,在分布式应用中,主要用来实现分布式服务的注册与发现以及分布式锁,本文我们简单介绍一下Zookeeper是如何实现服务的注册与发现的。
使用Zookeeper实现服务注册与发现,主要应用的是Zookeeper的Znode数据模型和Watcher机制,因此咱们先从Zookeeper的数据模型说起。
1、Zookeeper数据模型
Zookeeper的数据模型,有点类似咱们数据结构中的树形结构,也有点类似我们操作系统的目录结构,数据模型结构图大致如下;
树由节点组成,Zookeeper的数据存储也是基于节点,数据模型中的每一个节点,Zookeeper称之为Znode。但是与树的节点不同的是,Zookeeper中Znode的引用方式是路径引用,即是通过类似于目录文件访问的形式引用节点数据。
如上图要在“汽车”节点下再创建一个“奥迪”节点,创建方式为:
create /汽车/奥迪
1
要获取“汽车”节点下的节点“宝马”的数据,获取方式为:
get /汽车/宝马
1
基于目录的结构让每一个Znode节点拥有了唯一的路径,就像我们Java中的命名空间一样,对不同的信息就做出了清晰的隔离。
一个Znode里面主要包含了如下的一些数据:
data : Znode存储的数据;
ACL:记录 Znode 的访问权限,即哪些人或哪些 IP 可以访问本节点;
stat:包含Znode的各种源数据,包括ZXID、版本号、时间戳、数据长度等;
child:子节点引用;
2、Zookeeper的Watch机制
我们可以将Watch理解成是一个和指定Znode所绑定的监听器,当这个Znode发生变化,也就是在这个Znode上进行了数据的写操作(create、delete、setData),这个监听器监听到这些写操作之后会异步向请求Watch的客户端发送通知。
具体交互流程大致如下:
客户端调用getData方法向服务器获取某个Znode节点的数据时,设置watch为true。服务端接到请求后,返回节点的数据,并在维护的WatchTable中插入被Watch的Znode路径以及Watcher(watch该Znode的客户端);
当被Watch的Znode被删除或者更新之后,Zookeeper服务器会查找Watch Table,找到在Znode上对应的所有Watcher,异步通知对应的客户端,并且删除Watch Table中对应的Key:Value;
3、Zookeeper服务注册与发现流程浅析
Zookeeper的服务注册与发现,主要应用的是Zookeeper的Znode数据模型和Watcher机制,主要分为如下几个步骤:
服务注册:服务提供者(Provider)启动时,会向Zookeeper服务端注册服务信息,即会在Zookeeper服务器上创建一个服务节点,并在节点上存储服务的相关数据(如服务提供者的ip地址、端口等),比如注册一个用户注册服务(user/register):
服务发现:服务消费者(Consumer)启动时,会根据本身依赖的服务信息,向Zookeeper服务端获取注册的服务信息并设置Watch,获取到注册的服务信息之后将服务提供者信息缓存在本地,调用服务时直接根据从Zookeeper注册中心获取到的服务注册信息调用服务,比如发现用户注册服务(user/register)并调用。
服务通知:当服务提供者因为某种原因宕机或不提供服务之后,Zookeeper服务注册中心的对应服务节点会被删除,因为服务消费者在获取服务信息的时候在对应节点上设置了Watch,因此节点删除之后会触发对应的Watcher,Zookeeper注册中心会异步向服务所关联的所有服务消费者发出节点删除的通知,服务消费者根据收到的通知更新缓存的服务列表。
4、小结
本文我们简单介绍了Zookeeper实现服务注册与发现的简单原理,利用 Znode 和 Watcher,可以实现分布式服务的注册和发现。最著名的应用就是阿里的分布式 RPC 框架 Dubbo,希望对大家有帮助。
————————————————
版权声明:本文为CSDN博主「RonTech」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zyhlwzy/article/details/101847565