# Watcher 命令

## Watcher 机制

* 针对每个节点的操作，都会有一个监督者 -> watcher&#x20;
* 当监控的某个对象（znode）发生了变化，则触发watcher事件
* zk中的watch是一次性的，触发后立即销毁
* 父节点，子节点 增删改都能够触发其watcher
* 针对不同类型的操作，触发的watcher事件也不同：
  * 1.（子）节点创建事件
  * 2.（子）节点删除事件
  * 3.（子）节点数据变化事件

## Watcher 事件

* 通过`get path [watch]`设置 watcher
* 父节点 增 删 改 操作触发 watcher
* 子节点 增 删 改 操作触发watcher

## Watcher 事件类型

**父节点Watcher事件**

* 创建父节点触发：NodeCreated
* 修改节点数据触发：NodeDatachanged
* 删除节点数据触发：NodeDeleted

操作示例

```
# 连接zk
$ zkCli.sh -server 127.0.0.1:2181
# 对节点进行watch
$ stat /abc watch
# 创建父节点触发事件
$ create /abc 123
#结果
WARCHER::
WatchedEvent state:SyncConnected type:NodeCreated path:/abc


$ get /abc watch
# 修改节点数据触发
$ set /abc 567
#结果
WARCHER::
WatchedEvent state:SyncConnected type:NodeDatachanged path:/abc


$ create /hello 111
$ get /hello watch
$ delete /hello
#结果
WARCHER::
WatchedEvent state:SyncConnected type:NodeDeleted path:/hello
```

子**节点Watcher事件**

* ls为父节点设置watcher，创建子节点触发：NodeChildrenChanged
* ls为父节点设置watcher，删除子节点触发：NodeChildrenChanged
* ls为父节点设置watcher，修改子节点不触发事件

操作

```
$ ls /abc watch
# 创建子节点事件
$ create /abc/bcd 111
#结果
WARCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/abc
Create /abc/bcd


$ ls /abc watch
$ delete /abc/bcd
#结果
WARCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/abc

$ ls /abc watch
$ create /abc/xyz 111
$ set /abc/xyz 222
# 并没有触发watcher事件
```

set修改子节点并没有触发事件，你需要像父节点watch那样监控子节点

```
$ get /abc/xyz watch
$ set /abc/xyz 333
#结果
WARCHER::
WatchedEvent state:SyncConnected type:NodeDatachanged path:/abc/xyz
```

## wather使用场景

* 统一资源配置
