# zookeeper-demo **Repository Path**: iispeily/zookeeper-demo ## Basic Information - **Project Name**: zookeeper-demo - **Description**: Apache Zookeeper + Apache Curator Demo - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-08-09 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### Zookeeper学习应用 ``` 分布式配置中心 分布式注册中心 分布式锁(Redis也OK) ``` 参考博文:@https://my.oschina.net/xianggao/blog/531204 #### Zookeeper是什么 官方文档上这么解释zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。 上面的解释有点抽象,简单来说zookeeper=文件系统+监听通知机制。 >1、 文件系统 Zookeeper维护一个类似文件系统的数据结构: ![](https://img-blog.csdn.net/201807121434154?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2phdmFfNjY2NjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)] 每个子目录项如 NameService 都被称作为 znode(目录节点),和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。 有四种类型的znode: ``` PERSISTENT-持久化目录节点 客户端与zookeeper断开连接后,该节点依旧存在 PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点 客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号 EPHEMERAL-临时目录节点 客户端与zookeeper断开连接后,该节点被删除 EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点 客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号 ``` >2、 监听通知机制 客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。 就这么简单,下面我们看看Zookeeper能做点什么呢? ####Zookeeper能做什么 zookeeper功能非常强大,可以实现诸如分布式应用配置管理、统一命名服务、状态同步服务、集群管理等功能,我们这里拿比较简单的分布式应用配置管理为例来说明。 假设我们的程序是分布式部署在多台机器上,如果我们要改变程序的配置文件,需要逐台机器去修改,非常麻烦,现在把这些配置全部放到zookeeper上去,保存在 zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 zookeeper 的通知,然后从 zookeeper 获取新的配置信息应用到系统中。 如上,你大致应该了解zookeeper是个什么东西,大概能做些什么了,我们马上来学习下zookeeper的安装及使用,并开发一个小程序来实现zookeeper这个分布式配置管理的功能。 ####ZK使用 参考博文:@https://my.oschina.net/xianggao/blog/531204 ### 基于Apache Curator框架的ZooKeeper基本用法详解 ####一 简介 Apache Curator是一个比较完善的ZooKeeper客户端框架,通过封装的一套高级API 简化了ZooKeeper的操作。 通过查看官方文档,可以发现Curator主要解决了三类问题: ``` 封装ZooKeeper client与ZooKeeper server之间的连接处理 提供了一套Fluent风格的操作API 提供ZooKeeper各种应用场景(recipe, 比如:分布式锁服务、集群领导选举、共享计数器、缓存机制、分布式队列等)的抽象封装 ``` ####Curator主要从以下几个方面降低了zk使用的复杂性: ``` 重试机制:提供可插拔的重试机制, 它将给捕获所有可恢复的异常配置一个重试策略,并且内部也提供了几种标准的重试策略(比如指数补偿) 连接状态监控: Curator初始化之后会一直对zk连接进行监听,一旦发现连接状态发生变化将会作出相应的处理 zk客户端实例管理:Curator会对zk客户端到server集群的连接进行管理,并在需要的时候重建zk实例,保证与zk集群连接的可靠性 各种使用场景支持:Curator实现了zk支持的大部分使用场景(甚至包括zk自身不支持的场景),这些实现都遵循了zk的最佳实践,并考虑了各种极端情况 ``` 在Curator中,首先需要通过CuratorFrameworkFactory创建连接实例,接着才能进行各种基本操作。需要说明的是,关于连接重试策略,Curator默认提供了以下几种: ``` ExponentialBackoffRetry:重试一定次数,每次重试时间依次递增 RetryNTimes:重试N次 RetryOneTime:重试一次 RetryUntilElapsed:重试一定时间 ``` 所谓永久节点,即:ZooKeeper中生成的节点名跟我们在代码中设置的节点名是一样的,而有序节点跟普通节点不同之处在于ZooKeeper会自动在生成的节点名后面添加序列号, ``` 可视化窗口工具: ZooInspector 下载地址: https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip 用法: 下载后解压,然后进入目录ZooInspector\build, 执行java -jar zookeeper-dev-ZooInspector.jar,然后会弹出操作窗口 ```