`
cgs1999
  • 浏览: 531980 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

开发自己的ZooKeeper客户端工具

阅读更多
简单写了一个自己用的zookeeper工具,实现了对zookeeper基本的创建节点、修改节点、删除节点和查询节点的基本操作,可在其基础上扩展增加需要的功能,现拿出来和大家分享。

package cn.basttg.demo.zk;

import java.util.List;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.ACL;

public class ZkTool {
	// 工具信息
	private final static String TOOL_NAME = "ZooKeeper工具 ";
	private final static String TOOL_VERSION = "V0.1";
	private final static String TOOL_AUTHOR = "Jason Chen";
	private final static String TOOL_COPYRIGHT = "©2012 Jason 版权所有";

	// 相关命令编号
	private final static int ACTION_QUERY = 1;
	private final static int ACTION_CREATE = 2;
	private final static int ACTION_MODIFY = 3;
	private final static int ACTION_DELETE = 4;
	private final static int ACTION_CONFIG = 8;
	private final static int ACTION_ABOUT = 9;
	private final static int ACTION_QUIT = 0;

	// 默认配置信息
	private final static String DEFAULT_HOST = "172.16.160.196";
	private final static int DEFAULT_PORT = 2181;
	private final static int DEFAULT_TIMEOUT = 30000;

	// 当前配置信息
	private static String zkHost = DEFAULT_HOST;
	private static int zkPort = DEFAULT_PORT;
	private static int zkTimeout = DEFAULT_TIMEOUT;
	
	private static ZooKeeper zooKeeper = null;

	public static void main(String[] args) {
		try {
			openZk();
			
			StartMenu();
			while (true) {
				int operate = Integer.parseInt(getCommand());
				switch (operate) {
				case ACTION_QUERY:
					queryData();
					break;
				case ACTION_CREATE:
					createData();
					break;
				case ACTION_MODIFY:
					modifyData();
					break;
				case ACTION_DELETE:
					deleteData();
					break;
				case ACTION_CONFIG:
					configConnection();
					break;
				case ACTION_ABOUT:
					about();
					break;
				case ACTION_QUIT:
					exit();
					break;
				default:
					System.out.println("没有该命令 " + operate);
					break;
				}
			}
		} catch (Exception e) {
			System.out.println("输入错误,错误信息如下: ");
			e.printStackTrace();
		}
	}

	// 开始菜单
	public static void StartMenu() {
		System.out.println("**********" + TOOL_NAME + " " + TOOL_VERSION + "**********");
		System.out.println(ACTION_QUERY + "、查询目录信息");
		System.out.println(ACTION_CREATE + "、创建目录节点");
		System.out.println(ACTION_MODIFY + "、修改目录节点");
		System.out.println(ACTION_DELETE + "、删除目录节点");
		System.out.println(ACTION_CONFIG + "、设置连接信息");
		System.out.println(ACTION_ABOUT + "、关于程序");
		System.out.println(ACTION_QUIT + "、退出");
		System.out.println("********************************");
	}

	// 获取输入信息
	public static String getCommand() {
		return getCommand("请输入命令", 1);
	}

	public static String getCommand(String message) {
		return getCommand(message, null, 100);
	}

	public static String getCommand(String message, int limit) {
		return getCommand(message, null, limit);
	}

	public static String getCommand(String message, String defaultValue) {
		return getCommand(message, defaultValue, 100);
	}

	public static String getCommand(String message, String defaultValue, int limit) {
		String strCommand = "";
		try {
			do {
				System.out.println();
				if (defaultValue == null) {
					System.out.print(message + ": ");
				} else {
					System.out.print(message + " [" + defaultValue + "]: ");
				}

				byte[] command = new byte[100];
				System.in.read(command);
				strCommand = new String(command);
				strCommand = strCommand.replaceAll("\r\n", "").trim();
				// 若存在默认值且直接输入回车,则直接使用默认值作为返回值
				if (defaultValue != null && "".equals(strCommand)) {
					strCommand = defaultValue;
				}
			} while (strCommand.length() > limit);
		} catch (Exception e) {
			System.out.println("输入错误!!!");
		}
		return strCommand;
	}

	public static void queryData() {
		System.out.println("*****查询目录节点*****");
		
		String zpath = getCommand("目录节点路径", "/App");
		
		try {
			openZk();
			
			// 取出子目录节点列表
			System.out.println(zooKeeper.getChildren(zpath, true));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void createData() {
		System.out.println("*****创建目录节点*****");
		
		String zpath = getCommand("目录节点路径", "/App");
		String zdata = getCommand("目录节点数据", zpath);
		String zacl = getCommand("目录节点权限", "0");
		String ztype = getCommand("目录节点类型", "E");
		
		try {
			openZk();
			
			zooKeeper.create(zpath, zdata.getBytes(), getAcl(zacl), getCreateMode(ztype));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void modifyData() {
		System.out.println("*****修改目录节点*****");
		
		String zpath = getCommand("目录节点路径", "/App");
		String zdata = getCommand("目录节点数据", zpath);
		
		try {
			openZk();
			
			zooKeeper.setData(zpath, zdata.getBytes(), -1);
			
			String parent = StringUtil.strLeftBack(zpath, "/");
			System.out.println("目录节点状态:[" + zooKeeper.exists(parent, false) + "]");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void deleteData() {
		System.out.println("*****删除目录节点*****");
		
		String zpath = getCommand("目录节点路径", "/App");
		String zversion = getCommand("目录节点路径", "-1");
		
		try {
			openZk();
			
			zooKeeper.delete(zpath, Integer.valueOf(zversion));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/** 设置连接信息 */
	public static void configConnection() {
		System.out.println("*****设置连接信息*****");
		do {
			zkHost = getCommand("请输入服务器地址", zkHost);
			zkPort = Integer.valueOf(getCommand("请输入端口", "" + zkPort));
			zkTimeout = Integer.valueOf(getCommand("请输入连接超时", "" + zkTimeout));

			try {
				// 创建一个与服务器的连接
				zooKeeper = new ZooKeeper(zkHost + ":" + zkPort, zkTimeout, new Watcher() {

					// 监控所有被触发的事件
					public void process(WatchedEvent event) {
						System.out.println("已经触发了[" + event.getType() + "]事件!");
					}
				});
			} catch (Exception e) {
				zooKeeper = null;
				e.printStackTrace();
			}
		} while (zooKeeper == null);
		System.out.println(">>>测试连接成功!");
	}

	/** 关于 */
	public static void about() {
		System.out.println("************关于" + TOOL_NAME + "****************");
		System.out.println("|    版本:" + TOOL_VERSION + "           |");
		System.out.println("|    作者:" + TOOL_AUTHOR + "          |");
		System.out.println("|                    |");
		System.out.println("|版本更新:               |");
		System.out.println("|V0.1                  |");
		System.out.println("|  1.查询目录信息功能         |");
		System.out.println("|  2.创建目录信息功能         |");
		System.out.println("|  3.修改目录信息功能         |");
		System.out.println("|  4.删除目录信息功能         |");
		System.out.println("|  5.设置连接信息           |");
		System.out.println("|                    |");
		System.out.println("|   " + TOOL_COPYRIGHT + "      |");
		System.out.println("*****************************************");
	}

	/** 退出 */
	public static void exit() {
		System.out.println("谢谢使用,再见!");
		try {
			closeZk();
			Thread.sleep(1000);
		} catch (Exception e) {
		}
		System.exit(0);
	}
	
	private static ZooKeeper openZk() {
		if(zooKeeper==null) {
			// 创建一个与服务器的连接
			try {
				zooKeeper = new ZooKeeper(zkHost + ":" + zkPort, zkTimeout, new Watcher() {

					// 监控所有被触发的事件
					public void process(WatchedEvent event) {
						System.out.println("已经触发了[" + event.getType() + "]事件!");
					}
				});
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		return zooKeeper;
	}
	
	private static void closeZk() {
		if(zooKeeper!=null) {
			// 创建一个与服务器的连接
			try {
				zooKeeper.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	private static List<ACL> getAcl(String zacl) {
		return Ids.OPEN_ACL_UNSAFE;
	}
	private static CreateMode getCreateMode(String ztype) {
		if("P".equalsIgnoreCase(ztype)) {
			return CreateMode.PERSISTENT;
		} else if("PS".equalsIgnoreCase(ztype)) {
			return CreateMode.PERSISTENT_SEQUENTIAL;
		} else if("E".equalsIgnoreCase(ztype)) {
			return CreateMode.EPHEMERAL;
		} else{
			return CreateMode.EPHEMERAL_SEQUENTIAL;
		}
	}
}
分享到:
评论
2 楼 cgs1999 2015-03-15  
string2020 写道
创建节点 可以干什么,有什么用?


创建节点,可以把相关的数据写入节点中。
不创建节点,,怎么查询、修改和删除?
1 楼 string2020 2015-03-10  
创建节点 可以干什么,有什么用?

相关推荐

    zookeeper客户端工具

    ZooKeeper客户端工具主要提供了与ZooKeeper服务器交互的能力,包括数据的查看、更新、创建和删除等操作。这些工具对于开发者调试、监控和管理ZooKeeper集群至关重要。 1. **ZooInspector**:这是一个图形化的...

    zookeeper客户端

    了解并熟练使用Zookeeper客户端是大数据开发中的必备技能,它为分布式环境提供了可靠的协调机制,确保了系统的稳定性和一致性。无论是Java API还是命令行工具,都能帮助我们有效地与Zookeeper交互,实现各种分布式...

    zookeeper客户端 图形化界面

    4. Curator:Facebook开源的Zookeeper客户端库,其中包含了一个简单的图形化界面工具。 四、安装与使用 1. 安装:根据所选择的图形化工具,通常需要将其部署在服务器上,并确保与Zookeeper集群通信正常。 2. 配置...

    引用zookeeper客户端时,缺少的jar包

    在使用ZooKeeper客户端进行开发时,为了确保程序能够正常运行,我们需要依赖一系列的库文件,其中包括JMS(Java Message Service)和JMX(Java Management Extensions)的相关jar包。这些jar包对于理解和操作...

    Zookeeper客户端,资源小方便快捷

    总的来说,ZooInspector作为Zookeeper的客户端工具,极大地简化了Zookeeper的管理和调试过程,提升了开发和运维效率。通过深入理解和熟练使用ZooInspector,我们可以更好地驾驭Zookeeper,为分布式系统构建坚实的...

    zookeeper浏览器,zookeeper工具,zookeeper客户端

    某大神基于springcloud开发的zookeeper浏览器,使用java即可启动。 下载jar包直接运行 1. java -jar zookeeper-explorer-1.0.2-RELEASE-exec.jar --server.port=8099 --server.context-path=/zookeeper-explorer --...

    【Zookeeper管理工具】

    3. **会话(Session)**: 用户与Zookeeper服务器之间的连接称为会话,会话期间,Zookeeper服务器会保持与客户端的连接状态,如果会话超时或网络中断,会话结束。 **Zookeeper管理工具的功能** 1. **集群监控**: ...

    zookeeper可视化工具

    在运维和开发过程中,为了更方便地管理和监控Zookeeper,出现了许多可视化工具。这些工具通过图形用户界面(GUI)提供对Zookeeper状态的直观展示,帮助用户查看节点信息、操作数据、监控集群状态以及进行故障排查。 ...

    Zookeeper客户端Curator Framework使用代码

    总结来说,Zookeeper客户端Curator Framework通过提供简洁的API和高级功能,极大地简化了与Zookeeper的交互,是开发分布式应用程序的有力工具。通过掌握其基本用法和核心组件,可以高效地实现诸如分布式锁、状态同步...

    dubbo+zookeeper 客户端所需jar包

    总结来说,Zookeeper和Dubbo的结合使用为企业构建高可用、可扩展的分布式服务架构提供了强大的工具。在客户端,正确地引入和配置这两个框架的jar包,可以实现服务的自动发现、调用和管理,极大地简化了分布式环境下...

    zookeeper安装包(内附客户端连接工具)

    **Zookeeper:分布式协调服务详解** Zookeeper是一个高性能的分布式协调服务,由...而提供的客户端工具ZkClient,则使得与Zookeeper的交互变得更加便捷。了解和掌握Zookeeper,对于构建高可用的分布式系统至关重要。

    eclipse安装ZooKeeper插件

    此外,对于学习ZooKeeper原理和进行相关开发的人来说,这个插件也是一个很好的辅助工具。 在MyEclipse环境中,虽然插件安装步骤类似,但由于MyEclipse是商业版本,可能需要额外的步骤来导入非官方插件。具体操作...

    zookeeper图形化客户端

    在Zookeeper生态系统中,有多种客户端工具供用户选择,包括命令行接口(CLI)和图形用户界面(GUI)。Zookeeper CLI是基础的命令行工具,适合进行基本的操作,如创建、删除、查看节点等。然而,对于复杂的操作和调试...

    zookeeper两种客户端demo

    ZkClient是早期较为流行的Zookeeper客户端,它是一个轻量级、易于使用的Java库。ZkClient的特点包括: 1. **简洁API**:ZkClient提供了简单易懂的API,如connect、create、exists、getData等,使得开发者能快速上手...

    ZooInspector zookeeper连接工具

    zookeeper客户端,可以在windows, linux下运行,使用java开发,启动后,填写zookeeper配置信息,可以连接zookeeper服务器,查看服务器上的数据信息

    zookeeper开发所需jar包

    它们共同构成了ZooKeeper客户端的运行环境,使得开发者能够轻松地连接到ZooKeeper集群,进行数据的读写操作,并利用ZooKeeper的特性实现分布式协调。在实际项目中,还需要结合具体的业务需求,理解和掌握ZooKeeper的...

    zookeeper查看工具

    Zookeeper查看工具,如标题所示,是用于管理和监控Apache ZooKeeper的一种运维软件。...因此,掌握Zookeeper运维工具的使用,对于从事分布式系统开发和运维的人员来说,是提升工作效率和系统可靠性的重要技能。

Global site tag (gtag.js) - Google Analytics