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