1.curator介绍
Curator是Netflix公司开源的一套Zookeeper客户端框架。了解过Zookeeper原生API都会清楚其复杂度。Curator帮助我们在其基础上进行封装、实现一些开发细节,包括连接重连、反复注册Watcher和NodeExistsException等。目前已经作为Apache的顶级项目出现,是最流行的Zookeeper客户端之一。从编码风格上来讲,它提供了基于Fluent的编程风格支持。
除此之外,Curator还提供了Zookeeper的各种应用场景:Recipe、共享锁服务、Master选举机制和分布式计数器等。
我们可以在curator官网看到,Patrixck Hunt(Zookeeper作者)以一句“Guava is to Java that Curator to Zookeeper”给Curator予高度评价。
2.curator项目组件
我们可以看到官网中的关于curator组件的最新描述如下:
其实比较常用的也就是上面红线圈起来的三个组件,其他的我们暂时先不关注,下面对这三个组件做个简单的介绍。
组件名称 | 描述 |
curator-framework | Zookeeper API的高层封装,大大简化Zookeeper客户端编程,添加了例如Zookeeper连接管理、重试机制等。 |
curator-recipes | Zookeeper典型应用场景(分布式锁、分布式计数器、leader选举等)的实现,这些实现是基于Curator Framework。 |
curator-client | Zookeeper client的封装,用于取代原生的Zookeeper客户端(ZooKeeper类),提供一些非常有用的客户端特性 |
3.curator API CRUD 操作zookeeper
直接上代码
<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>5.2.0</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>5.2.0</version> </dependency>
package com.gtmap.example.zookeepercuratorexample; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.retry.ExponentialBackoffRetry; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.data.Stat; /** * @author <a href="mailto:liujie@gtmap.cn">liujie</a> * @version 1.0, 2021/9/7 * @description curator客户端CRUD操作Zookeeper */ public class CuratorOperationExample { private CuratorFramework curatorFramework; public CuratorOperationExample() { //创建客户端连接 curatorFramework = CuratorFrameworkFactory .builder() .connectString("192.168.50.89:2181") .connectionTimeoutMs(20000) .sessionTimeoutMs(15000) .retryPolicy(new ExponentialBackoffRetry(1000,3)) .build(); //启动客户端 curatorFramework.start(); } /** * @author <a href="mailto:liujie@gtmap.cn">liujie</a> * @param * @return * @description 节点进行CRUD操作 */ private void nodeCRUD() throws Exception { System.out.println("节点开始进行CRUD操作"); //创建节点 String value = "Hello World"; String node=curatorFramework.create() .creatingParentsIfNeeded() .withMode(CreateMode.PERSISTENT) .forPath("/node",value.getBytes()); System.out.println("节点创建成功:"+node); //获取节点的value Stat stat = new Stat(); byte[] data = curatorFramework.getData().storingStatIn(stat).forPath(node); System.out.println("节点value值:" + new String(data)); //修改节点value stat = curatorFramework .setData() //指定节点版本号,如果版本号不匹配则无法更新节点数据 .withVersion(stat.getVersion()) .forPath(node,"Update Date Result".getBytes()); String result = new String(curatorFramework.getData().forPath(node)); System.out.println("修改节点之后的数据:" + result); //删除节点 System.out.println("开始删除节点"); curatorFramework.delete().forPath(node); //判断节点是否存在 Stat existStat = curatorFramework.checkExists().forPath(node); if(existStat == null) { System.out.println("节点删除成功"); } System.out.println("节点结束进行CRUD操作"); } public static void main(String[] args) throws Exception { CuratorOperationExample curatorOperationExample = new CuratorOperationExample(); curatorOperationExample.nodeCRUD(); } }