zookeeper的javaAPI操作(基于Curator的CRUD)
Curator介绍
•Curator 是 Apache ZooKeeper 的Java客户端库,目标是简化 ZooKeeper 客户端的使用。
•Curator 最初是 Netfix 研发的,后来捐献了 Apache 基金会,目前是 Apache 的顶级项目。
•官网:http://curator.apache.org/
获得对zookeeper服务端的连接对象:
在使用javaAPI的Curator进行增删改查的操作之前我们需要获得对zookeeper服务端的连接对象:
@Before public void ceshiConnect() { //定义重试策略 RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 10); client = CuratorFrameworkFactory.builder() .connectString("192.168.31.81:2181") //zookeeper的地址 .sessionTimeoutMs(60 * 1000) //会话超时时间 .connectionTimeoutMs(15 * 1000) //连接超时时间 .retryPolicy(retryPolicy) //重试策略 .namespace("hui") //命名空间 .build(); client.start(); }
基于javaAPI的Curator的增加结点:
@Test//创建不带有数据的结点但是,默认数据是当前客户端的ip public void testCreate() throws Exception { String forPath = client.create().forPath("/app1"); System.out.println(forPath); } @Test//创建带有数据的结点 public void testNodetext() throws Exception { String forPath = client.create().forPath("/app4", "yfsn".getBytes()); System.out.println(forPath); } @Test//创建结点的同时设置结点的类型 public void testMadeTheTypeNode() throws Exception { String forPath = client.create().withMode(CreateMode.EPHEMERAL).forPath("/app6", "yfsn".getBytes()); System.out.println(forPath); while (true) { } } @Test//创建多级结点,创建的多级结点中客户机的ip是只存在于叶子结点中的,创建的父节点的数据是空不是null public void testMadeManeyNode() throws Exception { String forPath = client.create().creatingParentsIfNeeded().forPath("/app9/bpp1/bpp2"); System.out.println(forPath); }
基于javaAPI的Curator的查询结点:
@Test//查询数据 get public void testGETData() throws Exception { byte[] bytes = client.getData().forPath("/app9/bpp1"); System.out.println(new String(bytes)); } @Test//查询子节点 public void testFindChild() throws Exception { List<String> list = client.getChildren().forPath("/");//这里的/其实是对应的/hui System.out.println(list); } @Test//查询结点的信息 public void getStatusforNode() throws Exception { Stat stat = new Stat();//状态容器 byte[] bytes = client.getData().storingStatIn(stat).forPath("/app9");//往容器中装填、app9的信息 System.out.println(stat);//打印状态信息 }
基于javaAPI的Curator的修改结点:
@Test//修改数据 public void testChangeData() throws Exception { client.setData().forPath("/app9", "yfsn".getBytes()); } @Test//根据版本修改,每一次的修改之后版本都会加1 public void testSetData() throws Exception { Stat stat = new Stat(); client.getData().storingStatIn(stat).forPath("/app9"); int version = stat.getVersion(); System.out.println(version); client.setData().withVersion(version).forPath("/app9", "zyh1".getBytes()); client.getData().storingStatIn(stat).forPath("/app9"); System.out.println(stat.getVersion() + "后面的状态"); }
基于javaAPI的Curator的删除结点:
@Test//删除没有子节点的结点 public void testDeleteNode() throws Exception { client.delete().forPath("/app1"); } @Test//删除带有子节点的结点 public void testDeleteNodeWithChilren() throws Exception { client.delete().deletingChildrenIfNeeded().forPath("/app9"); } @Test//测试必须删除成功,防止出现网络抖动不能够正常删除 public void testMustDelete() throws Exception { client.delete().guaranteed().forPath("/app2"); } @Test//测试回调删除,别忘了学习一下lamada表达式 public void testDeletedCallback() throws Exception { client.delete().guaranteed().inBackground(new BackgroundCallback() { @Override public void processResult(CuratorFramework curatorFramework, CuratorEvent curatorEvent) throws Exception { System.out.println("我被删除了"); System.out.println(curatorEvent.getType()); } }).forPath("/app3"); }
操作完毕之后关闭连接:
@After public void closeClient() { if (client != null) { client.close(); } }
迎风少年