当我写完Zookeeper leader选举后,准备看看Zookeeper的存储和处理客户端请求的时候发现,若是能看看Zookeeper的API是否是在理解后面的过程更好些呢。api
Zookeeper的client是经过Zookeeper类提供的。前面曾经说过,Zookeeper给使用者提供的是一个相似操做系统的文件结构,只不过这个结构是分布式的。能够理解为一个分布式的文件系统。咱们能够经过Zookeeper来访问这个分布式的文件系统。网络
Zookeeper的client api给咱们提供如下这些API:并发
1. createapp
在给定的path上建立节点,这个path就像文件系统的路径,好比/myapp/data/1,在建立节点的时候还能够指定节点的类型:是永久节点,永久顺序节点,临时节点,临时顺序节点。这个节点类型是很是强大的。永久节点一经建立就永久保留了,就像咱们在文件系统上建立一个普通文件,这个文件的生命周期跟建立它的应用没有任何关系。而临时节点呢,当建立这个临时节点的应用与zookeeper之间的会话过时以后就会被zookeeper自动删除了。这个特性是实现不少功能的关键。好比咱们作集群感知,咱们的应用启动的时候将本身的ip地址做为临时节点建立在某个节点下面。当咱们的应用由于某些缘由,好比网络断掉或者宕机,它与zookeeper的会话就会过时了,过时后这个临时节点就删除了。这样咱们就能够经过这个特性来感知到咱们的服务的集群有哪些机器是活者的。那么顺序节点又是什么呢。通常,若是咱们在指定的path上建立节点,若是这个节点已经被建立了,则会抛出一个NodeExistsException的异常。若是咱们在指定的路径上建立顺序节点,则Zookeeper会自动的在咱们给定的path上加上一个顺序编号。这个特性就是实现分布式锁的关键。假设咱们有几个节点共享一个资源,咱们这几个节点都想争用这个资源,那咱们就都向某个路径建立临时顺序节点。而后顺序最小的那个就得到锁,而后若是某个节点释放了锁,那顺序第二小的那个就得到锁,以此类推,这样一个分布式的公平锁就实现了。分布式
除此以外,每一个节点上还能够保存一些数据。操作系统
2. delete 删除给定节点。删除节点的时候还能够给定一个version,只有路径和version都匹配的时候节点才会被删除。有了这个version在分布式环境种咱们就能够用乐观锁的方式来确保一致性。好比咱们先读取一下节点,得到了节点的version,而后删除,若是删除成功了则说明在这之间没有人操做过这个节点,不然就是并发冲突了。对象
3. exists 这个节点会返回一个Stat对象,若是给定的path不存在的话则返回null。这个方法有一个关键参数,能够提供一个Watcher对象。Wathcer是Zookeeper强大功能的源泉。Watcher就是一个事件处理器,一个回调。好比这个exists方法,调用后,若是别人对这个path上的节点进行操做,好比建立,删除或设置数据,这个Wather都会接收到对应的通知。生命周期
4. setData/getData 设置或获取节点的数据,getData也能够设置Watcher事件
5. getChildren 获取子节点,能够设置Watcherip
6. sync zookeeper是一个集群,建立节点的时候只要半数以上的节点确认就认为是建立成功了,可是若是读取的时候正好读取到一个落后的节点上,那就有可能读取到旧的数据,这个时候能够执行一个sync操做,这个操做能够确保读取到最新的数据。
zookeeper的client api基本上介绍完了。zookeeper强大的功能都是经过这些API来实现的,zookeeper经过一个简单的文件系统数据模型对外提供服务。经过临时节点,Watcher等手段咱们能够实现一些在分布式环境种很难作到的事情。