Zookeeper 初始化以及get,set,監聽
1,安裝zookeeper
2,在目錄和環境變數上做對應配置,太多了,懶得寫
3,D:\zookeeper\zookeeper-3.4.10-1\conf裡的zoo.cfg(一開始是sample)改成對應的引數
dataDir=D://zookeeper//zookeeper-3.4.10-3//bin//data
clientPort=2181 預設是2181,也可以寫成其他的,一臺電腦上有多個機器的,要寫成不同的port才不會衝突
server.1=127.0.0.1:2777:3777
server.2=127.0.0.1:2888:3888
…
最好配置單數,因為單數和雙數,都需要保證過半機器能用的原則,所以其實雙數和單數在使用的時候沒有區別
4,在對應的bin/data資料夾下,建立myId檔案,裡面寫上對應的數字,1 or 2 or …對應server的ip
5,windows上雙擊執行bin/zkServer來執行zookeeper伺服器
6,把配置的所有伺服器都開啟來以後,雙擊zkCli嘗試執行,看看是否成功
不成功的可能原因
1,ip衝突,server.1 =127.0.0.1:2777:3777
ip:埠1:埠2
如果ip相同的情況下,要保證埠1和埠2和其他server的不一樣,不能重複佔用
同理clientPort
2,myId配置重複或者漏配
7,在java上配置客戶端
maven配置,根據自己對應的倉庫,有什麼版本用什麼
<dependencies>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
</dependencies>
connectString: ip可以配置多個,這裡只配置一個,ip地址通過上面尋找,
執行的zkServer裡執行成功後,會提示
binding to port 0.0.0.0/0.0.0.0:2181
用這個就可以了!!
sessionTimeout: 和心跳檢測相關,在sessionTimeout時間內會進行心跳檢測,連不上就斷開(如果是本地可以設定長一點,因為打斷點的時候是不能順利心跳檢測的)
watcher: 可以不設定,設定的話,會回撥返回WatchedEvent型別,裡面含有三個引數:
- KeeperState:連線狀態,比如連線中斷,仍然連線著,等等,
- EventType :事件型別,比如節點新增,節點刪除,子節點變更,等等,
- path:路徑
程式碼
final String ip1 = "0.0.0.0:2181";
zooKeeper = new ZooKeeper(ip1 , 30000, null);
原始碼
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher);
設定資料
path:路徑
byte data[]:資料,byte[]格式
version:版本號,-1表示無所謂,如果不是-1,就表示,只有在xx版本下,才進行更新,樂觀鎖
程式碼
Stat stat = zooKeeper.setData(path , ("data").getBytes(), -1);
原始碼
public Stat setData(final String path, byte data[], int version)
獲取資料
獲取到的資料是byte[]格式的
path:略
watcher:監聽器註冊,這裡用預設的監聽器watcher的回撥watchedEvent,也可以填null,不管回撥
stat:可以通過stat去接收stat的值,這裡選擇null,不需要
byte[] s = zooKeeper.getData(path , event -> {
if (EventType.NodeDataChanged.equals(event.getType())
|| EventType.NodeChildrenChanged.equals(event.getType())) {
//......
}
}, null);
原始碼
public byte[] getData(final String path, Watcher watcher, Stat stat);
獲取子節點
List<String> childrenList = zooKeeper.getChildren(path,false);
watcher:false
childrenList :子節點的相對路徑,不是絕對路徑!
節點存在
Stat stat = zooKeeper.exists(path, null/*watcher*/);
if(null ==stat){
//path not exists
}
監聽:
1,監聽是一次性的
2,重複add監聽的話,那邊是真的會有多個,就會導致一次呼叫,多個監聽響應,其他懶得說了
create見另一篇