----------------------------------------------------------------------------------------------------------------------------------------------------------
笔记中提供了大量的代码示例,需要说明的是,大部分代码示例都是本人所敲代码并进行测试,不足之处,请大家指正~
本博客中所有言论仅代表博主本人观点,若有疑惑或者需要本系列分享中的资料工具,敬请联系 qingqing_crawl@163.com
GitHub:https://github.com/QingqingQi
-----------------------------------------------------------------------------------------------------------------------------------------------------------
前言:ZooKeeper 是提供少量数据存储和管理的分布式协调服务。适合存储状态管理信息,可以进行数据的读写,同步,提供对数据节点的监听功能。利用 ZooKeeper 可以实现很多功能,比如:Hadoop2.0,使用 Zookeeper 的事件处理确保整个集群只有一个活跃的 NameNode,存储配置信息等;可以利用 ZooKeeper 感知集群中哪台主机宕机或者下线等等。今天介绍另一个常用的功能,利用 Zookeeper 实现分布式共享锁。
一、简要介绍利用 Zookeeper 实现分布式共享锁,可以做到一次只有指定个数的客户端访问服务器的某些资源。
二、实现步骤利用 Zookeeper 实现分布式共享锁的步骤大致可以分为以下几步:
1. 客户端上线即向 Zookeeper 注册,创建一把锁
2. 判断是否只有一个客户端工作,若只有一个客户端工作,此客户端可以处理业务
3. 获取父节点下注册的所有锁,通过判断自己是否是号码最小的那一把锁,若是则可以处理业务,否则等待
值的注意的是,在某一客户端获取到锁处理完业务后,必须释放锁
三、实现代码1. 新建一个 DistributedLock 类
private ZooKeeper zkClient = null; //连接字符串 private static final String connectString = "zookeeper01:2181,zookeeper02:2181,zookeeper03:2181"; //超时时间 private static final int sessionTimeout = 2000; //父节点 private static final String parentNode = "/locks"; //记录自己创建子节点的路径 private volatile String thisPath; public static void main(String[] args) throws Exception { //1.获取 ZooKeeper 的客户端连接 DistributedLock distLock = new DistributedLock(); distLock.getZKClient(); //2.注册一把锁 distLock.regiestLock(); //3.监听父节点,判断是否只有自己在线 distLock.watchParent(); }