1. 程式人生 > >讀《分布式一致性原理》CURATOR客戶端3

讀《分布式一致性原理》CURATOR客戶端3

node zookeep apt 9.png 機器 http 服務 new conn

分布式鎖

在分布式環境中,為了保證數據的一致性,經常在程序運行的某個運行點。需要進行同步控制。

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集群場景。

技術分享圖片

技術分享圖片

讀《分布式一致性原理》CURATOR客戶端3