java连接zookeeper的3种方式小结

 更新时间:2021年11月11日 09:02:39   作者:码眼  
这篇文章主要介绍了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 临时顺序节点
			*/
		};	
	} 	
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java学生信息管理系统MVC架构详解

    java学生信息管理系统MVC架构详解

    这篇文章主要为大家详细介绍了java学生信息管理系统MVC架构的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Java反射获取class对象方式解析

    Java反射获取class对象方式解析

    这篇文章主要介绍了Java反射获取class对象方式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java的无参构造函数用法实例分析

    Java的无参构造函数用法实例分析

    这篇文章主要介绍了Java的无参构造函数用法,结合实例形式分析了java无参构造函数基本原理、用法及相关操作注意事项,需要的朋友可以参考下
    2019-09-09
  • java数据结构之搜索二叉树

    java数据结构之搜索二叉树

    这篇文章主要为大家详细介绍了java数据结构之搜索二叉树,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Java中的自定义异常实现方式

    Java中的自定义异常实现方式

    这篇文章主要介绍了Java中的自定义异常实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • JavaWeb中Servlet的生命周期及线程安全问题详解

    JavaWeb中Servlet的生命周期及线程安全问题详解

    这篇文章主要介绍了JavaWeb中Servlet的生命周期及线程安全问题详解,Servlet 生命周期可被定义为从创建直到毁灭的整个过程,Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的,需要的朋友可以参考下
    2024-01-01
  • JavaWeb文件上传下载实例讲解(酷炫的文件上传技术)

    JavaWeb文件上传下载实例讲解(酷炫的文件上传技术)

    在Web应用系统开发中,文件上传功能是非常常用的功能,今天来主要讲讲JavaWeb中的文件上传功能的相关技术实现,本文给大家介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-11-11
  • idea设置JVM运行参数的几种方式

    idea设置JVM运行参数的几种方式

    对JVM运行参数进行修改是JVM性能调优的重要手段,本文主要介绍了idea设置JVM运行参数的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Java全面细致讲解Cookie与Session及kaptcha验证码的使用

    Java全面细致讲解Cookie与Session及kaptcha验证码的使用

    web开发阶段我们主要是浏览器和服务器之间来进行交互。浏览器和服务器之间的交互就像人和人之间进行交流一样,但是对于机器来说,在一次请求之间只是会携带着本次请求的数据的,但是可能多次请求之间是会有联系的,所以提供了会话机制
    2022-06-06
  • idea根据实体类生成数据库表的流程步骤

    idea根据实体类生成数据库表的流程步骤

    在开发的时候,经常会遇到数据库表结构设计无法满足业务的需求,需要去改动数据库表,我们就需要去设计数据库的字段,然后又回来增加实体类里的字段,这样很麻烦,所以本文给大家介绍了idea根据实体类生成数据库表的流程步骤,需要的朋友可以参考下
    2024-12-12

最新评论