connect是用戶端向zk伺服器發起連結函數;client向zk zerver發起連結時分為兩步:1.tcp三次握手;2.握手成功後與zk server進行atuh認證維持的狀态
stateunknown state = -1//未使用
statedisconnected state = 0//client與zk server連結斷開;1.在client與zkserver tcp三次握手成功後與zkserver進行auth認證時session超期置為此狀态;2.client主動斷開連結
stateconnecting state = 1//準備發起tcp連結但還未成功
stateauthfailed state = 4//
stateconnectedreadonly state = 5
statesaslauthenticated state = 6
stateexpired state = -112//tcp連結成功後與zk server進行auth過程中session逾時
stateconnected = state(100)//已經完成tcp連結
statehassession = state(101)//已經完成atuh認證,在session隻有為此狀态此時go- zookeeper建立的連結才可用
以下是go-zeekeeper部分源碼詳解
connect中調用loop,在loop中做的重要的兩件事:
調用connect進行tcp三次握手,成功後并置為connected狀态
調用auth進行連結後的狀态維護,完成後置為hassession狀态
auth成功後,起兩個協程,一個進行資料發送(包含心跳維護,檢測服務是否正常,如服務不正常用戶端關閉);一個進行資料接受(或者服務端watch節點變化發送的watch消息進行處理,處理後再次添加到con的watchers清單中,并且調用全局的watch函數,此函數在建立zk連結時可作為可選參數傳入)
go- zookeeper的watch是通過event來實作的,有兩種處理方式:1.局部處理,處理監聽connect傳回的ec來處理watch;2.添加全局的withwatchevent,每次server發消watch消息時client自動調用此函數。
go-zookeeper watch隻watch一次,當watch消息傳回後想再次watch需再一次調用watch函數
局部處理,對go-zookeeper進行封裝,處理每次傳回的event
全局watch
例子
其它api如:children(擷取該節點下的所有子節點)與childrenw差別是後者為該節點添加watch功能;get擷取此節點資訊;exist判斷此節點是否存在。建立一個節點時首先要建立其父節點,隻有父節點存在才能建立子節點。
部署zookeeper時在docker上部署,用docker-compose來管理,docker安裝zookeeper檔案:
view code
docker:http://www.dockerinfo.net/%e5%ba%95%e5%b1%82%e5%ae%9e%e7%8e%b0
protocol buf:https://developers.google.com/protocol-buffers/docs/overview
中文版protocol buf:https://skyao.gitbooks.io/learning-proto3/content/guide/language/options.html