使用curator框架简单操作zookeeper 学习笔记
Curator 操作是zookeeper的优秀api(相对于原生api),满足大部分需求.而且是Fluent流式api风格.
参考文献:https://www.jianshu.com/p/70151fc0ef5d 感谢分享,动手敲一遍留个印象
curator-framework:对zookeeper的底层api的一些封装
curator-client:提供一些客户端的操作,例如重试策略等
curator-recipes:封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式计数器、分布式Barrier等
环境:JDK1.8 、maven 、启动三台虚拟机做分部署环境 、 curator-recipes 4.0.1 、zookeeper3.4.8
maven 依赖:不依赖zookeeper会报错..
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
测试增删改查:
package com.zookeeper.curator; import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode; import java.util.List; /**
* Created by Administrator on 2018/6/25.
* @see org.apache.zookeeper.CreateMode
* PERSISTENT:持久化
PERSISTENT_SEQUENTIAL:持久化并且带序列号
EPHEMERAL:临时
EPHEMERAL_SEQUENTIAL:临时并且带序列号
*/
public class curatorRecipesDemo { final static String zookeeperAddress = "192.168.149.133:2181,192.168.149.135:2181,192.168.149.134:2181"; public static void main(String[] args) throws Exception {
CuratorFramework curatorClint =
CuratorFrameworkFactory.builder().
connectString(zookeeperAddress)//zkClint连接地址
.connectionTimeoutMs(2000)//连接超时时间
.sessionTimeoutMs(10000)//会话超时时间
.retryPolicy(new ExponentialBackoffRetry(1000, 3))
//重试策略
.namespace("myZookeeperTest")
//命名空间,默认节点
.build(); curatorClint.start(); curatorClint.create().forPath("/path");//默认持久化节点,以斜杠开头
System.out.println(curatorClint.getChildren().forPath("/"));
curatorClint.create().withMode(CreateMode.EPHEMERAL)
.forPath("/secondPath","hello,word".getBytes());
System.out.println("节点secondPath的数据"+new String(curatorClint.getData().forPath("/secondPath")));
curatorClint.setData().forPath("/secondPath","hello,myWorld!".getBytes());
System.out.println("节点secondPath的数据"+new String(curatorClint.getData().forPath("/secondPath"))); curatorClint.create()
.creatingParentContainersIfNeeded()
.forPath("/secondPath/second2/second3");//递归创建
List<String> list= curatorClint.getChildren().forPath("/secondPath");//查询节点的所有字节点
System.out.println(list);
curatorClint.delete().deletingChildrenIfNeeded().forPath("/secondPath/second2");//递归删除
System.out.println(curatorClint.checkExists().forPath("/secondPath/second2"));//判断节点是否存在
System.out.println(curatorClint.checkExists().forPath("/secondPath/second2/second3"));//判断节点是否存在
System.out.println(curatorClint.getChildren().forPath("/secondPath"));
curatorClint.delete().deletingChildrenIfNeeded().forPath("/secondPath"); //todo guaranteed()如果删除失败,会记录下来,只要会话有效,就会不断的重试,直到删除成功为止
//todo Stat stat 对象包含版本id,事物id等信息 } }
创建的节点可以通过 zookeeper 安装下的bin目录 连接客户端 sh zkCli.sh ls / 分开斜杠命令进行查看(或./zkCli.sh -timeout 5000 -server 127.0.0.1:2181)
监听watcer api
package com.zookeeper.curator; import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.*;
import org.apache.curator.retry.ExponentialBackoffRetry; import java.util.List;
import java.util.Objects; /**
* Created by Administrator on 2018/6/26.
*
* PathChildCache 监听一个节点下子节点的创建、删除、更新
* NodeCache 监听一个节点的更新和创建事件
* TreeCache 综合PatchChildCache和NodeCache的特性
*/
public class WatcherDemo {
final static String zookeeperAddress = "192.168.149.133:2181,192.168.149.135:2181,192.168.149.134:2181"; public static void main(String[] args) throws Exception {
CuratorFramework curatorClint =
CuratorFrameworkFactory.builder().
connectString(zookeeperAddress)//zkClint连接地址
.connectionTimeoutMs(2000)//连接超时时间
.sessionTimeoutMs(10000)//会话超时时间
.retryPolicy(new ExponentialBackoffRetry(1000, 3))
//重试策略
.namespace("myZookeeperTest")
//命名空间,默认节点
.build(); curatorClint.start();
List<String> list= curatorClint.getChildren().forPath("/");
if(Objects.nonNull(list)){
if( !list.contains("myWatch")){
curatorClint.delete().deletingChildrenIfNeeded().forPath("/myWatch");
}
}else {
curatorClint.create().forPath("/myWatch");
} PathChildrenCache pathChildrenCache= pathChildrenCache = new PathChildrenCache(curatorClint,"/myWatch",false);
PathChildrenCacheListener pathChildrenCacheListener=new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
System.out.println("pathChildrenCacheListener::::->"+pathChildrenCacheEvent.getData());
}
};
pathChildrenCache.getListenable().addListener(pathChildrenCacheListener);//注册监听事件
pathChildrenCache.start(); NodeCache nodeCache=new NodeCache(curatorClint,"/myWatch",false);
NodeCacheListener nodeCacheListener=new NodeCacheListener() {
@Override
public void nodeChanged() throws Exception {
System.out.println("nodeCacheListener::::->:"+nodeCache.getCurrentData().getPath());
}
};
nodeCache.getListenable().addListener(nodeCacheListener);
nodeCache.start(); TreeCache treeCache=new TreeCache(curatorClint,"/myWatch");
TreeCacheListener treeCacheListener=new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework curatorFramework, TreeCacheEvent treeCacheEvent) throws Exception {
System.out.println("treeCacheListener::::->"+treeCacheEvent.getData());
}
};
treeCache.getListenable().addListener(treeCacheListener);
treeCache.start(); curatorClint.create().forPath("/myWatch/child22","生个好孩子".getBytes());
curatorClint.create().creatingParentContainersIfNeeded().forPath("/myWatch/child22/child22","生个好孩子".getBytes());
curatorClint.setData().forPath("/myWatch/child222","生个好孩子aaaa".getBytes());
System.in.read();//阻塞不然启动后clint就关掉了
} }
使用curator框架简单操作zookeeper 学习笔记的更多相关文章
- ZooKeeper学习笔记三:使用ZooKeeper实现一个简单的配置中心
作者:Grey 原文地址:ZooKeeper学习笔记三:使用ZooKeeper实现一个简单的配置中心 前置知识 完成ZooKeeper集群搭建以及熟悉ZooKeeperAPI基本使用 需求 很多程序往 ...
- ZooKeeper学习笔记四:使用ZooKeeper实现一个简单的分布式锁
作者:Grey 原文地址: ZooKeeper学习笔记四:使用ZooKeeper实现一个简单的分布式锁 前置知识 完成ZooKeeper集群搭建以及熟悉ZooKeeperAPI基本使用 需求 当多个进 ...
- ZooKeeper 学习笔记
ZooKeeper学习笔记 1. zookeeper基本概念 zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是hadoop和Habase的重要组件,是为分布式应用提供一致性服 ...
- delphi操作xml学习笔记 之一 入门必读
Delphi 对XML的支持---TXMLDocument类 Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocum ...
- ZooKeeper学习笔记(二)——内部原理
zookeeper学习笔记(二)--内部原理 1. zookeeper的节点的类型 总的来说可以分为持久型和短暂型,主要区别如下: 持久:客户端与服务器端断开连接的以后,创建的节点不会被删除: 持久化 ...
- Zookeeper学习笔记(中)
Zookeeper学习笔记(中) Zookeeper的基本原理和基本实现 深入了解ZK的基本原理 ZK的一致性: ZAB 协议: Zookeeper 原子消息广播协议 ZK通过选举保证 leader ...
- Zookeeper学习笔记(上)
Zookeeper学习笔记 本篇主要是一些基本的介绍和API的使用介绍, 有些只是记录了知识点,而没有完全在笔记中详细解释, 需要自行查找资料补充相关概念 主要参考了课程中的内容: Zookeeper ...
- PHP操作MongoDB学习笔记
<?php/*** PHP操作MongoDB学习笔记*///*************************//** 连接MongoDB数据库 **////*************** ...
- Flas-SQLAchemy数据库操作使用学习笔记
Flas-SQLAchemy数据库操作使用学习笔记 Flask-SQLALchemy 是一个给你的应用添加 SQLALchemy 支持的 Flask 扩展.SQLALchemy 是Python语言的S ...
随机推荐
- 学习笔记之Machine Learning by Andrew Ng | Stanford University | Coursera
Machine Learning by Andrew Ng | Stanford University | Coursera https://www.coursera.org/learn/machin ...
- 廖雪峰Java4反射与泛型-3范型-6super通配符
1.super通配符 1.1super通配符第一种用法 泛型的继承关系 Pair<Integer>不是Pair<Number>的子类,如 static void set(Pai ...
- [UE4]最简单的虚幻4网络游戏,使用虚幻4内置服务器
一.设置游戏窗口合适的大小 二.在新窗口中运行游戏.玩家数量改成大于1. 三.运行游戏就会打开多个窗口 在打包完成的游戏中进行网络游戏: 一.虚幻4打包好的文件是放在WindowsNoEditor ...
- mysql 之审计 init-connect+binlog完成审计功能
mysql基于init-connect+binlog完成审计功能 目前社区版本的mysql的审计功能还是比较弱的,基于插件的审计目前存在于Mysql的企业版.Percona和MariaDB上,但是my ...
- 配置ssh服务允许root管理员直接登录
配置ssh服务允许root管理员直接登录 [root@linux-node2 ~]# grep PermitRootLogin /etc/ssh/sshd_config PermitRootLogin ...
- 初始Golang
Golang初识 字节跳动也就是我们常说的今日头条 1.今日头条基于Go语言构建千亿级微服务的实践 今日头条当前后端服务超过80%的流量是跑在Go构建的服务上 微服务数量超过100个 高峰QPS超过7 ...
- U3D学习08-异步、协程
1.调用 invoke不能传参, 2.协程(不是线程,拥有自己独立的执行序列) Coroutine(尽可能减少计算,提高运行效率) 需要迭代器IEnumerate,迭代器中有返回方法yield 协程的 ...
- (转)C# WebApi 身份认证解决方案:Basic基础认证
原文地址:http://www.cnblogs.com/landeanfen/p/5287064.html 阅读目录 一.为什么需要身份认证 二.Basic基础认证的原理解析 1.常见的认证方式 2. ...
- JSP:注册&登录
数据库:Mysql 除了_id自动增长,其余全是varchar 注册:register.jsp <%@ page language="java" import="j ...
- Service 和 IntentService的区别;
Srevice不是在子线程,在Srevice中做耗时操作一样ANR,然后我们就会用到IntentService,IntentSrevice不但擅长做耗时操作,还有一个特点,用完即走: 在Srevice ...