如何使用Curator操作zookeeper - 三劫散仙

2019-03-14 22:53|来源: 网路

Curator是Netflix开源的一套ZooKeeper客户端框架,用它来操作zookeeper更加简单方便,按Curator官方所比喻的,guava to JAVA, Curator to Zookeeper,Curator采用了fluent风格的代码,非常简洁。

有关curator的介绍:请参照官方文档: http://curator.apache.org/index.html


本篇主要看下,使用curator操作zookeeper的一些基础例子:
主要的功能:
1,在zk上添加,或更新数据
2,删除zk节点上数据
3,读取某个节点上的数据
4,上传一些本地文件到zk节点上
5,检查zookeeper上是否存在某个节点路径

核心代码如下:
package com.qin.curator.zk;

import java.io.File;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.curator.CuratorZookeeperClient;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.CuratorFrameworkFactory.Builder;
import org.apache.curator.framework.api.CreateBuilder;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZKUtil;

import framework.CrudExamples;
/**
 * @author qindongliang
 * curator操作zookeeper的
 * 基本例子
 * **/
public class CuratorTools {
	
	static CuratorFramework zkclient=null;
	static String nameSpace="php";
	static {
		
		  String zkhost="192.168.46.22:2181";//zk的host
		  RetryPolicy rp=new ExponentialBackoffRetry(1000, 3);//重试机制
		  Builder builder = CuratorFrameworkFactory.builder().connectString(zkhost)
				  .connectionTimeoutMs(5000)
				  .sessionTimeoutMs(5000)
				  .retryPolicy(rp);
		  builder.namespace(nameSpace);
		  CuratorFramework zclient = builder.build();
		  zkclient=zclient;
		  zkclient.start();// 放在这前面执行
		  zkclient.newNamespaceAwareEnsurePath(nameSpace);
		  
	}
	
	public static void main(String[] args)throws Exception {
		CuratorTools ct=new  CuratorTools();
		//ct.getListChildren("/zk/bb");
		//ct.upload("/jianli/123.txt", "D:\\123.txt");
		//ct.createrOrUpdate("/zk/cc334/zzz","c");
		//ct.delete("/qinb/bb");
		//ct.checkExist("/zk");
		ct.read("/jianli/123.txt");
		zkclient.close();
		
		
	}

	/**
	 * 创建或更新一个节点
	 * 
	 * @param path 路径
	 * @param content 内容
	 * **/
	public void createrOrUpdate(String path,String content)throws Exception{
		 
		zkclient.newNamespaceAwareEnsurePath(path).ensure(zkclient.getZookeeperClient());
	    zkclient.setData().forPath(path,content.getBytes());	
	    System.out.println("添加成功!!!");
		
	}
	
	/**
	 * 删除zk节点
	 * @param path 删除节点的路径
	 * 
	 * **/
	public void delete(String path)throws Exception{
		zkclient.delete().guaranteed().deletingChildrenIfNeeded().forPath(path);
		System.out.println("删除成功!");
	}
	
	
	/**
	 * 判断路径是否存在
	 * @param path
	 * **/
	public void checkExist(String path)throws Exception{
		
		if(zkclient.checkExists().forPath(path)==null){
			System.out.println("路径不存在!");
		}else{
			System.out.println("路径已经存在!");
		}
		
	}
	
	/**
	 * 读取的路径
	 * @param path
	 * **/
	public void read(String path)throws Exception{
		 
	 
		String data=new String(zkclient.getData().forPath(path),"gbk");
		
		System.out.println("读取的数据:" data);
		
	}
	
	
	/**
	 * @param path 路径
	 * 获取某个节点下的所有子文件
	 * */
	public void getListChildren(String path)throws Exception{
		
		List<String> paths=zkclient.getChildren().forPath(path);
		for(String p:paths){
			System.out.println(p);
		}
		
	}
	
	/**
	 * @param zkPath zk上的路径
	 * @param localpath 本地上的文件路径
	 * 
	 * **/
	public void upload(String zkPath,String localpath)throws Exception{
		
		createrOrUpdate(zkPath, "");//创建路径
		byte[] bs=FileUtils.readFileToByteArray(new File(localpath));
		zkclient.setData().forPath(zkPath, bs);
		System.out.println("上传文件成功!");
		
		
	}
	
	
	
	
	
}










转自:http://qindongliang.iteye.com/blog/2122764

相关问答

更多
  • 您好!首先安装诸仙2客户端!然后在下个服务端。PS:架设工具、补丁、人物、EL…基本工具全部都有。若您有耐心可以将它变成自己的端,可以开SF、可以单人玩(不用网络资源)、也可联机对战~版本422、500端快出了、可以加我,我帮您架设
  • 1. c是面向过程的语言。c++和Java都是面向对象的。在c中没有类或者对象的概念。 2. java运行在虚拟机上,号称与平台无关。也就是你开发的java程序无论是unix,linux还是windows都可以正常运行。但是实际上这是一个良好的愿望,实际跨平台时还会有各种各样的问题。c和c++都是直接编译成可执行文件,是否能跨平台主要看你用到的编译器特性是否有多平台支持。 3. 因为c和c++是直接编译成可执行文件,所以运行效率要比java高。至于c和c++哪个更快,两种语言的拥趸已经吵了很多年。 4. j ...
  • 掌握zookeeper事件监听机制,非常重要,可以说是跨入了进阶的门槛,只有掌握了如何监听某个节点或路径,我们才能在节点变化后,做一些我们想做的事,包括: 1,配置文件同步 2,主从切换 3,分布式队列 4,分布式锁 5,其他 散仙,在以前的文章里面有写过使用zookeeper原生的api,监听zk节点变化,那么本篇我们就来看下,如何使用curator来完成监听,代码如下: package com.qin.curator.zk; import javax.sound.midi.Patch; impo ...
  • 掌握zookeeper事件监听机制,非常重要,可以说是跨入了进阶的门槛,只有掌握了如何监听某个节点或路径,我们才能在节点变化后,做一些我们想做的事,包括: 1,配置文件同步 2,主从切换 3,分布式队列 4,分布式锁 5,其他 散仙,在以前的文章里面有写过使用zookeeper原生的api,监听zk节点变化,那么本篇我们就来看下,如何使用curator来完成监听,代码如下: package com.qin.curator.zk; import javax.sound.midi.Patch; impo ...
  • 是。 你的ZK的领导选举配方例子是正确的。 一般来说,如果一个配方已经存在,为什么要重写呢? 引用Zookeeper文档: ZooKeeper是一个集中服务,用于维护配置信息,命名,提供分布式同步和提供组服务。 关于分布式锁 - 假设您有一个分布式系统,其中所有配置都保存在Zookeeper上,并且多个实体负责更新某个配置 - 在这种情况下,您希望配置更新同步。 关于屏障,我个人从来没有使用它们 - 但是如果有锁,您需要获得锁来实际上在节点上执行某些操作,这是一个屏障,您可以等待,直到屏障释放为止,但不一定 ...
  • 因此,它不是指向gradle缓存二进制文件,而是默认指向我本地计算机上的.m2存储库。 由于它无法找到zookeeper jar文件。 So, rather than pointing to gradle cache binaries, it was default pointing to .m2 repository on my local machine. Due to which it was not able to find zookeeper jar files.
  • 我之前没有使用过TreeCache,但是我将TreeCacheListener添加到TreeCache实例中,TreeCache将在初始化时发布TreeCacheEvent.Type.INITIALIZED事件。 您可以在INITIALIZED事件中倒计数器中的锁存器,您可以等待锁存器。 I haven't used TreeCache myself before, but I'd add a TreeCacheListener to the TreeCache instance and TreeCache ...
  • 我设法找到答案并想分享。 策展人有一个方法blockUntilConnected,它将等待从Zookeeper获得连接。 CuratorFramework curator = CuratorFrameworkFactory.newClient("localhost:" + TestConstants.TEST_ZOOKEEPER_PORT, new RetryOneTime(100)); curator.start(); curator.blockUntilConnected(); I managed t ...
  • 策展人(注意我是Curator的主要作者)封装了标准的ZooKeeper Java API,因此所有相同的方法都在那里。 因此,要获得Stat对象: CuratorFramework client = .... Stat stat = client.checkExists().forPath(path); Curator (note I'm the main author of Curator) wraps the standard ZooKeeper Java API so all the same m ...
  • 最简单/最好的方法是使用ApacheUtils: byte[] input = SerializationUtils.serialize(yourList); curator.create() .creatingParentContainersIfNeeded() .forPath(path, input); 并把它拿出来: byte[] output = curator.getData().forPath(path); List newList = (Li ...