中間件 ZK分佈式專題與Dubbo微服務入門 6-1 建立客戶端與zk服務端的連接

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打開工具

參考:

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

 

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