0 課程地址
https://coding.imooc.com/lesson/201.html#mid=12717
1 重點關注
1.1 本節內容
使用STS開發工具作爲客戶端連接zk服務端,詳見3.1
1.2 連接方式參數說明
如下段zk原生class標註:
- connectString:
連接zk服務端的ip和端口(比如案例的 集羣:127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002,單機:172.26.139.4:2181)
- sessionTimeout:
session會話的超時時間
- watcher:
watcher事件
a 本類直接實現 Watcher接口,傳入本類,然後再process方法寫業務邏輯即可(process方法是Watcher接口的抽象方法,所以子類可以重寫)。 詳見3.1
b process方法入參 WatchedEvent 的屬性 EventType 是枚舉,可以判斷事件類型,比如節點創建刪除更改等,我已在下邊標註對應的字典
- sessionId和sessionPasswd(不常用)
舊的session斷開後,可以用這兩個字段恢復舊的會話
- canBeReadOnly(不常用)
會話已經斷開,原先會話的數據還是可以讀取(因爲斷開連接了,原數據可能已經不是最新的了,讀取的可能數據不一致,所以通常不用或者設置爲false)
/** * * * @param connectString * comma separated host:port pairs, each corresponding to a zk * server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" * If the optional chroot suffix is used the example would look * like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" * where the client would be rooted at "/app/a" and all paths * would be relative to this root - ie getting/setting/etc... * "/foo/bar" would result in operations being run on * "/app/a/foo/bar" (from the server perspective). * @param sessionTimeout * session timeout in milliseconds * @param watcher * a watcher object which will be notified of state changes, may * also be notified for node events * @param sessionId * specific session id to use if reconnecting * @param sessionPasswd * password for this session * @param canBeReadOnly * (added in 3.4) whether the created client is allowed to go to * read-only mode in case of partitioning. Read-only mode * basically means that if the client can't find any majority * servers but there's partitioned server it could reach, it * connects to one in read-only mode, i.e. read requests are * allowed while write requests are not. It continues seeking for * majority in the background. * * @throws IOException in cases of network failure * @throws IllegalArgumentException if an invalid chroot path is specified */ public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd, boolean canBeReadOnly) throws IOException { LOG.info("Initiating client connection, connectString=" + connectString + " sessionTimeout=" + sessionTimeout + " watcher=" + watcher + " sessionId=" + Long.toHexString(sessionId) + " sessionPasswd=" + (sessionPasswd == null ? "<null>" : "<hidden>")); watchManager.defaultWatcher = watcher; ConnectStringParser connectStringParser = new ConnectStringParser( connectString); HostProvider hostProvider = new StaticHostProvider( connectStringParser.getServerAddresses()); cnxn = new ClientCnxn(connectStringParser.getChrootPath(), hostProvider, sessionTimeout, this, watchManager, getClientCnxnSocket(), sessionId, sessionPasswd, canBeReadOnly); cnxn.seenRwServerBefore = true; // since user has provided sessionId cnxn.start(); }
None (-1), NodeCreated (1), NodeDeleted (2), NodeDataChanged (3), NodeChildrenChanged (4);
2 課程內容
2.1 STS下載安裝
- 下載鏈接:STS下載地址
- 直接點擊下載即可;
- 直接解壓文件即可使用;
- 雙擊STS打開工具
參考:
https://blog.csdn.net/qq_42139049/article/details/129034837
3 Coding
3.1 通過STS連接zk服務端
- 主類:
package com.imooc.zk.demo; import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @Title: ZKConnectDemo.java * @Package com.imooc.zk.demo * @Description: zookeeper 連接demo演示 */ public class ZKConnect implements Watcher { final static Logger log = LoggerFactory.getLogger(ZKConnect.class); public static final String zkServerPath = "172.26.139.4:2181"; // public static final String zkServerPath = "192.168.1.111:2181,192.168.1.111:2182,192.168.1.111:2183"; public static final Integer timeout = 5000; public static void main(String[] args) throws Exception { /** * 客戶端和zk服務端鏈接是一個異步的過程 * 當連接成功後後,客戶端會收的一個watch通知 * * 參數: * connectString:連接服務器的ip字符串, * 比如: "192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181" * 可以是一個ip,也可以是多個ip,一個ip代表單機,多個ip代表集羣 * 也可以在ip後加路徑 * sessionTimeout:超時時間,心跳收不到了,那就超時 * watcher:通知事件,如果有對應的事件觸發,則會收到一個通知;如果不需要,那就設置爲null * canBeReadOnly:可讀,當這個物理機節點斷開後,還是可以讀到數據的,只是不能寫, * 此時數據被讀取到的可能是舊數據,此處建議設置爲false,不推薦使用 * sessionId:會話的id * sessionPasswd:會話密碼 當會話丟失後,可以依據 sessionId 和 sessionPasswd 重新獲取會話 */ ZooKeeper zk = new ZooKeeper(zkServerPath, timeout, new ZKConnect()); log.warn("客戶端開始連接zookeeper服務器..."); log.warn("連接狀態:{}", zk.getState()); new Thread().sleep(2000); log.warn("連接狀態:{}", zk.getState()); } @Override public void process(WatchedEvent event) { log.warn("接受到watch通知:{}", event); } }
- log4j.properties
log4j.rootLogger=WARN,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.encoding=UTF-8
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%l] - [%p] %m%n
- 打印日誌:
可見,已經打印出了process方法的內容
2024-03-29 07:30:34,843 [main] [com.imooc.zk.demo.ZKConnect.main(ZKConnect.java:43)] - [WARN] 客戶端開始連接zookeeper服務器... 2024-03-29 07:30:34,848 [main] [com.imooc.zk.demo.ZKConnect.main(ZKConnect.java:44)] - [WARN] 連接狀態:CONNECTING 2024-03-29 07:30:34,880 [main-EventThread] [com.imooc.zk.demo.ZKConnect.process(ZKConnect.java:53)] - [WARN] 接受到watch通知:WatchedEvent state:SyncConnected type:None path:null 2024-03-29 07:30:36,859 [main] [com.imooc.zk.demo.ZKConnect.main(ZKConnect.java:48)] - [WARN] 連接狀態:CONNECTED