• Zookeeper学习笔记4


    开源客户端

    ZkClient

            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>3.4.10</version>
            </dependency>
    
    package com.xh.zk.zkclient;
    
    import org.I0Itec.zkclient.IZkDataListener;
    import org.I0Itec.zkclient.ZkClient;
    
    /**
     * Created by root on 4/3/18.
     */
    public class ZkClientTest {
        static String conllection = "192.168.2.192:2181";
        static ZkClient zkClient;
    
        public static void main(String[] args) throws InterruptedException {
            zkClient = new ZkClient(conllection, 5000);
            zkClient.readData("/aaa");
            zkClient.readData("/aaa/bbb");
            zkClient.subscribeDataChanges("/aaa", new IZkDataListener() {
                public void handleDataChange(String s, Object o) throws Exception {
                    System.out.println("handleDataChange>>>" + s + ":" + o);
                }
    
                public void handleDataDeleted(String s) throws Exception {
                    System.out.println("handleDataDeleted>>>" + s);
                }
            });
            
            zkClient.subscribeDataChanges("/aaa/bbb", new IZkDataListener() {
                public void handleDataChange(String s, Object o) throws Exception {
                    System.out.println("handleDataChange>>>" + s + ":" + o);
                }
    
                public void handleDataDeleted(String s) throws Exception {
                    System.out.println("handleDataDeleted>>>" + s);
                }
            });
    
            zkClient.createPersistent("/aaa/bbb", true);
            zkClient.writeData("/aaa", "hello");
            zkClient.writeData("/aaa/bbb", "ssss");
            zkClient.deleteRecursive("/aaa");
            Thread.sleep(Integer.MAX_VALUE);
        }
    }
    
    
    

    结果:

    handleDataChange>>>/aaa:hello
    handleDataChange>>>/aaa/bbb:ssss
    handleDataDeleted>>>/aaa/bbb
    handleDataDeleted>>>/aaa
    

    Curato

    创建客户端

            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-framework</artifactId>
                <version>4.0.0</version>
            </dependency>
    
    public class ZkCurator {
    
        public static void main(String[] args) throws InterruptedException {
            String connectStr = "192.168.2.192:2181";
            int sessionTimeOut = 5000;
            int connectTimeOut = 5000;
            RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
            CuratorFramework client = CuratorFrameworkFactory.newClient(connectStr, sessionTimeOut,
                    connectTimeOut, retryPolicy);
            
            CuratorFramework client2 = CuratorFrameworkFactory.builder().connectString(connectStr)
                    .sessionTimeoutMs(sessionTimeOut).connectionTimeoutMs(connectTimeOut)
                    .retryPolicy(retryPolicy).build();
            client.start();
            client2.start();
    
            Thread.sleep(Integer.MAX_VALUE);
        }
    
    }
    

    节点操作

    
            /**
             * C
             */
            client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL)
                    .forPath(path, "init".getBytes());
            /**
             * R
             */
            Stat stat = new Stat();
            byte[] bytes = client.getData().storingStatIn(stat).forPath("/zk_book/hello");
            System.out.println(new String(bytes));
            /**
             * U
             */
            client.setData().withVersion(-1).forPath("/zk_book", "hi".getBytes());
            System.out.println(new String(client.getData().forPath("/zk_book")));
            /**
             * D
             */
            client.delete().deletingChildrenIfNeeded().withVersion(-1).forPath("/zk_book");
    
    

    异步操作

        public static void main(String[] args) throws Exception {
            String connectStr = "192.168.2.192:2181";
            int sessionTimeOut = 5000;
            int connectTimeOut = 5000;
            String path = "/zk_book";
            final CountDownLatch semaphore = new CountDownLatch(2);
            ExecutorService tp = Executors.newFixedThreadPool(5);
    
            RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
            CuratorFramework client = CuratorFrameworkFactory.builder().connectString(connectStr)
                    .sessionTimeoutMs(sessionTimeOut).connectionTimeoutMs(connectTimeOut)
                    .retryPolicy(retryPolicy).build();
    
            client.start();
    
            client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL)
                    .inBackground(new BackgroundCallback() {
                        public void processResult(CuratorFramework curatorFramework, CuratorEvent curatorEvent) throws Exception {
                            System.out.println("event_code:" + curatorEvent.getResultCode() + "  event_type:" + curatorEvent.getType());
                            System.out.println("thread_result:" + Thread.currentThread().getName());
                            semaphore.countDown();
                        }
                    }, tp).forPath(path, "init".getBytes());
    
            client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL)
                    .inBackground(new BackgroundCallback() {
                        public void processResult(CuratorFramework curatorFramework, CuratorEvent curatorEvent) throws Exception {
                            System.out.println("event_code:" + curatorEvent.getResultCode() + "  event_type:" + curatorEvent.getType());
                            System.out.println("thread_result:" + Thread.currentThread().getName());
                            semaphore.countDown();
                        }
                    }, tp).forPath(path, "init".getBytes());
    
            semaphore.await();
            tp.shutdown();
    
        }
    
    

    结果:

    event_code:0  event_type:CREATE
    thread_result:pool-1-thread-1
    event_code:-110  event_type:CREATE
    thread_result:pool-1-thread-2
    

    典型应用

            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-recipes</artifactId>
                <version>4.0.0</version>
            </dependency>
    

    事件监听

    NodeCache

        public static void main(String[] args) throws Exception {
            String connectStr = "192.168.2.192:2181";
            int sessionTimeOut = 5000;
            int connectTimeOut = 5000;
            String path = "/zk_book";
            final CountDownLatch semaphore = new CountDownLatch(2);
            ExecutorService tp = Executors.newFixedThreadPool(5);
    
            RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
            CuratorFramework client = CuratorFrameworkFactory.builder().connectString(connectStr)
                    .sessionTimeoutMs(sessionTimeOut).connectionTimeoutMs(connectTimeOut)
                    .retryPolicy(retryPolicy).build();
    
            client.start();
    
    
            final NodeCache nodeCache = new NodeCache(client, path, false);
            nodeCache.start(true);
            nodeCache.getListenable().addListener(new NodeCacheListener() {
                public void nodeChanged() throws Exception {
                    System.out.println("data changed:" + new String(nodeCache.getCurrentData().getData()));
                }
            });
    
            client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path, "init".getBytes());
            client.setData().forPath(path, "update".getBytes());
            Thread.sleep(1000);
            client.delete().forPath(path);
    
            Thread.sleep(Integer.MAX_VALUE);
    
        }
    

    结果:

    data changed:init
    data changed:update
    

    其监听的结果在创建和修改时会通知,删除时不会

    Mast选举

        public static void main(String[] args) throws Exception {
            String connectStr = "192.168.2.192:2181";
            int sessionTimeOut = 5000;
            int connectTimeOut = 5000;
            String master_path = "/zk_book";
    
    
            RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
            CuratorFramework client = CuratorFrameworkFactory.builder().connectString(connectStr)
                    .sessionTimeoutMs(sessionTimeOut).connectionTimeoutMs(connectTimeOut)
                    .retryPolicy(retryPolicy).build();
    
            client.start();
    
            LeaderSelector selector = new LeaderSelector(client, master_path, new LeaderSelectorListenerAdapter() {
                public void takeLeadership(CuratorFramework curatorFramework) throws Exception {
                    System.out.println("be Master");
                    Thread.sleep(1000);
                    System.out.println("give up be Master");
                }
            });
    
            selector.autoRequeue();
            selector.start();
    
            Thread.sleep(Integer.MAX_VALUE);
    
        }
    

    分布式锁

    一个订单号生成器的例子
    1、没有锁:

        public static void main(String[] args) {
            final CountDownLatch semaphore = new CountDownLatch(1);
    
            for (int i = 0; i < 10; i++) {
                new Thread(new Runnable() {
                    public void run() {
                        try {
                            semaphore.await();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
    
                        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss|SSS");
                        String orderNo = dateFormat.format(new Date());
                        System.out.println("NO:" + orderNo);
                    }
                }).start();
            }
            semaphore.countDown();
        }
    

    结果:

    NO:15:05:28|362
    NO:15:05:28|364
    NO:15:05:28|364
    NO:15:05:28|363
    NO:15:05:28|364
    NO:15:05:28|365
    NO:15:05:28|364
    NO:15:05:28|365
    NO:15:05:28|365
    NO:15:05:28|365
    

    2、zk分布式锁

    public class ZkCurator {
        public static void main(String[] args) throws Exception {
            String connectStr = "192.168.2.192:2181";
            int sessionTimeOut = 5000;
            int connectTimeOut = 5000;
            String lock_path = "/zk_lock";
    
            RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
            CuratorFramework client = CuratorFrameworkFactory.builder().connectString(connectStr)
                    .sessionTimeoutMs(sessionTimeOut).connectionTimeoutMs(connectTimeOut)
                    .retryPolicy(retryPolicy).build();
            client.start();
    
            final InterProcessMutex lock = new InterProcessMutex(client, lock_path);
            final CountDownLatch semaphoer = new CountDownLatch(1);
    
            for (int i = 0; i < 30; i++) {
                new Thread(new Runnable() {
                    public void run() {
                        try {
                            semaphoer.await();
                            lock.acquire();
                            Thread.sleep(1000);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
    
                        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss|SSS");
                        String orderNo = dateFormat.format(new Date());
                        System.out.println("NO:" + orderNo);
                        try {
                            lock.release();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
            semaphoer.countDown();
        }
    
    }
    

    结果:

    NO:15:26:49|695
    NO:15:26:50|706
    NO:15:26:51|715
    NO:15:26:52|733
    NO:15:26:53|753
    ...
    
  • 相关阅读:
    说说Cookie和Session
    说说SQL Server的数据类型
    Java访问权限控制
    数据库-- 触发器
    关于jni编译32位、64位动态库(Android.mk和Application.mk文件)
    Android中的 init.rc文件简介
    Android系统属性简介
    Android Support 包知识
    Android窗口机制分析与UI管理系统
    Android界面架构(Activity,PhoneWiondow,DecorView)简介
  • 原文地址:https://www.cnblogs.com/lanqie/p/8709086.html
Copyright © 2020-2023  润新知