Zookeeper Java 客户端
pom依赖:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.8</version>
</dependency>
创建客户端实例
@Slf4j public class ZookeeperClientTest { private static final String ZK_ADDRESS="192.168.109.200:2181"; private static final int SESSION_TIMEOUT = 5000; private static ZooKeeper zooKeeper; private static final String ZK_NODE="/zk-node"; @Before public void init() throws IOException, InterruptedException { final CountDownLatch countDownLatch=new CountDownLatch(1); zooKeeper=new ZooKeeper(ZK_ADDRESS, SESSION_TIMEOUT, event -> { if (event.getState()== Watcher.Event.KeeperState.SyncConnected && event.getType()== Watcher.Event.EventType.None){ countDownLatch.countDown(); log.info("连接成功!"); } }); log.info("连接中...."); countDownLatch.await(); } }
创建Zookeeper实例的方法:
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, ZKClientConfig) ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly, HostProvider) ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly, HostProvider, ZKClientConfig) ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly) ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly, ZKClientConfig) ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long, byte[]) ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long, byte[], boolean, HostProvider) ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long, byte[], boolean, HostProvider, ZKClientConfig) ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long, byte[], boolean)
|
参数名称
|
含义
|
|
connectString
|
ZooKeeper服务器列表,由英文逗号分开的host:port字符串组成,
每一个都代表一台ZooKeeper机器,如,host1:port1,host2:port2,host3:port3。另外,也可以在connectString中设置客户端连接上ZooKeeper
后的根目录,方法是在host:port字符串之后添加上这个根目录,例如,host1:port1,host2:port2,host3:port3/zk-base,这样就指定了该客户端连接上ZooKeeper服务器之后,所有对ZooKeeper
的操作,都会基于这个根目录。例如,客户端对/sub-node 的操作,最终创建 /zk-node/sub-node, 这个目录也叫Chroot,即客户端隔离命名空间。
|
|
sessionTimeout
|
会话的超时时间,是一个以“毫秒”为单位的整型值。在ZooKeeper中有
会话的概念,在一个会话周期内,ZooKeeper客户端和服务器之间会通过心跳检
测机制来维持会话的有效性,一旦在sessionTimeout时间内没有进行有效
的心跳检测,会话就会失效。
|
|
watcher
|
ZooKeeper允许
客户端在构造方法中传入一个接口 watcher (org.apache. zookeeper.
Watcher)的实现类对象来作为默认的 Watcher事件通知处理器。当然,该参
数可以设置为null 以表明不需要设置默认的 Watcher处理器。
|
|
canBeReadOnly
|
这是一个boolean类型的参数,用于标识当前会话是否支持“read-only(只
读)”模式。默认情况下,在ZooKeeper集群中,一个机器如果和集群中过半及
以上机器失去了网络连接,那么这个机器将不再处理客户端请求(包括读写请
求)。但是在某些使用场景下,当ZooKeeper服务器发生此类故障的时候,我们
还是希望ZooKeeper服务器能够提供读服务(当然写服务肯定无法提供)——
这就是 ZooKeeper的“read-only”模式。
|
|
sessionId和 ses
sionPasswd
|
分别代表会话ID和会话秘钥。这两个参数能够唯一确定一个会话,同时客户
端使用这两个参数可以实现客户端会话复用,从而达到恢复会话的效果。具体
使用方法是,第一次连接上ZooKeeper服务器时,通过调用ZooKeeper对象实
例的以下两个接口,即可获得当前会话的ID和秘钥:
long getSessionId();
byte[]getSessionPasswd( );
荻取到这两个参数值之后,就可以在下次创建ZooKeeper对象实例的时候传
入构造方法了
|
同步创建节点:
@Test public void createTest() throws KeeperException, InterruptedException { String path = zooKeeper.create(ZK_NODE, "data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); log.info("created path: {}",path); }
异步创建节点:
@Test public void createAsycTest() throws InterruptedException { zooKeeper.create(ZK_NODE, "data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, (rc, path, ctx, name) -> log.info("rc {},path {},ctx {},name {}",rc,path,ctx,name),"context"); TimeUnit.SECONDS.sleep(Integer.MAX_VALUE); }
修改节点数据
@Test public void setTest() throws KeeperException, InterruptedException { Stat stat = new Stat(); byte[] data = zooKeeper.getData(ZK_NODE, false, stat); log.info("修改前: {}",new String(data)); zooKeeper.setData(ZK_NODE, "changed!".getBytes(), stat.getVersion()); byte[] dataAfter = zooKeeper.getData(ZK_NODE, false, stat); log.info("修改后: {}",new String(dataAfter)); }

浙公网安备 33010602011771号