Linux端
1 启动: ./zkServer.sh start
2 停止:./zkServer.sh stop
3 查看状态:./zkServer.sh status
4 重启:./zkServer.sh restart
5 链接:./zkCli.sh -server ip:port
6 创建节点:create -e(临时) -s(有序) /节点名 value
7 设置节点:set /节点名 value
8 删除节点:delete /节点名 或者 deleteall /节点名 (这是带有子节点的)
Java API
pom文件
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</dependency>
第一步创建客户端
//重试策略
RetryPolicy rep=new ExponentialBackoffRetry(3000, 10);
//创建客户端
CuratorFramework cli=CuratorFrameworkFactory.builder().connectString("192.168.107.129:2181").sessionTimeoutMs(60*1000).connectionTimeoutMs(15*1000).retryPolicy(rep).namespace("curatorCre").build();
//启动客户端
cli.start();
创建节点
//1、基本创建,如果没有指定数据则把当前机器的ip地址保存到app1下
cli.create().forPath("/app1");
//2、创建带数据的
cli.create().forPath("/app2","haha".getBytes());
//3、创建不同类型的节点
cli.create().withMode(CreateMode.EPHEMERAL).forPath("/app3","heihei".getBytes());
//4、创建多级节点
cli.create().creatingParentsIfNeeded().forPath("/app3/3son","duoji".getBytes());
查询节点
//1、得到这个节点下的值
byte[] bak = cli.getData().forPath("/app1");
System.out.println(new String(bak));
//2、得到子节点名
List<String> sonPath = cli.getChildren().forPath("/app3");
System.out.println(sonPath);
//3、获取这个节点的信息
Stat st=new Stat();
cli.getData().storingStatIn(st).forPath("/app1");
System.out.println(st);
修改节点
//1、直接修改
cli.setData().forPath("/app1","changele".getBytes());
//2、根据版本号修改
Stat st=new Stat();
cli.getData().storingStatIn(st).forPath("/app1");
int flag=st.getVersion();
cli.setData().withVersion(flag).forPath("/app1","lele".getBytes());
删除节点
//1、直接删除
cli.delete().forPath("/app1");
//2、删除带子节点的
cli.delete().deletingChildrenIfNeeded().forPath("/app3");
//3、必须成功删除
cli.delete().guaranteed().forPath("/app1");
//4、删除后的回调
cli.delete().guaranteed().inBackground(new BackgroundCallback() {
public void processResult(CuratorFramework cli, CuratorEvent event) throws Exception {
System.out.println("我被删除了");
System.out.println(event);
}
}).forPath("/app2");
监听节点(仅自己)
//创建NodeCache对象
final NodeCache cache=new NodeCache(cli,"/app2");
//注册监听
cache.getListenable().addListener(new NodeCacheListener() {
@Override
public void nodeChanged() throws Exception {
//获取变化后内容
byte[] b=cache.getCurrentData().getData();
System.out.println("节点变化后内容:"+new String(b));
}
});
//开启监听
cache.start(true);
监听子节点(不包括自己)
//创建监听对象
PathChildrenCache pp=new PathChildrenCache(cli, "/app3", false);
//绑定监听器
pp.getListenable().addListener(new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework cli, PathChildrenCacheEvent event) {
System.out.println("子节点变化了"+event);
Type type = event.getType();
if(type.equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){
System.out.println("数据变了");
byte[] b=event.getData().getData();
System.out.println(new String(b));
}
}
});
pp.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE);
监听子孙节点
TreeCache tree=new TreeCache(cli,"/app2");
tree.getListenable().addListener(new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework cli, TreeCacheEvent event) {
System.out.println(event);
}
});
tree.start();
分布式锁
//静态代码块
{
//重试策略
RetryPolicy rep=new ExponentialBackoffRetry(3000, 10);
CuratorFramework cli=CuratorFrameworkFactory.builder().
connectString("192.168.107.129:2181").sessionTimeoutMs(60*1000).
connectionTimeoutMs(15*1000).retryPolicy(rep).build();
cli.start();
}
//创建锁对象
InterProcessMutex lock=new InterProcessMutex(cli, "/lock");
public void setLock(){
try {
//获取锁
lock.acquire(5, TimeUnit.SECONDS);
System.out.println("获取到锁,开始任务");
Thread.sleep(3000);
System.out.println("执行完毕");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
//释放锁
lock.release();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}