java连接zookeeper的3种方式小结
作者:码眼
这篇文章主要介绍了java连接zookeeper的3种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
java连接zookeeper3种方式
1、使用zookeeper原始api
public class Demo { private static String ip = "192.168.0.101:2181"; private static int session_timeout = 40000; private static CountDownLatch latch = new CountDownLatch(1); public static void main(String[] args) throws Exception { ZooKeeper zooKeeper = new ZooKeeper(ip, session_timeout, new Watcher() { @Override public void process(WatchedEvent watchedEvent) { if(watchedEvent.getState() == Event.KeeperState.SyncConnected) { //确认已经连接完毕后再进行操作 latch.countDown(); System.out.println("已经获得了连接"); } } }); //连接完成之前先等待 latch.await(); ZooKeeper.States states = zooKeeper.getState(); System.out.println(states); } }
打印:
如果打印出来的状态为 CONNECTED 则表示连接成功
2、使用ZkClient客户端连接,这种连接比较简单
public class ZkClientTest { private static String ip = "192.168.0.101:2181"; private static int session_timeout = 40000; public static void main(String[] args) { ZkClient zkClient = new ZkClient(ip,session_timeout); System.out.println(zkClient.getChildren("/")); } }
打印:
3、使用curator连接
public class CuratorDemo { //ZooKeeper服务地址 private static final String SERVER = "192.168.0.101:2181"; //会话超时时间 private static final int SESSION_TIMEOUT = 30000; //连接超时时间 private static final int CONNECTION_TIMEOUT = 5000; /** * baseSleepTimeMs:初始的重试等待时间 * maxRetries:最多重试次数 * * * ExponentialBackoffRetry:重试一定次数,每次重试时间依次递增 * RetryNTimes:重试N次 * RetryOneTime:重试一次 * RetryUntilElapsed:重试一定时间 */ private static final RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3); public static void main(String[] args) throws Exception { //创建 CuratorFrameworkImpl实例 CuratorFramework client = CuratorFrameworkFactory.newClient(SERVER, SESSION_TIMEOUT, CONNECTION_TIMEOUT, retryPolicy); //启动 client.start(); System.out.println("连接成功!"); Object o = client.getChildren().forPath("/"); System.out.println(o); } }
打印:
Java集成zookeeper笔记
一、引入zookeeper-3.4.5.jar(原生zk包)
slf4j.jar即可,其他还有zkClient和Curator,其中Curator封装的zk客户端组件最好用。
二、手写ZookeeperBase.java
少废话,上代码:
简单的创建连接和增删改查操作:
public class ZookeeperBase{ //zk集群地址(端口号为客户端端口号) private static final String CONNECT_ADDR = "192.168.241.127:2181,192.168.241.128:2181,192.168.241.129:2181"; //session 超时时间,单位毫秒 private static final int SESSION_OUTTIME = 5000; //用于阻塞程序执行,直到zk成功连接后再发送继续执行信号,因为zk建立连接是异步的,阻塞是防止程序在zk成功连接前被调用。 private static final CountDownLatch contectedSemaphore = new CountDownLatch (1); public static void main(String[] args)throws Exception{ Zookeeper zk = new Zookeeper(CONNECT_ADDR,SESSION_OUTTIME,new Watcher()){ @override public void process(WatcherEvent event){ //WatcherEvent为观察者监听事件 //获取事件状态(与客户端连接状态相关) /* * KeeperState:Disconneced 连接失败 * KeeperState:SyncConnected 连接成功 * KeeperState:AuthFailed 认证失败 * KeeperState:Expired 会话过期 */ KeeperState keeperState = event.getState(); //获取事件类型(与zknode相关) /* * EventType:NodeCreated 节点创建 * EventType:NodeDataChanged 节点的数据变更 * EventType:NodeChildrentChanged 子节点下的数据变更 * EventType:NodeDeleted 节点删除 * EventType:None 刚连接什么都没做 */ EventType eventType = event.getType(); //成功建立连接(固定写法) if(KeeperState.SyncConnected == keeperState){ if(EventType.None == eventType){ //发送信号让程序继续执行 contectedSemaphore.countDown(); } } } //阻塞程序执行 contectedSemaphore.await(); //创建节点 //同步创建 String newNode = zk.create("/testRoot","data".getBytes(),ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); /* *参数1:节点路径:/testRoot,原生api不允许递归创建节点,即没有父节点不允许直接连带父子节点一起创建。创建节点是要写全路径,例如:/testRoot/children。 *参数2:节点内容:内容类型为字节数组,不支持存储序列化对象,例如不支持将java对象序列化为json存储,但可以使用java序列化框架,如hession或kyso。 *参数3:权限控制:在对权限要求不严格情况下都使用OPEN_ACL_UNSAFE开放权限即可。 *参数4:节点类型:提供了四种类型。 *PERSISTENT 持久化节点 *PERSISTENT SEQUENTIAL 持久顺序节点 *EPHEMERAL 临时节点 *EPHEMERAL SEQUENTIAL 临时顺序节点 */ }; } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。