中間件 ZK分佈式專題與Dubbo微服務入門 6-2 zk會話重連機制

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

 使用nc(NetCat)工具連接本地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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章