数据节点 
数据节点Znode: 
– 是机器的意思 
– zk树形结构中的数据节点,用于存储数据 
– 持久节点(PERSISTENT)一旦创建,除非主动调用删除操作,否则一直存储在zk上 
– 临时节点(EPHEMERAL):与客户端的会话绑定,一旦客户端会话失效,与个客户端创建的所有临时节点都会被移除 
– PERSISTENT _SEQUENTIAL 创建子节点时,如果不置属性SEQUENTIAL,则会自动在节点名称后面面追加一个整型数字,上限是整形的最大值 

创建顺序节点1,节点数据为test1 
创建顺序节点2,节点数据内容为test2 
查看所有创建的顺序子节点 
创建顺序节点,带前缀 
zk-watcher 
问题 
– 集群中有多个机器,当某个通用的配置发生变化后,怎么让所有服务器的配置都统一生效? 
– 当某个集群节点宕机,其它节点怎么知道? 

Watcher组成 
– 客户端 
– 客户端watchManager 
– zk服务器 
Watcher机制 
– 客户端向zk服务器注册watcher的同时时,会将watcher对象存储在 
客户端的watchManager 
– Zk服务器触发watcher事件后,会 
向客户端发送通知,客户端线程从 
watchManager中调起watcher执行 

Watcher接口 
– public class ZLock implements Watcher 
– public void process(WatchedEvent event) 
Watcher事件 
– 通知状态:org.apache.zookeeper.Watcher.Event.KeeperState 
– 事件类型:org.apache.zookeeper.Watcher.Event.EventType 

NodeDataChanged事件 
– 无论节点数据发生变化还是数据版本发生变化都会触发 
– 即使被更新数据更新数据一样,数据版本都会发生变化 
NodeChildrenChanged 
– 新增节点或者删除节点 
AuthFailed 
– 重点不是客户端会话没有权限而是授权失败(后面详细讲) 
创建zk客户端对象实例时注册 
– ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) 
– ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly) 
– ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd) 
– ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd, boolean 
canBeReadOnly) 
通过这种方式注册的watcher将会作为整个zk会话期间的默认watcher,会一直被 
保存在客户端ZKWatchManager的defaultWatcher中,如果有其它的配置置,则这个 
watcher会被覆盖 
其它注册api 
– getChildren(String path, Watcher watcher) 
– getChildren(String path, boolean watch) 
Boolean watch表示是否使用上下文中默认的watcher,即创建zk实例时设置的watcher 
– getData(String path, boolean watch, Stat stat) 
Boolean watch表示是否使用上下文中默认的watcher,即创建zk实例时设置的watcher 
– getData(String path, Watcher watcher, AsyncCallback.DataCallback cb, Object ctx) 
– exists(String path, boolean watch) 
Boolean watch表示是否使用上下文中默认的watcher,即创建zk实例时设置的watcher 
– exists(String path, Watcher watcher) 

客户端只能收到相关事件通知,但是并不能获取到对应数据节点的原始数据内容以 
及变更更的新数据内容;因次,如果业务需要知道变更前的数据或者变更后的新数据, 
需要业保存变更前的数据和调用接口获取新的数据 

针对子节点的删除增加会触发事件,注册一次只能触发一次(非常重要),触发一次就会失效 

判断调用是否需要注册watcher 


如果需要注册,则传入对象cnxn 
ServerCnxn类及cnxn对象 
– Zk客户端与服务器之间的tcp连接 
– 实现了watcher接口 
– 总结:即包含了连接信息又包含watcher信息 
watchManager 
– Zk服务器端Watcher的管理者 
– 从两个维度维护watcher 
watchTable:从数据节点的粒度来维护 
watch2Paths从watcher的粒度来维护 
– 负责watcher事件的触发 

Watcher触发 
– DataTree类 
维护节点目录树的数据结构 

客户端回调watcher步骤 
– 反序列化,将字节流转换成WatcherEvent对象 
– 处理chrootPath 
– 原watchedEvent:把WatcherEvent对象转换成WatchedEvent 
– 回调Watcher:把WatchedEvent对象交给EventThread线程 
EventThread 
– 从客户端的ZKWatchManager中取出Watcher,并放入waitingEvents队列中 


Acl组成 
– Scheme:id:permission 比如:world:anyone:crdwa 
– Scheme:验证过程中使用的检验策略 
– Id:权限被赋予的对象,比如ip或者某个用户 
– Permission:权限,上面的crdwa,表示五个权限组合 
– 通过setAcl命令设置节点的权限 
– 节点的acl不具有继承关系 
– getAcl可以查看节点的Acl信息 

Scheme类型--world 
– Scheme:id:permission 
– Id:固定值:anyone,表示任何用户 
– world:anyone:crdwa表示任何用户都具有crdwa权限 


Scheme类型---auth 
– Scheme:id:permission ,比如: auth:username:password:crdwa 
– 表示给认证通过的所有用户设置acl权限 
– 时可以添加多个用户 
– 通过addauth命令进行认证用户的添 
addauth digest <username>:<password> 
– Auth策略的本质就是digest 
– 如果通过addauth创建多组用户和密码,当使用setAcl修改权限时,所有的用户和密码的权限都会跟 
着修改 
– 通过addauth新创建的用户和密码组需要重新调用setAcl才会加入到权限组中去 

Scheme类型---auth 

Scheme类型---digest 
– Scheme:id:permission ,比如:digest:username:password:crdwa 
– 指定某个用户及它的密码可以访问 
– 处的username:password必须经过SHA-1和BASE64编码 
BASE64(SHA1(username:password)) 
– 通过addauth命令进行认证用户的添加 
addauth digest <username>:<password> 
Scheme类型---digest 

Scheme类型---IP 
– Scheme:id:permission ,比如: ip:127.0.0.1:crdwa 
– 指定某个ip地址可以访问 
Scheme类型---super 

客户端通过super级别的用户admin授权 

即可以访问任何节点 


获取【下载地址】 

springmvc4 mybatis 整合 框架源码 bootstrap html5 mysql oracle sqlsever spring SSM