欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java连接zookeeper的3种方式小结

程序员文章站 2022-03-24 08:55:48
目录java连接zookeeper3种方式1、使用zookeeper原始api2、使用zkclient客户端连接,这种连接比较简单3、使用curator连接java集成zookeeper笔记一、引入z...

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);
    }
}

打印:

java连接zookeeper的3种方式小结

如果打印出来的状态为 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("/"));
    }
}

打印:

java连接zookeeper的3种方式小结

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的3种方式小结

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 zookeeper