什麼是zookeeper
1.Zookeeper是一個分布式開源架構,提供了協調分布式應用的基本服務,它向外部應用暴露一組通用服務——分布式同步、命名服務、叢集維護等,簡化分布式應用協調及其管理的難度,提供高性能的分布式服務。ZooKeeper本身可以以單機模式安裝運作,不過它的長處在于通過分布式ZooKeeper叢集,基于一定的政策來保證ZooKeeper叢集的穩定性和可用性,進而實作分布式應用的可靠性。
zookeeper運用場景
1.dubbo+zk實作rpc遠端調用中,zk在其中的作用類似springcloud中的eureka注冊服務中心,管理接口服務
2.釋出訂閱
3.負載均衡
4.分布通知
5.分布式鎖
zokeeper存儲資料結構(類似xml資料結構)
在zk的節點中,每個節點名稱是不可以重複的(實作分布式鎖的關鍵性),可以依次無限遞增。節點的類型可以分為四種:
1.持久節點,一旦建立就儲存到硬碟上面
2.臨時節點,建立以後如果斷開連接配接則該節點自動删除
3.順序持久節點
4.順序臨時節點
每個節點都可以通過節點事件監聽,對于節點的變化(增,删,改)都能擷取到
例如:在使用zk作為dobbo注冊服務中心的時候
在Windows環境下安裝運作zk
1. 下載下傳Windows版本zk,解壓以後,修改配置檔案zoo_sample.cfg名字為zoo.cfg
2.在zk的bi目錄下找到zkServer.bat 啟動zk
3.在zk的bi目錄下找到zkCli 啟動zk的用戶端工具,可以在cmd裡面對zk的節點進行建立 修改和删除,可以根據zk的可視化管理工具進行檢視,例如建立一個會員服務 ip位址是 127.0.0.1
可以通過ls 空格 / 檢視目前的節點
JAVA如何操作Zookeeper
1.導入zookeeper所需要的依賴:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
</dependency>
2.編寫java類建立zookeeper的節點
package com.zk.demo;
import java.io.IOException;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
public class CreateZookeeper {
/**
* ZK位址和端口
*/
private static final String CONNETTION_ADDR = "127.0.0.1:2181";
/**
* session逾時時間
*/
private static final int SESSION_TIMEOUT = 5000;
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
ZooKeeper zk = new ZooKeeper(CONNETTION_ADDR, SESSION_TIMEOUT, new Watcher() {
public void process(WatchedEvent event) {
// 擷取時間的狀态
KeeperState keeperState = event.getState();
EventType tventType = event.getType();
// 如果是建立連接配接
if (KeeperState.SyncConnected == keeperState) {
if (EventType.None == tventType) {
System.out.println("建立zk連接配接");
}
}
}
});
zk.create("/zk", "testZookeeper".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("建立節點成功");
zk.close();
}
}
3.運作測試類,啟動zk服務,通過指令或者可視化用戶端檢視生成的zk節點
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/E:/developer/mvnResponsity/ch/qos/logback/logback-classic/1.1.11/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/E:/developer/mvnResponsity/org/slf4j/slf4j-log4j12/1.7.26/slf4j-log4j12-1.7.26.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
15:37:24.266 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:zookeeper.version=3.4.14-4c25d480e66aadd371de8bd2fd8da255ac140bcf, built on 03/06/2019 16:18 GMT
15:37:24.268 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:host.name=NNH1J2ASSQP10BA
15:37:24.268 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.version=1.8.0_172
15:37:24.268 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.vendor=Oracle Corporation
15:37:24.268 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.home=E:\Java\jdk1.8.0_172\jre
15:37:24.268 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.class.path=E:\Java\jdk1.8.0_172\jre\lib\resources.jar;E:\Java\jdk1.8.0_172\jre\lib\rt.jar;E:\Java\jdk1.8.0_172\jre\lib\jsse.jar;E:\Java\jdk1.8.0_172\jre\lib\jce.jar;E:\Java\jdk1.8.0_172\jre\lib\charsets.jar;E:\Java\jdk1.8.0_172\jre\lib\jfr.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\access-bridge-64.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\cldrdata.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\dnsns.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\jaccess.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\jfxrt.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\localedata.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\nashorn.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\sunec.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\sunjce_provider.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\sunmscapi.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\sunpkcs11.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\zipfs.jar;E:\code\servlet\java-zk\target\classes;E:\code\servlet\java-zk\lib\zookeeper-3.4.14.jar;E:\developer\mvnResponsity\org\springframework\boot\spring-boot-starter\1.5.21.RELEASE\spring-boot-starter-1.5.21.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\boot\spring-boot\1.5.21.RELEASE\spring-boot-1.5.21.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\spring-context\4.3.24.RELEASE\spring-context-4.3.24.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\spring-aop\4.3.24.RELEASE\spring-aop-4.3.24.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\spring-beans\4.3.24.RELEASE\spring-beans-4.3.24.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\spring-expression\4.3.24.RELEASE\spring-expression-4.3.24.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\boot\spring-boot-autoconfigure\1.5.21.RELEASE\spring-boot-autoconfigure-1.5.21.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\boot\spring-boot-starter-logging\1.5.21.RELEASE\spring-boot-starter-logging-1.5.21.RELEASE.jar;E:\developer\mvnResponsity\ch\qos\logback\logback-classic\1.1.11\logback-classic-1.1.11.jar;E:\developer\mvnResponsity\ch\qos\logback\logback-core\1.1.11\logback-core-1.1.11.jar;E:\developer\mvnResponsity\org\slf4j\jcl-over-slf4j\1.7.26\jcl-over-slf4j-1.7.26.jar;E:\developer\mvnResponsity\org\slf4j\jul-to-slf4j\1.7.26\jul-to-slf4j-1.7.26.jar;E:\developer\mvnResponsity\org\slf4j\log4j-over-slf4j\1.7.26\log4j-over-slf4j-1.7.26.jar;E:\developer\mvnResponsity\org\springframework\spring-core\4.3.24.RELEASE\spring-core-4.3.24.RELEASE.jar;E:\developer\mvnResponsity\org\yaml\snakeyaml\1.17\snakeyaml-1.17.jar;E:\developer\mvnResponsity\org\apache\zookeeper\zookeeper\3.4.14\zookeeper-3.4.14.jar;E:\developer\mvnResponsity\org\slf4j\slf4j-api\1.7.26\slf4j-api-1.7.26.jar;E:\developer\mvnResponsity\org\slf4j\slf4j-log4j12\1.7.26\slf4j-log4j12-1.7.26.jar;E:\developer\mvnResponsity\com\github\spotbugs\spotbugs-annotations\3.1.9\spotbugs-annotations-3.1.9.jar;E:\developer\mvnResponsity\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;E:\developer\mvnResponsity\log4j\log4j\1.2.17\log4j-1.2.17.jar;E:\developer\mvnResponsity\jline\jline\0.9.94\jline-0.9.94.jar;E:\developer\mvnResponsity\org\apache\yetus\audience-annotations\0.5.0\audience-annotations-0.5.0.jar;E:\developer\mvnResponsity\io\netty\netty\3.10.6.Final\netty-3.10.6.Final.jar
15:37:24.268 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.library.path=E:\Java\jdk1.8.0_172\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;E:/Java/jdk1.8.0_172/jre/bin/server;E:/Java/jdk1.8.0_172/jre/bin;E:/Java/jdk1.8.0_172/jre/lib/amd64;E:\xftp\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;E:\Java\jdk1.8.0_172\lib;E:\Java\jdk1.8.0_172\jre\bin;E:\maven\apache-maven-3.5.3\bin;E:\software\mysql\mysql-8.0.15-winx64;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;;E:\sts\spring-tool-suite-3.9.4.RELEASE-e4.7.3a-win32-x86_64\sts-bundle\sts-3.9.4.RELEASE;;.
15:37:24.269 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.io.tmpdir=C:\Users\ADMINI~1\AppData\Local\Temp\
15:37:24.269 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.compiler=<NA>
15:37:24.269 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.name=Windows 10
15:37:24.269 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.arch=amd64
15:37:24.269 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.version=10.0
15:37:24.269 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.name=Administrator
15:37:24.269 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.home=C:\Users\Administrator
15:37:24.269 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.dir=E:\code\servlet\java-zk
15:37:24.270 [main] INFO org.apache.zookeeper.ZooKeeper - Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.zk.demo.CreateZookeeper$1@6d21714c
15:37:24.272 [main] DEBUG org.apache.zookeeper.ClientCnxn - zookeeper.disableAutoWatchReset is false
15:37:24.393 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.SaslServerPrincipal - Canonicalized address to 127.0.0.1
15:37:24.395 [main-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
15:37:24.396 [main-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session
15:37:24.397 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Session establishment request sent on 127.0.0.1/127.0.0.1:2181
15:37:24.401 [main-SendThread(127.0.0.1:2181)] WARN org.apache.zookeeper.ClientCnxnSocket - Connected to an old server; r-o mode will be unavailable
15:37:24.401 [main-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x16b07ab1dee0002, negotiated timeout = 5000
建立zk連接配接
15:37:24.407 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x16b07ab1dee0002, packet:: clientPath:null serverPath:null finished:false header:: 1,1 replyHeader:: 1,62,0 request:: '/zk,#746573745a6f6f6b6565706572,v{s{31,s{'world,'anyone}}},0 response:: '/zk
建立節點成功
15:37:24.407 [main] DEBUG org.apache.zookeeper.ZooKeeper - Closing session: 0x16b07ab1dee0002
15:37:24.407 [main] DEBUG org.apache.zookeeper.ClientCnxn - Closing client for session: 0x16b07ab1dee0002
15:37:24.410 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x16b07ab1dee0002, packet:: clientPath:null serverPath:null finished:false header:: 2,-11 replyHeader:: 2,63,0 request:: null response:: null
15:37:24.410 [main] DEBUG org.apache.zookeeper.ClientCnxn - Disconnecting client for session: 0x16b07ab1dee0002
15:37:24.410 [main] INFO org.apache.zookeeper.ZooKeeper - Session: 0x16b07ab1dee0002 closed
15:37:24.411 [main-EventThread] INFO org.apache.zookeeper.ClientCnxn - EventThread shut down for session: 0x16b07ab1dee0002
4.在上述代碼中可能會出現一個問題 就是zk建立連接配接的時候 是一個異步操作,可以通過測試得知:
package com.zk.demo;
import java.io.IOException;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
public class CreateZookeeper {
/**
* ZK位址和端口
*/
private static final String CONNETTION_ADDR = "127.0.0.1:2181";
/**
* session逾時時間
*/
private static final int SESSION_TIMEOUT = 5000;
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
ZooKeeper zk = new ZooKeeper(CONNETTION_ADDR, SESSION_TIMEOUT, new Watcher() {
public void process(WatchedEvent event) {
try {
//休眠6秒
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 擷取時間的狀态
KeeperState keeperState = event.getState();
EventType tventType = event.getType();
// 如果是建立連接配接
if (KeeperState.SyncConnected == keeperState) {
if (EventType.None == tventType) {
System.out.println("建立zk連接配接");
}
}
}
});
zk.create("/zksyn", "testZookeeper".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("建立節點成功");
zk.close();
}
}
運作結果:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/E:/developer/mvnResponsity/ch/qos/logback/logback-classic/1.1.11/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/E:/developer/mvnResponsity/org/slf4j/slf4j-log4j12/1.7.26/slf4j-log4j12-1.7.26.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
15:49:00.264 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:zookeeper.version=3.4.14-4c25d480e66aadd371de8bd2fd8da255ac140bcf, built on 03/06/2019 16:18 GMT
15:49:00.266 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:host.name=NNH1J2ASSQP10BA
15:49:00.266 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.version=1.8.0_172
15:49:00.266 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.vendor=Oracle Corporation
15:49:00.266 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.home=E:\Java\jdk1.8.0_172\jre
15:49:00.266 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.class.path=E:\Java\jdk1.8.0_172\jre\lib\resources.jar;E:\Java\jdk1.8.0_172\jre\lib\rt.jar;E:\Java\jdk1.8.0_172\jre\lib\jsse.jar;E:\Java\jdk1.8.0_172\jre\lib\jce.jar;E:\Java\jdk1.8.0_172\jre\lib\charsets.jar;E:\Java\jdk1.8.0_172\jre\lib\jfr.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\access-bridge-64.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\cldrdata.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\dnsns.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\jaccess.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\jfxrt.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\localedata.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\nashorn.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\sunec.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\sunjce_provider.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\sunmscapi.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\sunpkcs11.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\zipfs.jar;E:\code\servlet\java-zk\target\classes;E:\code\servlet\java-zk\lib\zookeeper-3.4.14.jar;E:\developer\mvnResponsity\org\springframework\boot\spring-boot-starter\1.5.21.RELEASE\spring-boot-starter-1.5.21.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\boot\spring-boot\1.5.21.RELEASE\spring-boot-1.5.21.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\spring-context\4.3.24.RELEASE\spring-context-4.3.24.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\spring-aop\4.3.24.RELEASE\spring-aop-4.3.24.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\spring-beans\4.3.24.RELEASE\spring-beans-4.3.24.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\spring-expression\4.3.24.RELEASE\spring-expression-4.3.24.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\boot\spring-boot-autoconfigure\1.5.21.RELEASE\spring-boot-autoconfigure-1.5.21.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\boot\spring-boot-starter-logging\1.5.21.RELEASE\spring-boot-starter-logging-1.5.21.RELEASE.jar;E:\developer\mvnResponsity\ch\qos\logback\logback-classic\1.1.11\logback-classic-1.1.11.jar;E:\developer\mvnResponsity\ch\qos\logback\logback-core\1.1.11\logback-core-1.1.11.jar;E:\developer\mvnResponsity\org\slf4j\jcl-over-slf4j\1.7.26\jcl-over-slf4j-1.7.26.jar;E:\developer\mvnResponsity\org\slf4j\jul-to-slf4j\1.7.26\jul-to-slf4j-1.7.26.jar;E:\developer\mvnResponsity\org\slf4j\log4j-over-slf4j\1.7.26\log4j-over-slf4j-1.7.26.jar;E:\developer\mvnResponsity\org\springframework\spring-core\4.3.24.RELEASE\spring-core-4.3.24.RELEASE.jar;E:\developer\mvnResponsity\org\yaml\snakeyaml\1.17\snakeyaml-1.17.jar;E:\developer\mvnResponsity\org\apache\zookeeper\zookeeper\3.4.14\zookeeper-3.4.14.jar;E:\developer\mvnResponsity\org\slf4j\slf4j-api\1.7.26\slf4j-api-1.7.26.jar;E:\developer\mvnResponsity\org\slf4j\slf4j-log4j12\1.7.26\slf4j-log4j12-1.7.26.jar;E:\developer\mvnResponsity\com\github\spotbugs\spotbugs-annotations\3.1.9\spotbugs-annotations-3.1.9.jar;E:\developer\mvnResponsity\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;E:\developer\mvnResponsity\log4j\log4j\1.2.17\log4j-1.2.17.jar;E:\developer\mvnResponsity\jline\jline\0.9.94\jline-0.9.94.jar;E:\developer\mvnResponsity\org\apache\yetus\audience-annotations\0.5.0\audience-annotations-0.5.0.jar;E:\developer\mvnResponsity\io\netty\netty\3.10.6.Final\netty-3.10.6.Final.jar
15:49:00.266 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.library.path=E:\Java\jdk1.8.0_172\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;E:/Java/jdk1.8.0_172/jre/bin/server;E:/Java/jdk1.8.0_172/jre/bin;E:/Java/jdk1.8.0_172/jre/lib/amd64;E:\xftp\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;E:\Java\jdk1.8.0_172\lib;E:\Java\jdk1.8.0_172\jre\bin;E:\maven\apache-maven-3.5.3\bin;E:\software\mysql\mysql-8.0.15-winx64;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;;E:\sts\spring-tool-suite-3.9.4.RELEASE-e4.7.3a-win32-x86_64\sts-bundle\sts-3.9.4.RELEASE;;.
15:49:00.266 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.io.tmpdir=C:\Users\ADMINI~1\AppData\Local\Temp\
15:49:00.266 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.compiler=<NA>
15:49:00.266 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.name=Windows 10
15:49:00.266 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.arch=amd64
15:49:00.266 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.version=10.0
15:49:00.266 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.name=Administrator
15:49:00.266 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.home=C:\Users\Administrator
15:49:00.266 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.dir=E:\code\servlet\java-zk
15:49:00.267 [main] INFO org.apache.zookeeper.ZooKeeper - Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.zk.demo.CreateZookeeper$1@6d21714c
15:49:00.269 [main] DEBUG org.apache.zookeeper.ClientCnxn - zookeeper.disableAutoWatchReset is false
15:49:00.381 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.SaslServerPrincipal - Canonicalized address to 127.0.0.1
15:49:00.383 [main-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
15:49:00.384 [main-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session
15:49:00.385 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Session establishment request sent on 127.0.0.1/127.0.0.1:2181
15:49:00.399 [main-SendThread(127.0.0.1:2181)] WARN org.apache.zookeeper.ClientCnxnSocket - Connected to an old server; r-o mode will be unavailable
15:49:00.399 [main-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x16b07ab1dee0005, negotiated timeout = 5000
15:49:00.403 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x16b07ab1dee0005, packet:: clientPath:null serverPath:null finished:false header:: 1,1 replyHeader:: 1,71,0 request:: '/zksyn,#746573745a6f6f6b6565706572,v{s{31,s{'world,'anyone}}},0 response:: '/zksyn
建立節點成功
15:49:00.404 [main] DEBUG org.apache.zookeeper.ZooKeeper - Closing session: 0x16b07ab1dee0005
15:49:00.404 [main] DEBUG org.apache.zookeeper.ClientCnxn - Closing client for session: 0x16b07ab1dee0005
15:49:00.406 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x16b07ab1dee0005, packet:: clientPath:null serverPath:null finished:false header:: 2,-11 replyHeader:: 2,72,0 request:: null response:: null
15:49:00.406 [main] DEBUG org.apache.zookeeper.ClientCnxn - Disconnecting client for session: 0x16b07ab1dee0005
15:49:00.406 [main] INFO org.apache.zookeeper.ZooKeeper - Session: 0x16b07ab1dee0005 closed
從運作的結果可以看出,zk的建立是個異步過程,建立任務是新開了一條線程,從最後的列印日志也知道,新開的線程還是一條守護線程(主線程運作死亡,則自身死亡),是以 在zk的建立可能會出現 zk的連接配接還沒有建立成功,就已經開始建立節點,是以 這裡最好要阻塞,保證 zk建立連接配接成功以後,才能建立zk節點,可以通過線程join來确定線程先後執行順序,也可以使用信号量CountDownLatch,每次執行類似i--操作,當值為0的時候 則不阻塞,其餘狀态阻塞。修改以後的代碼:
package com.zk.demo;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
public class CreateZookeeper {
/**
* ZK位址和端口
*/
private static final String CONNETTION_ADDR = "127.0.0.1:2181";
/**
* session逾時時間
*/
private static final int SESSION_TIMEOUT = 5000;
/**
* 用于在zk建立連接配接的時候阻塞,不讓主程式往下運作 1表示初始值,每次調用則-1 等于0的時候 取消阻塞
*/
private static final CountDownLatch countDownLatch = new CountDownLatch(1);
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
ZooKeeper zk = new ZooKeeper(CONNETTION_ADDR, SESSION_TIMEOUT, new Watcher() {
public void process(WatchedEvent event) {
try {
// 休眠6秒
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 擷取時間的狀态
KeeperState keeperState = event.getState();
EventType tventType = event.getType();
// 如果是建立連接配接
if (KeeperState.SyncConnected == keeperState) {
if (EventType.None == tventType) {
System.out.println("等待6秒以後");
// 調用一次-1
countDownLatch.countDown();
}
}
}
});
// 進行阻塞,等待,隻有值為0的時候 才放行
countDownLatch.await();
String create = zk.create("/zksyn3", "testZookeeper".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("建立節點成功" + create);
zk.close();
}
}
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/E:/developer/mvnResponsity/ch/qos/logback/logback-classic/1.1.11/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/E:/developer/mvnResponsity/org/slf4j/slf4j-log4j12/1.7.26/slf4j-log4j12-1.7.26.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
16:01:38.559 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:zookeeper.version=3.4.14-4c25d480e66aadd371de8bd2fd8da255ac140bcf, built on 03/06/2019 16:18 GMT
16:01:38.560 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:host.name=NNH1J2ASSQP10BA
16:01:38.560 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.version=1.8.0_172
16:01:38.561 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.vendor=Oracle Corporation
16:01:38.561 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.home=E:\Java\jdk1.8.0_172\jre
16:01:38.561 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.class.path=E:\Java\jdk1.8.0_172\jre\lib\resources.jar;E:\Java\jdk1.8.0_172\jre\lib\rt.jar;E:\Java\jdk1.8.0_172\jre\lib\jsse.jar;E:\Java\jdk1.8.0_172\jre\lib\jce.jar;E:\Java\jdk1.8.0_172\jre\lib\charsets.jar;E:\Java\jdk1.8.0_172\jre\lib\jfr.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\access-bridge-64.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\cldrdata.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\dnsns.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\jaccess.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\jfxrt.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\localedata.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\nashorn.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\sunec.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\sunjce_provider.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\sunmscapi.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\sunpkcs11.jar;E:\Java\jdk1.8.0_172\jre\lib\ext\zipfs.jar;E:\code\servlet\java-zk\target\classes;E:\code\servlet\java-zk\lib\zookeeper-3.4.14.jar;E:\developer\mvnResponsity\org\springframework\boot\spring-boot-starter\1.5.21.RELEASE\spring-boot-starter-1.5.21.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\boot\spring-boot\1.5.21.RELEASE\spring-boot-1.5.21.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\spring-context\4.3.24.RELEASE\spring-context-4.3.24.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\spring-aop\4.3.24.RELEASE\spring-aop-4.3.24.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\spring-beans\4.3.24.RELEASE\spring-beans-4.3.24.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\spring-expression\4.3.24.RELEASE\spring-expression-4.3.24.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\boot\spring-boot-autoconfigure\1.5.21.RELEASE\spring-boot-autoconfigure-1.5.21.RELEASE.jar;E:\developer\mvnResponsity\org\springframework\boot\spring-boot-starter-logging\1.5.21.RELEASE\spring-boot-starter-logging-1.5.21.RELEASE.jar;E:\developer\mvnResponsity\ch\qos\logback\logback-classic\1.1.11\logback-classic-1.1.11.jar;E:\developer\mvnResponsity\ch\qos\logback\logback-core\1.1.11\logback-core-1.1.11.jar;E:\developer\mvnResponsity\org\slf4j\jcl-over-slf4j\1.7.26\jcl-over-slf4j-1.7.26.jar;E:\developer\mvnResponsity\org\slf4j\jul-to-slf4j\1.7.26\jul-to-slf4j-1.7.26.jar;E:\developer\mvnResponsity\org\slf4j\log4j-over-slf4j\1.7.26\log4j-over-slf4j-1.7.26.jar;E:\developer\mvnResponsity\org\springframework\spring-core\4.3.24.RELEASE\spring-core-4.3.24.RELEASE.jar;E:\developer\mvnResponsity\org\yaml\snakeyaml\1.17\snakeyaml-1.17.jar;E:\developer\mvnResponsity\org\apache\zookeeper\zookeeper\3.4.14\zookeeper-3.4.14.jar;E:\developer\mvnResponsity\org\slf4j\slf4j-api\1.7.26\slf4j-api-1.7.26.jar;E:\developer\mvnResponsity\org\slf4j\slf4j-log4j12\1.7.26\slf4j-log4j12-1.7.26.jar;E:\developer\mvnResponsity\com\github\spotbugs\spotbugs-annotations\3.1.9\spotbugs-annotations-3.1.9.jar;E:\developer\mvnResponsity\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;E:\developer\mvnResponsity\log4j\log4j\1.2.17\log4j-1.2.17.jar;E:\developer\mvnResponsity\jline\jline\0.9.94\jline-0.9.94.jar;E:\developer\mvnResponsity\org\apache\yetus\audience-annotations\0.5.0\audience-annotations-0.5.0.jar;E:\developer\mvnResponsity\io\netty\netty\3.10.6.Final\netty-3.10.6.Final.jar
16:01:38.561 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.library.path=E:\Java\jdk1.8.0_172\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;E:/Java/jdk1.8.0_172/jre/bin/server;E:/Java/jdk1.8.0_172/jre/bin;E:/Java/jdk1.8.0_172/jre/lib/amd64;E:\xftp\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;E:\Java\jdk1.8.0_172\lib;E:\Java\jdk1.8.0_172\jre\bin;E:\maven\apache-maven-3.5.3\bin;E:\software\mysql\mysql-8.0.15-winx64;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;;E:\sts\spring-tool-suite-3.9.4.RELEASE-e4.7.3a-win32-x86_64\sts-bundle\sts-3.9.4.RELEASE;;.
16:01:38.561 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.io.tmpdir=C:\Users\ADMINI~1\AppData\Local\Temp\
16:01:38.561 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.compiler=<NA>
16:01:38.561 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.name=Windows 10
16:01:38.561 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.arch=amd64
16:01:38.561 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.version=10.0
16:01:38.561 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.name=Administrator
16:01:38.561 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.home=C:\Users\Administrator
16:01:38.561 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.dir=E:\code\servlet\java-zk
16:01:38.562 [main] INFO org.apache.zookeeper.ZooKeeper - Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.zk.demo.CreateZookeeper$1@6d21714c
16:01:38.564 [main] DEBUG org.apache.zookeeper.ClientCnxn - zookeeper.disableAutoWatchReset is false
16:01:38.677 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.SaslServerPrincipal - Canonicalized address to 127.0.0.1
16:01:38.679 [main-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
16:01:38.680 [main-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session
16:01:38.681 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Session establishment request sent on 127.0.0.1/127.0.0.1:2181
16:01:38.694 [main-SendThread(127.0.0.1:2181)] WARN org.apache.zookeeper.ClientCnxnSocket - Connected to an old server; r-o mode will be unavailable
16:01:38.695 [main-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x16b07ab1dee0008, negotiated timeout = 5000
16:01:40.352 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x16b07ab1dee0008 after 1ms
16:01:42.017 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x16b07ab1dee0008 after 0ms
16:01:43.684 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x16b07ab1dee0008 after 0ms
等待6秒以後
16:01:44.710 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x16b07ab1dee0008, packet:: clientPath:null serverPath:null finished:false header:: 1,1 replyHeader:: 1,80,0 request:: '/zksyn3,#746573745a6f6f6b6565706572,v{s{31,s{'world,'anyone}}},0 response:: '/zksyn3
建立節點成功/zksyn3
16:01:44.711 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x16b07ab1dee0008 after 12ms
16:01:44.711 [main] DEBUG org.apache.zookeeper.ZooKeeper - Closing session: 0x16b07ab1dee0008
16:01:44.711 [main] DEBUG org.apache.zookeeper.ClientCnxn - Closing client for session: 0x16b07ab1dee0008
16:01:44.713 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x16b07ab1dee0008, packet:: clientPath:null serverPath:null finished:false header:: 2,-11 replyHeader:: 2,81,0 request:: null response:: null
16:01:44.713 [main] DEBUG org.apache.zookeeper.ClientCnxn - Disconnecting client for session: 0x16b07ab1dee0008
16:01:44.713 [main] INFO org.apache.zookeeper.ZooKeeper - Session: 0x16b07ab1dee0008 closed
16:01:44.713 [main-EventThread] INFO org.apache.zookeeper.ClientCnxn - EventThread shut down for session: 0x16b07ab1dee0008
5.關于建立zk節點的幾種類型:
String create = zk.create("/zksyn3", "testZookeeper".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
public String create(final String path, byte data[], List<ACL> acl,
CreateMode createMode)
throws KeeperException, InterruptedException
{
final String clientPath = path;
PathUtils.validatePath(clientPath, createMode.isSequential());
final String serverPath = prependChroot(clientPath);
RequestHeader h = new RequestHeader();
h.setType(ZooDefs.OpCode.create);
CreateRequest request = new CreateRequest();
CreateResponse response = new CreateResponse();
request.setData(data);
request.setFlags(createMode.toFlag());
request.setPath(serverPath);
if (acl != null && acl.size() == 0) {
throw new KeeperException.InvalidACLException();
}
request.setAcl(acl);
ReplyHeader r = cnxn.submitRequest(h, request, response, null);
if (r.getErr() != 0) {
throw KeeperException.create(KeeperException.Code.get(r.getErr()),
clientPath);
}
if (cnxn.chrootPath == null) {
return response.getPath();
} else {
return response.getPath().substring(cnxn.chrootPath.length());
}
}
path:表示路徑必須以"/" 開始
byte:建立節點的内容
acl:節點的記錄或者标記(通路的權限該節點的)
createMode:節點的類型
public enum CreateMode {
/**
* The znode will not be automatically deleted upon client's disconnect.
*/
PERSISTENT (0, false, false),//持久節點
/**
* The znode will not be automatically deleted upon client's disconnect,
* and its name will be appended with a monotonically increasing number.
*/
PERSISTENT_SEQUENTIAL (2, false, true),//有序持久節點
/**
* The znode will be deleted upon the client's disconnect.
*/
EPHEMERAL (1, true, false),//臨時節點
/**
* The znode will be deleted upon the client's disconnect, and its name
* will be appended with a monotonically increasing number.
*/
EPHEMERAL_SEQUENTIAL (3, true, true);//臨時有序節點
臨時節點在zk連接配接關閉斷開以後,則節點資訊消失,以上就是簡單的java操作zookeeper的方式
轉載于:https://www.cnblogs.com/920913cheng/p/10930012.html