
./bin./zkCli.sh -server ip:portls /create /app1 speederget /app1命令,如果作为注册中心,获取节点的数据信息中会有providers、consumers等,消费者也是根据这些数据进行远程调用。set /app1 speeder-testdelete /app1create -e /app2create -esls -s /节点路径得到的结果说明如下:
dataVersion属性,表示数据的版本信息,每一次修改后,都会自增1,就可以每次更新时,先使用getVersion()方法获取dataVersion,然后再使用withVersion(version)方法修改数据。gurantted()方法,确保如果删除失败后,可以重试。另外删除成功后可以有手工回调函数。写写代码,Curator api操作:
// 1、创建监听对象
NodeCache nodeCache = new NodeCache(client, "/test");
// 2、设置监听器
nodeCache.getListenable().addListener(new NodeCacheListener() {
@Override
public void nodeChanged() throws Exception {
System.out.println("节点发生改变");
try {
byte[] bytes = nodeCache.getClient().getData().forPath(nodeCache.getPath());
System.out.println(new String(bytes));
}catch (Exception e){
System.out.println("节点异常,可能已经删除");
e.printStackTrace();
}
}
});
// 3、开启
nodeCache.start();
// 1、创建监听对象
PathChildrenCache pathChildrenCache = new PathChildrenCache(client,"/test1",true);
// 2、绑定个监听器
pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
System.out.println("节点发生了改变");
// 如果变更,才打印
if(pathChildrenCacheEvent.getType().equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){
byte[] data = pathChildrenCacheEvent.getData().getData();
System.out.println(new String(data));
}
}
});
// 3、开启
pathChildrenCache.start();
TreeCache treeCache = new TreeCache(client,"/test1");
treeCache.getListenable().addListener(new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework curatorFramework, TreeCacheEvent treeCacheEvent) throws Exception {
System.out.println("节点改变了");
if (treeCacheEvent.getType().equals(TreeCacheEvent.Type.NODE_UPDATED)){
System.out.println(new String(treeCacheEvent.getData().getData()));
}
}
});
treeCache.start();
分布式锁实现的常见方式:
Zookeeper分布式锁的实现原理:
临时顺序节点。例如有三个客户端client,分别在lock节点下分别创建了三个临时顺序子节点ZNode1、Znode2、znode3。为什么强调是临时顺序的?

模拟抢票场景,进行分布式加锁:
public class BookTicket implements Runnable{
private int tickets = 100;// 票数
private InterProcessMutex lock ;
public BookTicket(){
//重试策略
RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 10);
//2.第二种方式
//CuratorFrameworkFactory.builder();
CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString("localhost:2181")
.sessionTimeoutMs(60 * 1000)
.connectionTimeoutMs(15 * 1000)
.retryPolicy(retryPolicy)
.build();
//开启连接
client.start();
lock = new InterProcessMutex(client,"/lock");
}
@Override
public void run() {
while(true){
//获取锁
try {
lock.acquire(3, TimeUnit.SECONDS);
if(tickets > 0){
System.out.println(Thread.currentThread()+":"+tickets);
Thread.sleep(100);
tickets--;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//释放锁
try {
lock.release();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
集群中Leader选举:(leader/follower)
zk集群配置(zk单节点正常搭建完毕后,配置集群):
echo 1 >/app/zk-cluster/zk-1/data/myid
echo 2 >/app/zk-cluster/zk-2/data/myid
vim /app/zk-cluster/zk-1/conf/zoo.cfg
vim /app/zk-cluster/zk-2/conf/zoo.cfg
server.1=localhost:2881:3881
server.1=localhost:2882:3882
注意:各位是server.服务器ID=服务器IP:服务节点之间通信端口:服务节点之间投票选举端口
./bin/zkserver.sh startps:集群中常用的主节点、从节点的词汇对: