读《分布式一致性原理》CURATOR客户端3

分布式锁

在分布式环境中,为了保证数据的一致性,经常在程序运行的某个运行点。需要进行同步控制。

package master;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessLock;
import org.apache.curator.framework.recipes.locks.InterProcessMultiLock;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.ExponentialBackoffRetry;

public class Recipes_Lock {
    
    static String lock_path="/lock_paht";
    static CuratorFramework client = CuratorFrameworkFactory.builder().
            connectString("192.168.64.60:2181")
            .connectionTimeoutMs(5000).
            retryPolicy(new ExponentialBackoffRetry(3000, 3))
            .build();
    
    public static void main(String[] args) {
        client.start();
        final InterProcessMutex lock= new InterProcessMutex(client,lock_path);
        final CountDownLatch down = new CountDownLatch(1);
        
        for (int i = 0; i <30; i++) {
            new Thread(new  Runnable() {
                public void run() {
                    try {
                        down.wait();
                        lock.acquire();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss|SSS");
                    String orderNo = dateFormat.format(new Date());
                    System.out.println("生成的订单号是:"+orderNo);
                    try {
                        lock.release();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }).start();;
            
        }
        down.countDown();
    }
}

 上面这个程序借助Curator来实现了一个简单的分布式锁。其核心接口如下:

 

 

 工具

 curator也提供了了很多的工具类,其中用的最多的就是zkPath和EnsurePath。

ZKPaths

ZKPaths提供了一些简单的API来构建ZNode路径,递归创建和删除节点等,

package utils;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.utils.ZKPaths;
import org.apache.curator.utils.ZKPaths.PathAndNode;
import org.apache.zookeeper.ZooKeeper;

public class ZKPaths_sample {
    
    static String path="/zkpath_path";
    static CuratorFramework client = CuratorFrameworkFactory.builder().
            connectString("192.168.64.60:2181")
            .connectionTimeoutMs(5000).
            retryPolicy(new ExponentialBackoffRetry(3000, 3))
            .build();
    
    public static void main(String[] args) throws Exception {
        client.start();
        
        ZooKeeper zooKeeper = client.getZookeeperClient().getZooKeeper();
        System.out.println(ZKPaths.fixForNamespace(path, "sub"));
        System.out.println(ZKPaths.makePath(path, "sub"));
        System.out.println(ZKPaths.getNodeFromPath("zkapth_path/sub1"));
        
        PathAndNode pn = ZKPaths.getPathAndNode("/zkpath_path/sub1");
        System.out.println(pn.getPath());
        System.out.println(pn.getNode());
        
        ZKPaths.mkdirs(zooKeeper, path+"/child1");
        ZKPaths.mkdirs(zooKeeper, path+"/child2");
        System.out.println(ZKPaths.getSortedChildren(zooKeeper, path));
        
    }
    
}

 

 EnsurePath

提供了一种能够确保数据及诶单存在的机制。

 

 TestingServer

 为了便于开发人员进行zookeeper的开发与测试,curator提供了一种启动简易的zookeeper服务器服务的方法

——TestingServer。TestingServer允许开发人员非常方便的启动一个标准的zookeeper服务器。并进行一系列的单元测试。

 TestingCluster

TestingCluster是一个可以模拟zookeeper集群环境的curator工具类,能够便于开发人员在本地模拟由

n台机器组成的集群环境。下面我们模拟一个有3台机器构成的zookeeper集群场景。

 

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/duan2/p/9094095.html