3 客户端
核心组件:
整体结构:
初始化和启动过程大体分为3个步骤:
3.1 一次会话的创建过程
接下来使用文字来解析流程图:分为三个阶段
- 初始化阶段:ZooKeeper、Watcher、HostProvider、ClientCnxn、SendThread、EventThread
- 会话创建阶段
- 响应处理阶段
接下来讲解具体组件
3.2 服务器地址列表
服务器列表是一个使用英文状态逗号分隔的多个IP地址和端口的字符串,如"
192.168.0.1:2181,192.168.0.2:2181,192.168.0.3:2181
客户端对服务器地址列表进行的封装:
ConnectStringParser作用:
针对其作用进行讲解:3.2.1、3.2.2
3.2.1 chroot:客户端隔离命令空间
含义:
作用:
3.2.2 HostProvider:客户端的服务器地址列表管理器
HostProvider是一个接口:
InetSocketAddress:封装了服务器地址和相应的端口,以ArrayList的形式保存到ConnectStringParser.serverAdderss属性中;未被解析,需要到HostProvider中进行解析
HostProvider的实现必须满足以下三要素:
- 默认实现:StaticHostProvider
解析服务器地址:
获取可用的服务器地址:类似“Round Robin”调度策略
即ZooKeeper客户端连接服务器时,采用先打散后顺序的方式从服务器列表中选择服务器机器
例子:
- 自实现HostProvoder需求
3.3 ClientCnxn:网络IO
ClientCnxn是ZooKeeper客户端的核心工作累,负责维护客户端与服务端之间的网络连接并进行一系列网络通信
内部工作原理涉及Packet、outgoingQueue、pendingQueue、ClientCnxnSocket等
3.3.1 Packet
Packet是ClientCnxn内部定义的一个对协议层的封装,作为请求与响应的载体,包含了最基本的请求体、响应头、请求体、响应体、节点路径、注册的Wacther等信息:
网络传输中,只会序列化requestHeader、request和readOnly三个属性,节约网络资源和提高速度
3.3.2 outgoingQueue和pendingQueue
3.3.3 ClientCnxnSocket:底层Socket通信层
主要负责对请求的发送和响应的接收过程
-
请求发送
可发送的Packet:
请求发送完毕之后,会立即将该Packet保存到pendingQueue中,以便等待服务端响应返回后进行相应的处理 -
响应接收
客户端获取到来自服务端的完整响应数据后,根据不同的客户端请求类型,进行不同的处理:
最后,会在finishPacket方法中处理Watcher注册等逻辑
3.3.4 SendThread
是客户端ClientCnxn内部一个核心的IO调用线程,用于管理客户端和服务端之间的所有网络IO操作:
3.3.5 EventThread
是客户端ClientCnxn内部另一个核心的IO调用线程,负责客户端的事件处理,并触发客户端注册的Wacther监听
工作机制:使用waitingEvents队列