1,安装zookeeper
2,在目录和环境变量上做对应配置,太多了,懒得写
3,D:\zookeeper\zookeeper-3.4.10-1\conf里的zoo.cfg(一开始是sample)改成对应的参数
dataDir=D://zookeeper//zookeeper-3.4.10-3//bin//data
clientPort=2181 默认是2181,也可以写成其他的,一台电脑上有多个机器的,要写成不同的port才不会冲突
server.1=127.0.0.1:2777:3777
server.2=127.0.0.1:2888:3888

最好配置单数,因为单数和双数,都需要保证过半机器能用的原则,所以其实双数和单数在使用的时候没有区别

4,在对应的bin/data文件夹下,创建myId文件,里面写上对应的数字,1 or 2 or …对应server的ip

5,windows上双击运行bin/zkServer来运行zookeeper服务器
6,把配置的所有服务器都开启来以后,双击zkCli尝试运行,看看是否成功
不成功的可能原因
1,ip冲突,server.1 =127.0.0.1:2777:3777
ip:端口1:端口2
如果ip相同的情况下,要保证端口1和端口2和其他server的不一样,不能重复占用
同理clientPort
2,myId配置重复或者漏配

7,在java上配置客户端

maven配置,根据自己对应的仓库,有什么版本用什么

   <dependencies>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
        </dependency>
    </dependencies>

connectString: ip可以配置多个,这里只配置一个,ip地址通过上面寻找,
运行的zkServer里运行成功后,会提示
binding to port 0.0.0.0/0.0.0.0:2181
用这个就可以了!!
sessionTimeout: 和心跳检测相关,在sessionTimeout时间内会进行心跳检测,连不上就断开(如果是本地可以设置长一点,因为打断点的时候是不能顺利心跳检测的)
watcher: 可以不设置,设置的话,会回调返回WatchedEvent类型,里面含有三个参数:
- KeeperState:连接状态,比如连接中断,仍然连接着,等等,
- EventType :事件类型,比如节点添加,节点删除,子节点变更,等等,
- path:路径
代码

final String ip1 = "0.0.0.0:2181";
zooKeeper = new ZooKeeper(ip1 , 30000, null);

源码

public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher);

设置数据

path:路径
byte data[]:数据,byte[]格式
version:版本号,-1表示无所谓,如果不是-1,就表示,只有在xx版本下,才进行更新,乐观锁
代码

Stat stat = zooKeeper.setData(path , ("data").getBytes(), -1);

源码

public Stat setData(final String path, byte data[], int version)

获取数据
获取到的数据是byte[]格式的
path:略
watcher:监听器注册,这里用默认的监听器watcher的回调watchedEvent,也可以填null,不管回调
stat:可以通过stat去接收stat的值,这里选择null,不需要

  byte[] s = zooKeeper.getData(path , event -> {
            if (EventType.NodeDataChanged.equals(event.getType()) 
            || EventType.NodeChildrenChanged.equals(event.getType())) {
                   //......
            }       
      }, null);

源码

public byte[] getData(final String path, Watcher watcher, Stat stat);

获取子节点

List<String> childrenList = zooKeeper.getChildren(path,false);
watcher:false
childrenList :子节点的相对路径,不是绝对路径!

节点存在

Stat stat = zooKeeper.exists(path, null/*watcher*/);
if(null ==stat){
    //path not exists
}

监听:
1,监听是一次性的
2,重复add监听的话,那边是真的会有多个,就会导致一次调用,多个监听响应,其他懒得说了

create见另一篇

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐