zookeeper的使用demo(c#/java)
Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。
● 通过C#代码使用zookeeper
Zookeeper的使用主要是通过创建其Nuget ZooKeeper.Net包下的ZooKeeper实例,并且调用其接口方法进行的,主要的操作就是对znode的增删改查操作,监听znode的变化以及处理。
using System;
using ZooKeeperNet;
namespace ConsoleApplication1
{
class Watcher : IWatcher
{
public void Process(WatchedEvent @event)
{
if (@event.Type == EventType.NodeDataChanged)
{
Console.WriteLine(@event.Path + "节点的值被修改");
} }
}
} using System;
using System.Linq;
using System.Text;
using ZooKeeperNet;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//创建一个Zookeeper实例,第一个参数为目标服务器地址和端口,第二个参数为Session超时时间,第三个为节点变化时的回调方法
using (ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", new TimeSpan(, , , ), new Watcher()))
{
String znode_root = "/dubbo/com.alibaba.dubbo.demo.SubDemoService/consumers";
var stat = zk.Exists(znode_root, true); if (null == stat)
{
//创建一个节点root,数据是mydata,不进行ACL权限控制,节点为永久性的(即客户端shutdown了也不会消失)
zk.Create(znode_root, "mydata".GetBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.Persistent);
}
else
{
var data1 = zk.GetData(znode_root, true, null);
Console.WriteLine(znode_root + ":" + Encoding.Default.GetString(data1));
}
//在root下面创建一个child1 znode,数据为child1,不进行ACL权限控制,节点为永久性的
string c = zk.Create("/root/child1", "child1".GetBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.Persistent);
Console.WriteLine(c); //取得/root节点下的子节点名称,返回List<String>
var childrenNodes = zk.GetChildren("/root", true);
Console.WriteLine("子节点个数:"+childrenNodes.Count()); //取得/root/child1节点下的数据,返回byte[]
byte[] data = zk.GetData("/root/child1", true, null);
Console.WriteLine("节点存储的数据:"+Encoding.Default.GetString(data)); //修改节点/root/child1下的数据,第三个参数为版本,如果是-1,那会无视被修改的数据版本,直接改掉
zk.SetData("/root/child1", "child1modify".GetBytes(), -); //删除/root/child1这个节点,第二个参数为版本,-1的话直接删除,无视版本
zk.Delete("/root/child1", -);
} Console.Read();
}
}
}
程序运行结果:
/dubbo/com.alibaba.dubbo.demo.SubDemoService/consumers:192.168.40.69
/root/child1
子节点个数:3
节点存储的数据:child1
节点的值被修改:/root/child1
● 通过java代码使用zookeeper
java的使用方式同样也是实例化ZooKeeper对象并调用其方法,来操作znode。
zookeeper包依赖:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
code:
import com.alibaba.fastjson.JSON;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat; import java.util.List;
import java.util.UUID; public class ZkDemo { public static void main(String[] args) throws Exception {
String host = "127.0.0.1:2181";
int timeout = 1000;
ZooKeeper zk = new ZooKeeper(host, timeout, new Watcher() {
public void process(WatchedEvent watchedEvent) {
if (watchedEvent.getType() == Event.EventType.NodeDataChanged) {
System.out.println(watchedEvent.getPath() + "节点的值被修改");
}
}
}); String znode_root = "/dubbo/com.alibaba.dubbo.demo.SubDemoService/consumers";
Stat stat = zk.exists(znode_root, true);
if (null == stat) {
zk.create(znode_root, "mydata".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(znode_root + "被创建");
} else {
byte[] data = zk.getData(znode_root, true, null);
System.out.println(znode_root + ":" + new String(data));
} if(zk.exists("/root/node2",true)==null) {
//在root下面创建一个名为node2的znode,数据为node2val,不进行ACL权限控制,节点为永久性的
zk.create("/root/node2", "node2val".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
} //取得/root节点下的子节点名称,返回List<String>
List<String> childrenNodes = zk.getChildren("/root", true);
System.out.println(String.format("子节点(%s个):%s", childrenNodes.size(), JSON.toJSONString(childrenNodes))); zk.setData("/root/node2", UUID.randomUUID().toString().getBytes(), -1); zk.close(); }
}
程序运行结果:
/dubbo/com.alibaba.dubbo.demo.SubDemoService/consumers:192.168.40.69
子节点(2个):["childone","node2"]
/root/node2节点的值被修改
● 通过监控管理工具查看zk节点树

zookeeper的使用demo(c#/java)的更多相关文章
- zookeeper的简单搭建,java使用zk的例子和一些坑
一 整合 由于本人的码云太多太乱了,于是决定一个一个的整合到一个springboot项目里面. 附上自己的github项目地址 https://github.com/247292980/spring- ...
- 【ZooKeeper系列】2.用Java实现ZooKeeper API的调用
温馨提示:在这里我再次提个小要求,希望大家能习惯看官方文档,文档虽然是英文但用词都比较简单,基本都能看懂文档表达的意思.授之以鱼不如授之以渔的道理相信大家都明白,也希望通过猿人谷的这个ZooKeepe ...
- Selenium关键字驱动测试框架Demo(Java版)
Selenium关键字驱动测试框架Demo(Java版)http://www.docin.com/p-803493675.html
- 线上zk节点报org.apache.zookeeper.server.NIOServerCnxnFactory.run(NIOServerCnxnFactory.java:187) at java.lang.Thread.run(libgcj.so.10)
线上zk做配置管理,最近突然发现两个节点一直在刷下边 java.nio.channels.CancelledKeyException at gnu.java.nio.SelectionKeyIm ...
- zookeeper(三):java操作zookeeper
引入jar包 首先要使用java操作zookeeper,zookeeper的javaclient 使我们更轻松的去对zookeeper进行各种操作,我们引入zookeeper-3.4.5.jar 和 ...
- ZooKeeper系列(四)—— Java 客户端 Apache Curator
一.基本依赖 Curator 是 Netflix 公司开源的一个 Zookeeper 客户端,目前由 Apache 进行维护.与 Zookeeper 原生客户端相比,Curator 的抽象层次更高,功 ...
- org/apache/curator/RetryPolicy at com.alibaba.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter.connect(CuratorZookeeperTransporter.java:26)
使用dubbo服务,启动项目报错: org/apache/curator/RetryPolicy at com.alibaba.dubbo.remoting.zookeeper.curator.Cur ...
- Java学习之Dubbo+ZooKeeper分布式服务Demo
背景:在之前的一个<Java学习之SpringBoot整合SSM Demo>分享中说到搭建ZooKeeper和Dubbo分布式框架中遇到了一些技术问题没能成功,只分享了其中的一个中间产物, ...
- Zookeeper Client基础操作和Java调用
## Zookeeper > Zookeeper目前用来做数据同步,再各个服务之前同步关键信息 i.客户端操作 1. 创建 create [-s] [-e] path data acl -s 为 ...
随机推荐
- vmware虚拟机使用静态IP上网的方法
本文转自:https://www.cnblogs.com/flyfish919/p/7083523.html 作者:云里有棵树 我的物理机使用的是路由wifi,然后虚拟机使用静态IP上网的方法总结如下 ...
- INotifyPropertyChanged 接口
INotifyPropertyChanged 接口 用于向客户端(通常是执行绑定的客户端)发出某一属性值已更改的通知. 例如,考虑一个带有名为 FirstName 属性的 Person 对象.若要提供 ...
- C#创建ActiveX
因为最近的项目可能会用到调用外部设备,读取信息.为了和现有的BS系统兼容,并以较小的代价满足需求,于是想到了使用ActiveX技术(也有人建议使用Silverlight),这技术虽然比较早了,但还是能 ...
- 版本管理_git
git 世界上最好的版本管理工具,分布式版本控制系统. 林纳斯-托瓦斯,自由主义教皇(git.linux) git 不管理空文件夹 对比于 SVN mkdir XX 创建一个空目录 XX ...
- __x__(14)0906第三天__<iframe> 内联框架 引入有一个外部html页面
在现实开发中,不推荐使用内联框架,因为<iframe></iframe>中的内容不会被搜索引擎检索. 在特殊情况中,如内网项目,不用放在互联网上时,可以使用<iframe ...
- KMP Algorithm 字符串匹配算法KMP小结
这篇小结主要是参考这篇帖子从头到尾彻底理解KMP,不得不佩服原作者,写的真是太详尽了,让博主产生了一种读学术论文的错觉.后来发现原作者是写书的,不由得更加敬佩了.博主不才,尝试着简化一些原帖子的内容, ...
- CentOS7搭建SVN服务器
首先,你得有个VPS,我用的是搬瓦工. 安装步骤如下:1.yum install subversion2.查看安装版本 svnserve --version 3.创建SVN版本库目录 mkdir ...
- thinkphp框架,数据动态缓存后,或数据已读取出来,想分页怎么办
//读取缓存后赋值到数组,通过array_slice函数处理,如: $blog = S('blogname'); //赋值 $count = count($blog); //条数统计 $page = ...
- c#拷贝整个文件夹到指定文件夹下(非递归)
public static void CopyEntireDir(string sourcePath, string destPath) { //Now Create all of the direc ...
- F#周报2019年第13期
新闻 Visual Studio 2019发布会 Json2FSharp--在线类型生成器 cs2fs-online--从C#到F#的移植器 AWS Lambda layer上的.NET Core A ...