分布式利器Zookeeper(三)前言Zookeeper分布式锁的代码实现zkclientCurator

前言

《分布式利器Zookeeper(一)》

《分布式利器Zookeeper(二):分布式锁》

本篇博客是分布式利器Zookeeper系列的最后一篇,涉及的话题是:Zookeeper分布式锁的代码实现、zkclient的使用、Curator框架介绍等。

Zookeeper分布式锁的代码实现

在上一篇博客中,从思路上已经分析了Zookeeper如何帮助我们实现分布式锁,我们直接来看代码:

分布式客户端

获取分布式锁的方法lock:初始化ZK

获取分布式锁的方法lock:创建临时节点与判断最小路径

main测试

运行结果

需要注意的是,即便监控到了比自己序号小的节点的删除Watcher,也需要再次确认下! 从结果上,看的很清楚,各个线程有序获得锁。

zkclient

zkclient是在zookeeper原生API基础上做了一点封装,简化了ZK的复杂性。

来看代码:

基于zkclient的增删改查

我们观察下zkclient的使用,和以前基于zookeeper的原生API有哪些区别呢? 第一,原生API需要我们利用CountDownLatch来确保ZK的初始化,现在zkclient帮助我们屏蔽掉了这个细节 第二,原生API是不可以递归创建节点的,而zkclient可以帮助我们递归创建不存在的父节点,还可以递归删除 第三,支持序列化操作,上面的代码你大概可以看出一些端倪,就是我们从操作byte[]到操作String了。(事实上,在zkclient中你只需要实现ZkSerializer接口,就可以完成Object到byte[]的转换,虽然如此,但是实际开发中,利用JSON也挺好的!) 第四,还有最重要的一点就是,zkclient将对节点的操作和对节点的监控分离开了,在原生API中2者是耦合在一起的!从思想上来看,便于理解;从代码上来看,也简洁些(如果写在一起,头都大了);更加方便的是,zkclient替我们完成了重复watch的功能!

watch订阅机制

看到没有,是不是有点像MQ的订阅机制,非常好用!【但是也有点不太完美,子节点的数据变更为什么没有监控呢,这有点不符合人性啊!还好有Curator...】 但是呢,我们知道ZK是有很多应用场景的,比如实现分布式锁,zkclient并没有替我们进行封装,但是Curator框架可以帮助我们做到!

Curator

为了更好实现Java操作Zookeeper服务器,后来出现Curator框架,功能非常强大,目前已经是Apache的顶级项目,有很多丰富的特性,比如session超时重连,主从选举,分布式计数器,分布式锁等,非常有利于Zookeeper复杂场景下的开发。

POM文件:

pom.xml

增删改查:

curator基本的API操作

Curator框架使用链式编程风格,易读性很强! 注意,不论是原生的API,还是基于zkclient的API,都是提供的connectTimeout,而Curator提供了sessionTimeout,功能很强大。

异步回调

无论是原生的API,还是zkclient,都是支持异步回调的,但是Curator框架在支持异步回调的同时,增加了线程池供我们优化!

NodeCacheListener

PathChildrenCacheListener

对于Curator而言,为了解决重复Watch的问题,它引入了一种全新的思想:Cache与ZK SERVER比对的机制。不论是原生的API,还是基于ZKCLIENT的,其实它们解决思路都是重复注册! 思路决定出路!Curator通过事件驱动将客户端的Cache与ZK SERVER的数据比对,就自然而然的解决了重复WATCH的功能!为什么Curator能成为Apache的顶级项目呢,我想大概就是因为它的与众不同的设计思想! 在Curator中,有2种Listener,一个是监控节点的NodeCacheListener,一个是监控子节点的PathChildrenCacheListener。PathChildernCacheListener可以监控子节点的新增、修改、删除,非常好用!

好了,到这里,准备结束这个系列了(其实还有一些内容没有涉及,比如Curator的分布式锁、分布式barrier的介绍等,以后有空再分享,暂且保留下,哈哈)!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玄魂工作室

Python源码学习笔记(一)编译与安装

--------------------------------------------------------------------------------...

1152
来自专栏微信公众号:Java团长

Dubbo入门——搭建一个最简单的Demo框架

在这里插播一条关于RPC的简介: RPC(Remote Procedure Call Protocol):远程过程调用: 两台服务器A、B,分别部署不同的应...

1152
来自专栏我就是马云飞

JJEvent 一个可靠的Android端数据埋点SDK

注:代码已经经过线上项目验证, 横向Google统计对比,统计数据无丢失,性能稳定.

4124
来自专栏程序猿DD

云原生应用的12要素

简介 如今,软件通常会作为一种服务来交付,它们被称为网络应用程序,或软件即服务(SaaS)。12-Factor 为构建如下的 SaaS 应用提供了方法论: 使用...

47710
来自专栏向治洪

Freeline--Android平台上的秒级编译方案

Freeline 技术揭秘 Freeline是什么? Freeline是蚂蚁金服旗下一站式理财平台蚂蚁聚宝团队15年10月在Android平台上的量身定做的一个...

2678
来自专栏Debian社区

aptitude 与 apt-get 的区别与联系

起初GNU/Linux系统中只有.tar.gz。用户 必须自己编译他们想使用的每一个程序。在Debian出现后,人们认为有必要在系统 中添加一种机 制用来管理 ...

2442
来自专栏编程

Android入门教程(一)

有趣有内涵的文章第一时间送达! ? Android是什么? Android是基于Linux开发性内核的操作系统,该平台由操作系统,中间件,用户界面和应用软件组成...

2139
来自专栏码神联盟

灵丹妙药 | 关于缓存,你必须要知道的

这两天小编一直在总结缓存的要点,也同时参考了一些文档,仅此奉上,以供参考。 缓存是必备技能 身为后端开发的开发人员,缓存是必备技能。不需要花费太多的精力就能显著...

3577
来自专栏魏艾斯博客www.vpsss.net

新购腾讯云主机安全组未放行导致网站、数据库无法访问

5772
来自专栏我和PYTHON有个约会

莱茨狗-Go语言第二弹:环境搭建

两种环境包,根据需要下载 如果你是windows江湖新手,那么下载msi安装包吧,界面图形化鼠标傻瓜式操作,全程安装辅助基本没有问题!

691

扫码关注云+社区

领取腾讯云代金券