您好,登錄后才能下訂單哦!
這篇文章主要介紹“zk client會(huì)話過(guò)程是怎樣的”,在日常操作中,相信很多人在zk client會(huì)話過(guò)程是怎樣的問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”zk client會(huì)話過(guò)程是怎樣的”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
client會(huì)話過(guò)程
zk客戶(hù)端的主要核心組件
zk客戶(hù)端會(huì)話過(guò)程
初始化階段
創(chuàng)建階段
響應(yīng)階段
UML圖
zk客戶(hù)端主要組件
zookeeper 客戶(hù)端入口
ClientWatchManager:客戶(hù)端Watch管理器
HostProvider:客戶(hù)端地址管理器
ClientCnxn:核心線程,包含SendThread和EventThread兩個(gè)線程
SendThread為i/o線程,主要負(fù)責(zé)客戶(hù)端和服務(wù)器之間網(wǎng)絡(luò)io
EventTrhead為事件線程
初始化階段
主要分為:
1 初始化ZooKeeper對(duì)象
通過(guò)調(diào)用zookeeper的構(gòu)造方法實(shí)例化一個(gè)對(duì)象,初始化過(guò)程中會(huì)創(chuàng)建一個(gè)watcher管理器ClientWatcherManager
2 設(shè)置會(huì)話默認(rèn)watcher
如果構(gòu)造中傳入一個(gè)watcher,就將它作為默認(rèn)watcher保存到ClientWatcherManager
3 構(gòu)建zk服務(wù)地址列表管理器HostProvider
通過(guò)構(gòu)造器傳入的服務(wù)端地址列表,將其保存在服務(wù)器地址列表管理器中HostProvider
4 創(chuàng)建并初始化客戶(hù)端網(wǎng)絡(luò)連接
zookeeper客戶(hù)端創(chuàng)建一個(gè)網(wǎng)絡(luò)連接器ClientCnxn,用來(lái)管理客戶(hù)端和服務(wù)端網(wǎng)絡(luò)交互
創(chuàng)建ClientCnxn過(guò)程中還會(huì)初始化客戶(hù)端兩個(gè)核心隊(duì)列outGoingQueue和pendingQueue
作為客戶(hù)端發(fā)送請(qǐng)求隊(duì)列和服務(wù)端響應(yīng)等待隊(duì)列
5初始化SendThread和EventThread
會(huì)話創(chuàng)建階段
6啟動(dòng)SendThread和EventThread
sendTHread首先會(huì)判斷當(dāng)前客戶(hù)端的狀態(tài),進(jìn)行一系列清理性工作,為客戶(hù)端發(fā)送“會(huì)話創(chuàng)建”請(qǐng)求準(zhǔn)備
7獲取一個(gè)服務(wù)地址
在創(chuàng)建TCP之前,SendThread首先需要獲取一個(gè)ZooKeeper服務(wù)器的目標(biāo)地址,通常就是從HostProvider中隨機(jī)獲取出一個(gè)地址,然后委托給ClientCnxnSocket去創(chuàng)建與Zookeeper服務(wù)器之間的TCP連接
8 創(chuàng)建tcp連接,獲取一個(gè)服務(wù)器地址后,clientCnxnSocket負(fù)責(zé)和服務(wù)器創(chuàng)建一個(gè)TCP長(zhǎng)連接
9構(gòu)建ConnectRequest請(qǐng)求
在TCP連接創(chuàng)建完畢后,就說(shuō)明已經(jīng)和zookeeper服務(wù)器完成了連接呢?其實(shí)不是,上面的步驟只是從網(wǎng)絡(luò)tcp層完成了socket連接,但沒(méi)有完成zookeeper客戶(hù)端和服務(wù)端的連接
SendThread會(huì)負(fù)責(zé)當(dāng)前請(qǐng)求參數(shù),構(gòu)造出一個(gè)ConnectRequest請(qǐng)求,同時(shí)將包裝成網(wǎng)絡(luò)io層的Packet對(duì)象,放入發(fā)送隊(duì)列outgoingQueue中
10 發(fā)送請(qǐng)求
ClientCnxnSocket將從outgoingQueue中取出待發(fā)送的Packet,序列化成bytebuffer,進(jìn)行發(fā)送
響應(yīng)處理階段
11響應(yīng)處理
接收到服務(wù)端響應(yīng)后,首先判斷當(dāng)前客戶(hù)端狀態(tài)是否是“已初始化”,如果沒(méi)有完成初始化,那么認(rèn)為該響應(yīng)一定是會(huì)話創(chuàng)建請(qǐng)求的響應(yīng),交給readConnnectResult方法處理響應(yīng)
12 處理respinse
ClientCnxnSocket會(huì)對(duì)接收到的服務(wù)端響應(yīng)進(jìn)行反序列化,得到ConnectResponse對(duì)象,并從中獲取到zookeeper服務(wù)端分配的會(huì)話sessionId,
13 連接成功
通知SendThread線程,處理會(huì)話參數(shù)設(shè)置,包括時(shí)間設(shè)置等等
另一個(gè)方面,需要通知地址管理器HostProvider當(dāng)前成功連接的服務(wù)器地址
14 生成事件
為了能夠讓上層應(yīng)用感應(yīng)到會(huì)話成功創(chuàng)建,SendThread會(huì)生成一個(gè)事件SyncConnected-None,代表會(huì)話創(chuàng)建成功,并將事件傳遞給EventTread線程
15 查詢(xún)Watcher
EventThread收到事件后,從ClientWatchManager管理器中查詢(xún)出對(duì)應(yīng)的watcher,放入waitingEvents隊(duì)列中
16 處理事件
取出事件對(duì)應(yīng)的watcher列表,調(diào)用process接口,達(dá)到出發(fā)watcher目的
public ZooKeeper( String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly, HostProvider aHostProvider, ZKClientConfig clientConfig) throws IOException { LOG.info("Initiating client connection, connectString=" + connectString + " sessionTimeout=" + sessionTimeout + " watcher=" + watcher); if (clientConfig == null) { clientConfig = new ZKClientConfig(); } this.clientConfig = clientConfig; watchManager = defaultWatchManager(); watchManager.defaultWatcher = watcher; ConnectStringParser connectStringParser = new ConnectStringParser(connectString); hostProvider = aHostProvider; cnxn = createConnection( connectStringParser.getChrootPath(), hostProvider, sessionTimeout, this, watchManager, getClientCnxnSocket(), canBeReadOnly); cnxn.start(); } // @VisibleForTesting protected ClientCnxn createConnection( String chrootPath, HostProvider hostProvider, int sessionTimeout, ZooKeeper zooKeeper, ClientWatchManager watcher, ClientCnxnSocket clientCnxnSocket, boolean canBeReadOnly) throws IOException { return new ClientCnxn( chrootPath, hostProvider, sessionTimeout, this, watchManager, clientCnxnSocket, canBeReadOnly); }
到此,關(guān)于“zk client會(huì)話過(guò)程是怎樣的”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。