讀《分布式一致性原理》CURATOR客戶端3
阿新 • • 發佈:2018-05-26
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; importorg.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 staticvoid 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