ZkClient簡介
ZkClient是一個開源客戶端黔帕,在Zookeeper原生API接口的基礎(chǔ)上進(jìn)行了包裝滑频,更便于開發(fā)人員使用给涕。內(nèi)部實現(xiàn)了Session超時重連垛叨,Watcher反復(fù)注冊等功能。像dubbo等框架對其也進(jìn)行了集成使用装畅。
雖然ZkClient對原生API進(jìn)行了封裝靠娱,但也有它自身的不足之處:
- 幾乎沒有參考文檔;
- 異常處理簡化(拋出RuntimeException)掠兄;
- 重試機(jī)制比較難用像云;
- 沒有提供各種使用場景的實現(xiàn);
Curator簡介
Curator是Netflix公司開源的一套Zookeeper客戶端框架蚂夕,和ZkClient一樣苫费,解決了非常底層的細(xì)節(jié)開發(fā)工作,包括連接重連双抽、反復(fù)注冊Watcher和NodeExistsException異常等。目前已經(jīng)成為Apache的頂級項目闲礼。另外還提供了一套易用性和可讀性更強(qiáng)的Fluent風(fēng)格的客戶端API框架牍汹。
除此之外,Curator中還提供了Zookeeper各種應(yīng)用場景(Recipe柬泽,如共享鎖服務(wù)慎菲、Master選舉機(jī)制和分布式計算器等)的抽象封裝。
- zkClient
- ZkClient在ZooKeeper原生API接口之上進(jìn)行了包裝锨并,是一個更易用的ZooKeeper客戶端
- 與ZooKeeper客戶端最大區(qū)別提供的API沒有了Watcher注冊的功能露该,而是引入了Listener的概念
- Curator
- Fluent風(fēng)格的Java編碼,流式
- Curator引入了Cache來替換Watcher實現(xiàn)對ZooKeeper服務(wù)端事件的監(jiān)聽
- 分布式鎖/分布式計數(shù)器DistributedAtomicInteger/分布式柵欄Barrier
- 提供一些對數(shù)據(jù)路徑節(jié)點操作的ZKPaths和EnsurePath
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.ExponentialBackoffRetry;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
/**
* curator分布式鎖實現(xiàn)
*/
public class Recipes_lock {
static String lock_path = "/curator_recipes_lock_path";
static CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString("127.0.0.1:2181")
.retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();
public static void main(String[] args) throws Exception {
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.await();
lock.acquire();
} catch (Exception e) {
}
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss|SSS");
String orederNo = sdf.format(new Date());
System.out.println("生成的訂單號為:" + orederNo);
try {
lock.release();
} catch (Exception e) {
}
}
}).start();
}
down.countDown();
}
}
輸出結(jié)果:
生成的訂單號為:15:32:33|728
生成的訂單號為:15:32:33|781
生成的訂單號為:15:32:33|849
生成的訂單號為:15:32:33|879
生成的訂單號為:15:32:33|897
生成的訂單號為:15:32:33|972
生成的訂單號為:15:32:34|013
生成的訂單號為:15:32:34|057
生成的訂單號為:15:32:34|130
生成的訂單號為:15:32:34|197
生成的訂單號為:15:32:34|232
生成的訂單號為:15:32:34|282
生成的訂單號為:15:32:34|367
生成的訂單號為:15:32:34|404
生成的訂單號為:15:32:34|425
生成的訂單號為:15:32:34|461
生成的訂單號為:15:32:34|482
生成的訂單號為:15:32:34|515
生成的訂單號為:15:32:34|550
生成的訂單號為:15:32:34|573
生成的訂單號為:15:32:34|600
生成的訂單號為:15:32:34|624
生成的訂單號為:15:32:34|647
生成的訂單號為:15:32:34|670
生成的訂單號為:15:32:34|715
生成的訂單號為:15:32:34|752
生成的訂單號為:15:32:34|774
生成的訂單號為:15:32:34|793
生成的訂單號為:15:32:34|811
生成的訂單號為:15:32:34|836