zookeeper學習(二)之java客戶端API建立連接

 2023-11-19 阅读 26 评论 0

摘要:大家都知道,zookeeper作為一個分布式服務框架,用來解決分布式數據不一致的問題,今天來看看的提供的java語言的API,下面是zookeeper 3.4.1的文檔地址,百度的apihttp://zookeeper.apache.org/doc/r3.4.1/api/overview-summary.html ?看上去還

大家都知道,zookeeper作為一個分布式服務框架,用來解決分布式數據不一致的問題,今天來看看的提供的java語言的API,下面是zookeeper 3.4.1的文檔地址,百度的apihttp://zookeeper.apache.org/doc/r3.4.1/api/overview-summary.html

?看上去還是比較簡潔的,那么我們先看看連接服務器的zookeeper實例的構造函數,以下代碼參考學習 《從Paxos到Zookeeper分布式一致性原理與實踐》第五章,這本書講的還是挺不錯的,畢竟看懂了一些哈

那么我們先來看看運行結果吧,哎喲,執行是成功的。

下面看看文檔中的構造函數吧,可以看出有四個,我們上面的代碼使用的是最簡單的第一種類型,三個參數,看不懂,那就點進去

?

??這邊參數也說明的很清楚,第一個是連接地址的配置 ip:port的模式,中間可以用逗號隔開,也可以后面再加上 根目錄,之后連接的處理會基于這個根目錄處理,第二個是會話超時時間,就是在sessionTimeOut時間內心跳檢測失敗,那么這個這個客戶端就要和服務器市區聯系啦,當然在服務器端也有一個會話的管理,如果在sessionTimeOut時間內與client的心跳檢測失敗,也會將會話致為失效,至于集群session是怎么管理的,指的研究下。watch就就和他的解釋一樣,監聽狀態變化,也可以是節點的事件,傳null也是可以的。??

?第二個構造函數加上了canBeReadOnly,這個意思就和它的名字一樣啦,只讀,集群有效的情況就是過半的機器保持這消息通訊,為什么要這樣,這是zookeeper實現的ZAB協議,用來保持數據一致性(還想好好理清楚)。

????后面兩個加上了sessionId和SessionPasswd,在于服務器連接后,會返回這兩個,而且這兩個參數可以唯一確定一個會話,就是可以再傳入連接。

????看打出來的日志可以看到zookeeper客戶端和服務器的會話建立是一個異步的過程,就是說直接返回的時候,不知道會話是否建立,可以看到狀態是

CONNECTING連接中,然后用了CountDownLatch等待異步結果,這里還是挺好奇watch的是怎么實現的(還需要再看)。

????zookeeper類里面還有一個枚舉(我寫的關于訂單的枚舉,很多地方都會用到,原來在訂單bean里面,后來嫌太麻煩,我就將之移除來,這樣查用起來也方便一些),但是沒找到這個狀態的文字說明,顧名思義吧,只是AUTH_FAILED這個認證失敗是哪里用到的?是訪問問某個根目錄的連接權限嗎?還有兩個判斷iaAlive和isConnected。

????再看看創建的連接的過程吧

????這邊開始先設置watchManager.defaultWatcher?= watcher;,這是watchManagerguan管理器,里面定義了四種watch的類型,還有一個materialize方法

? ??????接著解析了 連接地址,也沒什么好說的

最后的目的是構造一個ClientCnxn,根據文字說明,這是一個處理client與server的io的類,一臉懵逼!

創建ClientCnxn,這邊獲取了一個 ZOOKEEPER_CLIENT_CNXN_SOCKET?= "zookeeper.clientCnxnSocket"類,獲取不到就使用ClientCnxnSocketNIO

?構建一個實際的連接類,這邊readRimeOut賦值取了sessionTimeOut的2/3,此中有深意嗎?這邊的sendThread和eventThread是ClientCnxn中兩個繼承了Thread的內部類,具體到看Run方法比較復雜,其實就是看不懂哈。sendThread的run主要是先判斷state.isAlive(),進入方法體,判斷

clientCnxnSocket.isConnected()是否是連接狀態,首次連接,執行startConnect()

?在startConnect方法體里面,主要是執行下面的zooKeeperSaslClient連接,當然還有很多操作,還有下面異常的處理LoginExcetion,點開zooKeeperSaslClient還會看到一大段代碼,主要createSaslClient(serverPrincipal,?clientSection),在這里面會執行一個login?=?newLogin(loginContext,?new?ClientCallbackHandler(null))登錄操作,又一大串操作,真是剪不斷理還不清,感覺之后看會話,watch機制等還會接觸他們,之后看是否可以熟悉點,再理理寫點他們之間的邏輯。

?最后執行start,建立連接,等待異步返回結果,這樣的設計,我覺得還是很神奇的,因為我沒有這么寫過。

有什么討論的內容,可以加我公眾號:

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/183412.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息