zoukankan      html  css  js  c++  java
  • 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节点树

  • 相关阅读:
    学习网页栅格系统的几篇好文
    [转载]iis6配置使用页面Gzip压缩提速
    img标签的src=""会引起的Page_Load多次执行
    基于sliverlight + wcf的web 文字版IM 示例
    Enterprise Library 4.1学习笔记8缓存应用程序块之FileDependency
    windows 2008上启用防火墙后sqlserver 2005经常出现连接超时的解决办法
    负载均衡环境下的web服务器处理
    Ado.Net连接池的速度测试
    [转载]网页栅格系统研究(1):960的秘密
    css基础:把所有背景图都集成在一张图片上,减少图片服务器请求次数
  • 原文地址:https://www.cnblogs.com/buguge/p/10712536.html
Copyright © 2011-2022 走看看