zookeeper实现分布式锁

2 篇文章 1 订阅
2 篇文章 1 订阅

zookeeper实现分布式锁

zookeeper介绍:
一个分布式协调框架,他主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务,状态同步服务,集群管理,分布式应用配置项的管理等。

核心概念:

文件系统的数据结构**:

在这里插入图片描述
1,PERSISTENT-持久化目录节点

客户端与zookeeper断开连接后,该节点依旧存在
2,PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点

客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
3,EPHEMERAL-临时目录节点

客户端与zookeeper断开连接后,该节点被删除

4,EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点

客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

事件监听机制:

可以监听到文件的增删改查
节点里面存储配置文件
zookeeper就是可以监控自己文件的变化

使用场景

配置中心方式:

假设我们的程序是分布式部署在多台机器上,如果我们要改变程序的配置文件,需要逐台机器去修改,非常麻烦,现在把这些配置全部放到zookeeper上去,保存在 zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 zookeeper 的通知,然后从 zookeeper 获取新的配置信息应用到系统中。
可以把配置文件放在zookeeper
在这里插入图片描述

注册中心

自己理解:服务启动时,就把id加端口存到上面(怎么存呢:服务启动时,其实就是存了一个文件(临时节点))

在这里插入图片描述
在zookeeper中,进行服务注册,实际上就是在zookeeper中创建了一个znode节点,该节点存储了该服务的IP、端口、调用方式(协议、序列化方式)等。

服务提供者启动时,会将其服务名称,ip地址注册到配置中心。
服务消费者在第一次调用服务时,会通过注册中心找到相应的服务的IP地址列表,并缓存到本地,以供后续使用。当消费者调用服务时,不会再去请求注册中心,而是直接通过负载均衡算法从IP列表中取一个服务提供者的服务器调用服务。
当服务提供者的某台服务器宕机或下线时,相应的ip会从服务提供者IP列表中移除。同时,注册中心会将新的服务IP地址列表发送给服务消费者机器,缓存在消费者本机。
当某个服务的所有服务器都下线了,那么这个服务也就下线了。
同样,当服务提供者的某台服务器上线时,注册中心会将新的服务IP地址列表发送给服务消费者机器,缓存在消费者本机。
服务提供方可以根据服务消费者的数量来作为服务下线的依据。

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

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

更为重要的是zookeeper 与生俱来的容错容灾能力(比如leader选举),可以确保服务注册表的高可用性。

使用 zookeeper 作为注册中心时,客户端订阅服务时会向 zookeeper 注册自身;主要是方便对调用方进行统计、管理。但订阅时是否注册 client 不是必要行为,和不同的注册中心实现有关,例如使用 consul 时便没有注册。

分布式锁

zookeeper也可以做分布式锁,看下图
在这里插入图片描述
如果之前有人创建了,你就不能创建了(加锁)
在这里插入图片描述
因为zookeeper是单线程的,文件创建之后就不能再次创建了,其他线程只能等待锁的释放,锁释放也就是说删除文件,问题来了
,一旦释放锁,如果是高并发的情况下,就会有很多线程监视锁,造成效率降低
在这里插入图片描述
羊群效应
于是我们就用入下的原理监视,有序号的持久化节点,一个线程监视一个,
最小的监视锁,大的监视小的,相当于一个队列。

在这里插入图片描述
其实这就是zookeeper分布式锁的原理了,如下:
在这里插入图片描述
代码实现:
这里我们用一个基于zookeeper实现的框架Qurator
导入依赖
在这里插入图片描述
启动类
在这里插入图片描述
注入
在这里插入图片描述
然后业务层完成代码
三行代码解决分布式锁的问题
该API中还有很多的重载方法,可以给锁设置时间,时间到了,不管有没有归还锁,该锁就会到期释放。。。有兴趣的同学可以仔细去研究研究
在这里插入图片描述

至此,我们的分布式锁就完成了。
关于zookeeper的配置以及使用,这里就不介绍了,自己自行百度哦

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值