设为首页 收藏本站
查看: 574|回复: 0

[经验分享] Apache curator-frameworker简述

[复制链接]

尚未签到

发表于 2017-1-4 06:28:25 | 显示全部楼层 |阅读模式
    Apachecurator-framework是一个高层API,对curator-client组件进行了二次封装,开发者可以更少的关注zookeeper底层,进行快捷的开发.
    特性一览:


  • 链接管理: 框架已经兼容了zookeeper网络链接异常问题,并提供了自动重连机制.
  • 简洁的API设计: fluent风格API(最大亮点),大部分API中已经兼容了zookeeper操作异常问题.
  • 事件通知: 对于wather的注册/管理,以及事件处理,一致都比较繁琐,在framework中,这个工作将变得简单.
  • 提供了基于异步操作,和zk异常控制.

1. 创建Client


CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder();
// fluent style
String namespace = "cluster-worker";//命名空间,会被作为所有path的前缀自动补全.
// FixedEnsembleProvider
CuratorFramework client = builder.connectString("127.0.0.1:2181")
.sessionTimeoutMs(30000)
.connectionTimeoutMs(30000)
.canBeReadOnly(false)
.retryPolicy(new ExponentialBackoffRetry(1000, Integer.MAX_VALUE))
.namespace(namespace)
.aclProvider(new MappedACLProvider())
.defaultData(null)
.build();
// client中无法直接指定watcher(即defaultWatcher),因为框架需要使用这个watcher来处理与链接有关的异常
// 开发者可以通过如下方式指定
CuratorListener listener = new CuratorListener() {
@Override
public void eventReceived(CuratorFramework client, CuratorEvent event) throws Exception {
if(event == null){
return;
}
if(CuratorEventType.CLOSING == event.getType()){
System.out.println("Client will be closed!");
}else{
System.out.println("CuratorEvent type:" + event.getType().toString());
System.out.println("CuratorEvent path:" + event.getPath());
}
}
};
client.getCuratorListenable().addListener(listener);
client.start();
//....
//client.close()


在client中注册的listener或者backgroundCallback将会在两个单独的线程中运行.当zookeeper操作有任何事件触发时,都会执行listener.eventReceived()方法.


2. 创建节点("异步"方式) 
EnsurePath ensure = client.newNamespaceAwareEnsurePath(namespace);
ensure.ensure(client.getZookeeperClient());
// -----------create a node------------
// use async style
// for time trace
BackgroundCallback callback = new BackgroundCallback() {
@Override
public void processResult(CuratorFramework client, CuratorEvent event) throws Exception {
Long begin = (Long) event.getContext();
Long end = System.currentTimeMillis();
System.out.println("<Time>:" + (end - begin) + "ms");
//check result
Code rc = Code.get(event.getResultCode());
if(rc != Code.OK){
System.out.println("Background operation fail,path:" + event.getPath() + ";Message:" + KeeperException.create(rc).getMessage());
}
}
};
long current = System.currentTimeMillis();
String value = "test-" + current;
client.create()
.creatingParentsIfNeeded()
.withMode(CreateMode.PERSISTENT)
.inBackground(callback, current)
.forPath("/test/0", value.getBytes("utf-8"));
    create操作以异步的方式执行,此时"create操作"将会被封装成一个Operation而提交到线程池中,无论操作执行是否成功或者抛出异常,都执行BackgroundCallback;对于开发者而言,需要在callback中处理"失败"情况.
 
3. getData和注册watcher

// ----------getData---------------
// register a watcher
// only print something
CuratorWatcher dataWatcher = new CuratorWatcher() {
@Override
public void process(WatchedEvent event) throws Exception {
System.out.println("path:" + event.getPath());
EventType eventType = event.getType();
if (eventType == EventType.None) {
KeeperState state = event.getState();
System.out.println(state.toString());
} else {
System.out.println(eventType.toString());
}
}
};
Stat stat = new Stat();
byte[] data = client.getData().storingStatIn(stat).usingWatcher(dataWatcher).forPath("/test/0");
System.out.println("version:" + stat.getVersion());
System.out.println("data:" + new String(data));
4. 事务

// trasaction
CuratorTransaction tx = client.inTransaction();
tx.delete().forPath("/test/0")
.and()
.create().forPath("/test/01")
.and()
.commit();
   
    使用frameworker开发zookeeper程序,已经相当简单了,开发者无需过度关注"链接异常"等问题. 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-323381-1-1.html 上篇帖子: Apache+Tomcat虚拟主机配置 下篇帖子: org.apache.lucene.index.IndexWriterConfig
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表