zookeeper的使用demo(c#/java)

Zookeeper 做爲一個分佈式的服務框架,主要用來解決分佈式集羣中應用系統的一致性問題,它能提供基於相似於文件系統的目錄節點樹方式的數據存儲,可是 Zookeeper 並非用來專門存儲數據的,它的做用主要是用來維護和監控你存儲的數據的狀態變化。經過監控這些數據狀態的變化,從而能夠達到基於數據的集羣管理。java

● 經過C#代碼使用zookeepernode

Zookeeper的使用主要是經過建立其Nuget ZooKeeper.Net包下的ZooKeeper實例,而且調用其接口方法進行的,主要的操做就是對znode的增刪改查操做,監聽znode的變化以及處理。apache

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();
        }
    }
}

程序運行結果:json

/dubbo/com.alibaba.dubbo.demo.SubDemoService/consumers:192.168.40.69
/root/child1
子節點個數:3
節點存儲的數據:child1
節點的值被修改:/root/child1

 

 

● 經過java代碼使用zookeeper服務器

java的使用方式一樣也是實例化ZooKeeper對象並調用其方法,來操做znode。框架

zookeeper包依賴:dom

        <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節點樹spa

相關文章
相關標籤/搜索