zookeeper使用demo(c#/java)
Posted buguge
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(0, 0, 0, 10), 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(), -1); //删除/root/child1这个节点,第二个参数为版本,-1的话直接删除,无视版本 zk.Delete("/root/child1", -1); } 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)的主要内容,如果未能解决你的问题,请参考以下文章
Java学习之Dubbo+ZooKeeper分布式服务Demo