0 課程地址
https://coding.imooc.com/lesson/201.html#mid=12718
1 重點關注
1.1 本節內容
驗證了使用sessionid和sessionPassword重連的session和之前的session一致,詳見3.1
2 課程內容
2.1 擴展之:echo dump|nc localhost 2181
- echo 打印輸出
- dump 列出所有會話和臨時節點
- nc - Linux nc命令用於設置路由器。語法爲nc IP地址 端口號。
- IP地址 - 即ZooKeeper所在的服務器IP地址
- 端口 - 即ZooKeeper的端口號。
- | 管道符 後邊作爲參數,在前邊輸出
更多zk命令參考:
https://blog.csdn.net/succing/article/details/121793494
2.2 擴展之:nc
- 原因:源於使用nc命令時報錯:
Ncat: Connection refused
- 解決方案:
直接在命令行裏輸入: nc 如果顯示: Ncat: You must specify a host to connect to. QUITTING. 恭喜你,與博主的問題一致,下面是解決方案與問題解析 解決方法 wget https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz --no-check-certificate tar -zxf netcat-0.7.1.tar.gz cd netcat-0.7.1/ ./configure sudo make sudo make install 然後寫入環境: sudo vim /etc/profile 在最後寫入: export NETCAT_HOME=/usr/local/netcat export PATH=$PATH:$NETCAT_HOME/bin 最後使配置生效: source /etc/profile 然後輸入nc就可以得到: Cmd line: 這樣nc命令就成功了
- 注意:環境變量部分
如果你的配置文件裏已經有環境變量了,只需要把Path追加進去就好,比如我的profile
export PATH=$PATH:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$NETCAT_HOME/bin export NETCAT_HOME=/usr/local/netcat
- 報錯分析原理:(這個我沒用,使用解決方案已經解決了我的問題)
nc與netcat通常是一個東西,而ncat(也稱nmap-ncat)是另一個東西,默認的nc命令鏈接到了ncat,所以自然得不到我們想要的結果
首先嚐試輸入:
netcat
沒有這個命令,然後通過命令:
whereis nc
可以看到連接的是:nc: /usr/bin/nc /usr/share/man/man1/nc.1.gz,並不是netcat,所以遇到這種情況大概率是沒有安裝過netcat,安裝一下就行,同時編譯安裝後會自動踢掉這個軟連接,安裝完成後輸入nc就可以得到:
Cmd line:
- ncat簡介:
netcat稱爲網絡工具中的瑞士軍刀,體積小巧,但功能強大,爲了方便常用nc作爲其簡稱。 它可以在兩臺設備上面相互交互,主要就是偵聽模式和傳輸模式。大致功能如下:
Telnet功能(本案例使用)
獲取banner信息
傳輸文本信息
傳輸文件/目錄
加密傳輸文件,默認不加密
遠程控制
加密所有流量
流媒體服務器
遠程克隆硬盤
參考:
https://blog.csdn.net/qq_63844103/article/details/127681824
https://blog.csdn.net/weixin_35757704/article/details/121456089
2.3 擴展之 wget安裝:
- 原因:使用2.2命令wget連接時報錯
wget: 未找到命令
- 解決方案:
-bash: wget: 未找到命令,原因爲linux系統缺少命令環境。 centos 系統下,執行以下命令進行安裝 yum install wget -y ubuntu系統,需要執行以下命令 apt-get install -y wget
參考:
https://blog.csdn.net/luobotoutou123/article/details/130609494
3 Coding
3.1 驗證使用sessionid和sessionPassword重連的session和之前的session一致
- 啓動zk服務端
進入到 cd /usr/local/zookeeper/bin 重啓zookeeper服務端 ./zkServer.sh restart
- 驗證類:
package com.imooc.zk.demo; 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 * @Description: zookeeper 恢復之前的會話連接demo演示 */ public class ZKConnectSessionWatcher implements Watcher { final static Logger log = LoggerFactory.getLogger(ZKConnectSessionWatcher.class); public static final String zkServerPath = "172.26.139.4:2181"; public static final Integer timeout = 5000; public static void main(String[] args) throws Exception { //1 第1次獲取連接 ZooKeeper zk = new ZooKeeper(zkServerPath, timeout, new ZKConnectSessionWatcher()); long sessionId = zk.getSessionId(); //1.1 因爲sessionid是long類型的,要和服務端的sessionid進行對比,故轉化成16進制的方便對比 String ssid = "0x" + Long.toHexString(sessionId); System.out.println(ssid); byte[] sessionPassword = zk.getSessionPasswd(); log.warn("客戶端開始連接zookeeper服務器..."); log.warn("連接狀態:{}", zk.getState()); new Thread().sleep(1000); log.warn("連接狀態:{}", zk.getState()); new Thread().sleep(200); // 開始會話重連 log.warn("開始會話重連..."); //2 第2次獲取連接 ZooKeeper zkSession = new ZooKeeper(zkServerPath, timeout, new ZKConnectSessionWatcher(), sessionId, sessionPassword); log.warn("重新連接狀態zkSession:{}", zkSession.getState()); new Thread().sleep(1000); log.warn("重新連接狀態zkSession:{}", zkSession.getState()); } @Override public void process(WatchedEvent event) { log.warn("接受到watch通知:{}", event); } }
- debug分別在第1次連接和第2次連接時斷點,查看zk服務端的sessionId
可以和下邊的日誌(標紅部分)對比,sessionid一致
- STS日誌
2024-03-30 07:46:50,950 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:SyncConnected type:None path:null 0x10016d7df880002 2024-03-30 07:47:18,645 [main] [com.imooc.zk.demo.ZKConnectSessionWatcher.main(ZKConnectSessionWatcher.java:30)] - [WARN] 客戶端開始連接zookeeper服務器... 2024-03-30 07:47:19,240 [main] [com.imooc.zk.demo.ZKConnectSessionWatcher.main(ZKConnectSessionWatcher.java:31)] - [WARN] 連接狀態:CONNECTED 2024-03-30 07:47:21,256 [main] [com.imooc.zk.demo.ZKConnectSessionWatcher.main(ZKConnectSessionWatcher.java:33)] - [WARN] 連接狀態:CONNECTED 2024-03-30 07:47:22,901 [main] [com.imooc.zk.demo.ZKConnectSessionWatcher.main(ZKConnectSessionWatcher.java:38)] - [WARN] 開始會話重連... 2024-03-30 07:47:33,453 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:SyncConnected type:None path:null 2024-03-30 07:47:33,564 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:Disconnected type:None path:null 2024-03-30 07:47:35,007 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:SyncConnected type:None path:null 2024-03-30 07:47:35,115 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:Disconnected type:None path:null 2024-03-30 07:47:36,567 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:SyncConnected type:None path:null 2024-03-30 07:47:36,677 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:Disconnected type:None path:null 2024-03-30 07:47:37,788 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:SyncConnected type:None path:null 2024-03-30 07:47:37,898 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:Disconnected type:None path:null 2024-03-30 07:47:38,928 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:SyncConnected type:None path:null 2024-03-30 07:47:39,036 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:Disconnected type:None path:null 2024-03-30 07:47:40,164 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:SyncConnected type:None path:null 2024-03-30 07:47:40,265 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:Disconnected type:None path:null 2024-03-30 07:47:41,781 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:SyncConnected type:None path:null 2024-03-30 07:47:41,896 [main-EventThread] [com.imooc.zk.demo.ZKConnectSessionWatcher.process(ZKConnectSessionWatcher.java:52)] - [WARN] 接受到watch通知:WatchedEvent state:Disconnected type:None path:null 2024-03-30 07:47:42,406 [main] [com.imooc.zk.demo.ZKConnectSessionWatcher.main(ZKConnectSessionWatcher.java:45)] - [WARN] 重新連接狀態zkSession:CONNECTED 2024-03-30 07:47:43,415 [main] [com.imooc.zk.demo.ZKConnectSessionWatcher.main(ZKConnectSessionWatcher.java:47)] - [WARN] 重新連接狀態zkSession:CONNECTED
- 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