Zookeeper服务注册与发现机制原理

Zookeeper解决了分布式锁的各种机制,通过它,我们可以将重心放在业务逻辑上,而非并发控制上。

Zookeeper提供了两个功能:
分布式锁;
服务注册与发现。

Zookeeper的数据模型

/
动物
汽车
宝马
奔驰

Zookeeper的数据存储是基于节点的,称作Znode。Znode的引用方式非常类似于文件路径,例如:当要访问猫时,需要指定路径/动物/猫。Znode包含四个元素:

  1. data:数据信息,例如服务的IP地址、端口、名字;
  2. ACL:访问权限,即那些人或者那些IP可以访问本节点;
  3. stat:元数据,例如事务ID、版本号、时间戳、大小等;
  4. child:子节点引用。

每个Znode节点最多只能存储1MB数据。

Zookeeper的基本操作

创建节点:create
删除节点:delete
判断节点是否存在:exists
获取一个节点的数据:getData
设置一个节点的数据:setData
获取节点下的所有子节点:getChildren

其中,exists、getData、getChildren属于读操作,Zookeeper客户端在请求读操作的时候,可以选择是否设置Watch。

Zookeeper的事件通知机制

可以将Watch理解成是注册在特定Znode上的触发器,当这个Znode发生改变时,也就是调用了create、delete、setData等方法时,将会触发Znode上注册的对应的事件,请求Watch的看客户端会接收到异步通知。

getData:路径, true
Zookeeper客户端
Zookeeper服务器,含有一个WatchTable存放着要监控的数据

举个用户服务注册与发现的例子:

请求用户服务/uer/reg
用户
API网关,Zookeeper客户端,也需要注册到服务器才能接受异步通知
Zookeeper服务器,负责服务注册与发现
用户服务1:192.168.0.1
用户服务2:192.168.0.3
用户服务3:192.168.0.4
订单服务:192.168.0.2

当用户服务1宕机时,用户服务2将会注册到API网关,继续提供服务。原理就是:当用户通过API网关访问用户服务时,实际上只是拿到了用户服务的IP地址和端口号。而API网关中通过调用getData(/user/reg, watch)方法,监听服务的状态。若出现服务宕机,则Zookeeper服务器将会通过异步通知的方式告知API网关,用户服务1已经宕机,同时提供可供使用的其他用户服务的IP地址和端口号并记录下来,以便于下次有用户请求到来时使用。

猜你喜欢

转载自blog.csdn.net/zyxhangiian123456789/article/details/106810891