1.软文推荐

2.软文推荐

3.软文推荐

目录: 1、curator里面的NodeCache监听节点,怎么获取触发事件 2、如何使用Curator监听zookeeper事件变化 3、dubbo使用zookeeper连接,zookeeper宕机后怎么处理 4、如何使用cruator监听zookeeper事件变化 5、如何使用Cruator监听zookeeper事件变化 6、Curator简介 curator里面的NodeCache监听节点,怎么获取触发事件

判断节点是新增、修改还是删除应该通过PathChildrenCache来处理,PathChildrenCacheListener有event参数,

NodeCache和NodeCacheListener是监听节点内容变更的,直接通过cn.getCurrentData().data()可以获得节点最新内容

如何使用Curator监听zookeeper事件变化

1,配置文件同步

2,主从切换

3,分布式队列

4,分布式锁

5,其他

在以前的文章里面有写过使用zookeeper原生的api,监听zk节点变化,那么本篇我们就来看下,如何使用curator来完成监听,代码如下:

pre name="code" class="java"package com.qin.curator.zk;

import javax.sound.midi.Patch;

import org.apache.curator.RetryPolicy;

import org.apache.curator.framework.CuratorFramework;

import org.apache.curator.framework.CuratorFrameworkFactory;

import org.apache.curator.framework.CuratorFrameworkFactory.Builder;

import org.apache.curator.framework.api.CuratorWatcher;

import org.apache.curator.framework.recipes.cache.NodeCache;

import org.apache.curator.framework.recipes.cache.NodeCacheListener;

import org.apache.curator.framework.recipes.cache.PathChildrenCache;

import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;

import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;

import org.apache.curator.retry.ExponentialBackoffRetry;

import org.apache.curator.utils.ZKPaths;

import org.apache.zookeeper.WatchedEvent;

/**

*

:2181";//zk的host

RetryPolicy rp=new E

dubbo使用zookeeper连接,zookeeper宕机后怎么处理

zookeeper宕机后,因为消费者会缓存提供者的信息,所以应用不会有问题。但是,此时提供者和消费者都无法重连zookeeper,因为dubbo貌似配置的zkclient不会重连zookeeper,所以一旦重启一台服务提供者,那么这台就从服务消费者的缓存中消失了,此时服务消费者又连不上zookeeper,所以如果同时重启,消费者就没有提供者可用了,所以只能重启一台提供者后,再重启一个消费者,交错重启。如何使用cruator监听zookeeper事件变化

掌握zookeeper事件监听机制,非常重要,可以说是跨入了进阶的门槛,只有掌握了如何监听某个节点或路径,我们才能在节点变化后,做一些我们想做的事,包括: 1,配置文件同步 2,主从切换 3,分布式队列 4,分布式锁 5,其他 散仙,在以前的文章里面有写过使用zookeeper原生的api,监听zk节点变化,那么本篇我们就来看下,如何使用curator来完成监听,代码如下: pre name="code" class="java"package com.qin.curator.zk; import javax.sound.midi.Patch; import org.apache.curator.RetryPolicy; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.framework.CuratorFrameworkFactory.Builder; import org.apache.curator.framework.api.CuratorWatcher; import org.apache.curator.framework.recipes.cache.NodeCache; import org.apache.curator.framework.recipes.cache.NodeCacheListener; import org.apache.curator.framework.recipes.cache.PathChildrenCache; import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent; import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener; import org.apache.curator.retry.ExponentialBackoffRetry; import org.apache.curator.utils.ZKPaths; import org.apache.zookeeper.WatchedEvent; /** * * 使用curator监听zookeeper节点 * @author qindongliang * **/ public class CuratorWatch { static CuratorFramework zkclient=null; static String nameSpace="php"; static { String zkhost="192.168.46.22:2181";//zk的host RetryPolicy rp=new ExponentialBackoffRetry(1000, 3);//重试机制 Builder builder = CuratorFrameworkFactory.builder().connectString(zkhost) .connectionTimeoutMs(5000) .sessionTimeoutMs(5000) .retryPolicy(rp); builder.namespace(nameSpace); CuratorFramework zclient = builder.build(); zkclient=zclient; zkclient.start();// 放在这前面执行 zkclient.newNamespaceAwareEnsurePath(nameSpace); } public static void main(String[] args) throws Exception{ watch(); Thread.sleep(Long.MAX_VALUE); } /** * * 监听节点变化 * * */ public static void watch()throws Exception{ PathChildrenCache cache = new PathChildrenCache(zkclient, "/zk", false); cache.start(); System.out.println("监听开始/zk........"); PathChildrenCacheListener plis=new PathChildrenCacheListener() { @Override public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception { switch ( event.getType() ) { case CHILD_ADDED: { System.out.println("Node added: " + ZKPaths.getNodeFromPath(event.getData().getPath())); break; } case CHILD_UPDATED: { System.out.println("Node changed: " + ZKPaths.getNodeFromPath(event.getData().getPath())); break; } case CHILD_REMOVED: { System.out.println("Node removed: " + ZKPaths.getNodeFromPath(event.getData().getPath())); break; } } } }; //注册监听 cache.getListenable().addListener(plis); } } /pre 运行后的控制台打印: pre name="code" class="java"18:33:07.722 [main] INFO o.a.c.f.imps.CuratorFrameworkImpl - Starting 18:33:07.727 [main] DEBUG o.a.curator.CuratorZookeeperClient - Starting 18:33:07.727 [main] DEBUG org.apache.curator.ConnectionState - Starting 18:33:07.727 [main] DEBUG org.apache.curator.ConnectionState - reset 18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT 18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:host.name=QINDONGLIANG.dhgatecn.msf 18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.version=1.7.0_04 18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.vendor=Oracle Corporation 18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.home=D:Javajdk1.7.0_04jre 18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.class.path=D:eclipseworkspace2ywopzkin;D:eclipseworkspace2ywopzklibcurator-client-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-examples-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-framework-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-recipes-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-test-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-x-discovery-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-x-discovery-server-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-x-rpc-2.6.0.jar;D:eclipseworkspace2ywopzkliblog4j-1.2.15.jar;D:eclipseworkspace2ywopzklibzookeeper-3.4.5.jar;D:eclipseworkspace2ywopzklibcommons-io-2.1.jar

如何使用Cruator监听zookeeper事件变化

掌握zookeeper事件监听机制,非常重要,可以说是跨入了进阶的门槛,只有掌握了如何监听某个节点或路径,我们才能在节点变化后,做一些我们想做的事,包括:

1,配置文件同步

2,主从切换

3,分布式队列

4,分布式锁

5,其他

首先,在以前的文章里面有写过使用zookeeper原生的api,监听zk节点变化,那么本篇我们就来看下,如何使用curator来完成监听,代码如下:

pre name="code" class="java"package com.qin.curator.zk;

import javax.sound.midi.Patch;

import org.apache.curator.RetryPolicy;

import org.apache.curator.framework.CuratorFramework;

import org.apache.curator.framework.CuratorFrameworkFactory;

import org.apache.curator.framework.CuratorFrameworkFactory.Builder;

import org.apache.curator.framework.api.CuratorWatcher;

import org.apache.curator.framework.recipes.cache.NodeCache;

import org.apache.curator.framework.recipes.cache.NodeCacheListener;

import org.apache.curator.framework.recipes.cache.PathChildrenCache;

import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;

import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;

import org.apache.curator.retry.ExponentialBackoffRetry;

import org.apache.curator.utils.ZKPaths;

import org.apache.zookeeper.WatchedEvent;

/**

*

* 使用curator监听zookeeper节点

* @author qindongliang

* **/

public class CuratorWatch {

static CuratorFramework zkclient=null;

static String nameSpace="php";

static {

String zkhost="192.168.46.22:2181";//zk的host

RetryPolicy rp=new ExponentialBackoffRetry(1000, 3);//重试机制

Builder builder = CuratorFrameworkFactory.builder().connectString(zkhost)

.connectionTimeoutMs(5000)

.sessionTimeoutMs(5000)

.retryPolicy(rp);

builder.namespace(nameSpace);

CuratorFramework zclient = builder.build();

zkclient=zclient;

zkclient.start();// 放在这前面执行

zkclient.newNamespaceAwareEnsurePath(nameSpace);

}

public static void main(String[] args) throws Exception{

watch();

Thread.sleep(Long.MAX_VALUE);

}

/**

*

* 监听节点变化

*

* */

public static void watch()throws Exception{

PathChildrenCache cache = new PathChildrenCache(zkclient, "/zk", false);

cache.start();

System.out.println("监听开始/zk........");

PathChildrenCacheListener plis=new PathChildrenCacheListener() {

@Override

public void childEvent(CuratorFramework client, PathChildrenCacheEvent event)

throws Exception {

switch ( event.getType() )

{

case CHILD_ADDED:

{

System.out.println("Node added: " + ZKPaths.getNodeFromPath(event.getData().getPath()));

break;

}

case CHILD_UPDATED:

{

System.out.println("Node changed: " + ZKPaths.getNodeFromPath(event.getData().getPath()));

break;

}

case CHILD_REMOVED:

{

System.out.println("Node removed: " + ZKPaths.getNodeFromPath(event.getData().getPath()));

break;

}

}

}

};

//注册监听

cache.getListenable().addListener(plis);

}

}

/pre

运行后的控制台打印:

pre name="code" class="java"18:33:07.722 [main] INFO o.a.c.f.imps.CuratorFrameworkImpl - Starting

18:33:07.727 [main] DEBUG o.a.curator.CuratorZookeeperClient - Starting

18:33:07.727 [main] DEBUG org.apache.curator.ConnectionState - Starting

18:33:07.727 [main] DEBUG org.apache.curator.ConnectionState - reset

18:33:07.734

[main] INFO org.apache.zookeeper.ZooKeeper - Client

environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09

GMT

18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:host.name=QINDONGLIANG.dhgatecn.msf

18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.version=1.7.0_04

18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.vendor=Oracle Corporation

18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.home=D:Javajdk1.7.0_04jre

18:33:07.734

[main] INFO org.apache.zookeeper.ZooKeeper - Client

environment:java.class.path=D:eclipseworkspace2ywopzkin;D:eclipseworkspace2ywopzklibcurator-client-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-examples-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-framework-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-recipes-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-test-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-x-discovery-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-x-discovery-server-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-x-rpc-2.6.0.jar;D:eclipseworkspace2ywopzkliblog4j-1.2.15.jar;D:eclipseworkspace2ywopzklibzookeeper-3.4.5.jar;D:eclipseworkspace2ywopzklibcommons-io-2.1.jar

Curator简介

一、Curator是NetFlix公司开源的一套Zookeeper客户端框架,其特点如下:

1、连接重连

2、反复注册Watcher

3、NodeExistsException处理

二、常用API

API文档对应地址:

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);//Zookeeper每1秒检查一次session状态,如果断掉的话,重新连接,如果连续3次均没连上,则session失效

CuratorFramework client = CuratorFrameworkFactory.newClient(connectingString,sessionTimeout,connectionTimeOut,retryPolicy);

//创建节点

client.create().forPath(path);

//创建节点并设置值

client.create().forPath(path,"init".getBytes());

//创建临时节点

client.create().withMode(CreateMode.EPHEMERAL).forPath(path);

//创建临时节点并递归创建父节点

client.create().creatingParentContainersIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path);

//删除节点

client.delete().forPath(path);

//删除节点并递归删除其所有子节点

client.delete().deletingChildrenIfNeeded().forPath(path);

//删除节点,强制指定版本进行删除

client.delete().withVersion(version).forPath(path);

//强制保证删除

client.delete().guaranteed().forPath(path);

//获取某个节点数据

client.getData().forPath(path);

//读取一个节点的数据内容,同时按获取到该节点的stat

Stat stat = new Stat();

client.getData().storingStatIn(stat).forPath(path);

//更新一个节点的数据内容

client.setData().withVersion(version).forPath(path);

//异步

client.create().creatingParentsIfNeeded().inBackground(new BackgroundCallback() {

    @Override

    public void processResult(CuratorFramework curatorFramework, CuratorEvent curatorEvent) throws Exception {

    }

}).forPath(path,"init".getBytes());

三、监听器

1、NodeCache:监听节点变化

NodeCache cache = new NodeCache(client,path,false);

cache.start(true); //第一次启动的时候就会从Zookeeper上同步数据

cache.getListenable().addListener(new NodeCacheListener() {

@Override

public void nodeChanged() throws Exception {

  System.out.println(cache.getCurrentData().getData());

}

});

2、PathChildrenCache:监控某个节点子节点的变化【无法对父节点以及二级节点数据进行监控】

PathChildrenCache childrenCache = new PathChildrenCache(client,path,true);

childrenCache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);

childrenCache.getListenable().addListener(new PathChildrenCacheListener() {

@Override

public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {

  System.out.println("节点变更类型:"+pathChildrenCacheEvent.getType()+"对应节点:"+pathChildrenCacheEvent.getData().getPath());

}

});

四、LeaderLatch

LeaderLatch⽤于实现Leader的选举

– 触发方法isLeader(),表示成为leader

– 触发notLeader(),表示失去leader权限

– 场景:参考xxx-callback

public void afterPropertiesSet() throws Exception {

if (leaderLatch != null) {

  return;

}

leaderLatch = new LeaderLatch(curatorClient,//zk客户端实例

  PATH,//选举根节点路径

  OSUtils.getServerIp() + "_" + UUID.randomUUID().toString()); //客户端ID,用来标记客户端,即客户端编号,名称

leaderLatch.addListener(new LeaderLatchListener() {

  @Override

  public void isLeader() { //抢主成功时触发

  ContextHolder.setLeader(true);

  LOGGER.info("im leader");

  }

  @Override

  public void notLeader() { //抢主失败时触发

  ContextHolder.setLeader(false);

  LOGGER.info("im not leader");

  }

});

leaderLatch.start();

}

五、分布式锁

1、模拟并发

CountDownLatch countDownLatch = new CountDownLatch(1);

for (int i=0;i10;i++){

new Thread(new Runnable() {

  @Override

  public void run() {

  try {

    countDownLatch.await();

  }catch (Exception e){

  }

  System.out.println(System.currentTimeMillis());

  }

}).start();

}

countDownLatch.countDown();

2、分布式锁控制

client.start();

String lock_path = "/lock";

final InterProcessMutex lock = new InterProcessMutex(client,lock_path);

CountDownLatch countDownLatch = new CountDownLatch(1);

for (int i=0;i10;i++){

new Thread(new Runnable() {

  @Override

  public void run() {

  try {

    countDownLatch.await();

    lock.acquire();

  }catch (Exception e){

  }

  System.out.println(System.currentTimeMillis());

  try {

    lock.release();

  } catch (Exception e) {

    e.printStackTrace();

  }

  }

}).start();

}

countDownLatch.countDown();

六、分布式计数器

DistributedAtomicInteger atomicInteger = new DistributedAtomicInteger(client,path,new RetryNTimes(1000,3));

atomicInteger.add(8);

思考:

1、开关同步采用Zookeeper是否可以 ?

2、ABTest?

3、分批任务计算?

4、配置中心

相关文章 8

1

阿里云学生套餐(阿里云服务器学生套餐) 55秒前

目录:1、学生服务器是干什么用的?2、哥哥们,有什么流量卡可以推荐给学生用的?能不能有人告诉一下的啊?3、阿里云学生主机如何续...

3

高端seo外包公司必选品达优化(品达物流项目) 4分钟前

目录:1、企业为何要选择SEO外包优化公司?2、网站优化公司哪家好?要服务好,牢靠的3、如何选择一家正确的SEO外包公司4、太原高端seo外...

4

关于localhost什么意思的信息 7分钟前

目录:1、什么是Localhost?2、localhost,127.0.0.1,本机IP,三者的区别是什么?3、蹭网名单中localhost用户名是什么意思,是自己的无线路由器用...

5

proxmox(proxmox中文官网) 9分钟前

目录:1、Proxmox配置虚拟桌面2、proxmox映射硬盘的休眠控制3、proxmox 使用4、proxmox网络重置命令5、Proxmox 默认账号是啥Proxmox配置虚拟桌面 1、...

6

搬瓦工(搬瓦工just my socks) 11分钟前

目录:1、搬瓦工废了吗2、搬瓦工怎么收费3、搬瓦工作图床怎么样搬瓦工废了吗 搬瓦工没有废。搬瓦工属于力工。属于必要的人力,现在有...

7

宁波全网seo优化极速建站(宁波seo搜索排名优化) 12分钟前

目录:1、宁波seo在线优化哪家好2、宁波seo优化哪家专业3、宁波seo网络优化哪家好4、宁波网站seo哪家好5、宁波seo排名优化公司有哪些6、宁...