## Zookeeper
> Zookeeper目前用来做数据同步,再各个服务之前同步关键信息
i.客户端操作
 1. 创建
            create [-s] [-e] path data acl
            -s 为顺序节点   -e 为临时节点(临时节点在会话消失后即消失)
            acl为权限控制,权限控制比较麻烦,而且只存在于此节点和此级,其子节点不受控制
            
     2. 读取
            ls :
                  ls path
                  列出此节点下的所有子节点
            get:
                  get path
                  获取此节点的内容和属性
     3. 更新
            set path data [version]
            version为可选,选择基于哪个版本更新
     4. 删除
            delete path [version]
     5. 权限
            在Zookeeper的那本书的第215页有详细介绍
            这里使用的是digest加密方式,使用Zookeeper提供的方法加密
            
ii. Java客户端操作
    
    代码地址: ZKService.java
     
     1. 初始化客户端
            ```java
            private CuratorFramework client = CuratorFrameworkFactory.builder()
                       .connectString(ZOOKEEPER的IP)
                       .retryPolicy(new ExponentialBackoffRetry(1000, 6))
                       .sessionTimeoutMs(5000)
                       .namespace(以哪个地址为基准)
                       .authorization(加密方式, 密码)
                       .build();
            ```
     2. 注册监听
            ```java
                    private void watch(String path) {
                        ExecutorService tp = Executors.newFixedThreadPool(2);
                        System.out.println(Thread.currentThread().getName());
                        PathChildrenCache cache = new PathChildrenCache(这里把初始化的客户端传进来, 这里传入监听的地址, true, false, tp);
                        try {
                            cache.start(PathChildrenCache.StartMode.NORMAL);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        cache.getListenable().addListener(new PathChildrenCacheListener() {
                            public void childEvent(CuratorFramework client,
                                                   PathChildrenCacheEvent event) throws Exception {
                                switch (event.getType()) {
                                    case CHILD_ADDED://这里三个switch分别对应三个操作,里面写实现的业务逻辑
                                        listenService.initUser(new String(event.getData()));event.getData()是获取数据
                                        break;
                                    case CHILD_UPDATED:
                                        break;
                                    case CHILD_REMOVED:
                                        break;
                                    default:
                                        break;
                                }
                            }
                        });
                    }
            ```
            
     3. 创建
            ```
               String path = "自定义";
                       try {
                           client.getClient().create()
                               .withMode(CreateMode.PERSISTENT_SEQUENTIAL)//这个是顺序持久节点(自动按照顺序给节点前加数字),SEQUENTIAL是单纯的持久节点
                               .forPath(这里传地址, "这里传数据");
                       } catch (Exception e) {
                           e.printStackTrace();
                       }
            ```
 
                     
                    
                 
                    
                
 
         
                
            
        
 浙公网安备 33010602011771号
浙公网安备 33010602011771号