目录
- ServerCnxnFactory
- 1. 创建ServerCnxnFactory
- 2. 配置属性configure()
- 3. 启动start()
ServerCnxnFactory
Zookeeper使用ServerCnxnFactory管理与客户端的连接,服务端每与一个客户端就会创建一个ServerCnxn实例并由ServerCnxnFactory管理,ServerCnxnFactory是一个抽象类,它有两个实现,可在配置文件zoo.cfg中通过设置zookeeper.serverCnxnFactory
属性指定具体实现,默认使用NIOServerCnxnFactory。
QuorumPeerMain类集群方式启动的时关于ServerCnxnFactory的启动过程大致如下:
整个过程大体分为4步:
- 调用ServerCnxnFactory的静态方法
createFactory()
创建实例 - 根据配置文件的属性进行初始化
- 设置到QuorumPeer的属性中
- QuorumPeer调用
start()
方法启动ServerCnxnFactory实例
接下来逐步分析ServerCnxnFactory的创建及启动过程。
1. 创建ServerCnxnFactory
在QuorumPeerMain启动过程中创建ServerCnxnFactory的代码如下:
默认情况下只创建cnxnFactory
,接下来看下ServerCnxnFactory.createFactory()
方法。
NIOServerCnxnFactory的无参函数是个空函数,后续通过调用configure()
函数进行参数赋值及初始化。
2. 配置属性configure()
先看下NIOServerCnxnFactory的数据结构:
在这些属性中最重要的是四类线程:
- accept线程,此类线程只有一个。它主要是接收来自客户端的连接并将其分配给select线程
- select线程,有N个,可通过
zookeeper.nio.numSelectorThreads
设置。监听读写事件并交给worker线程具体处理。 - worker线程,用来负责socket的读写,有N个。处理具体的请求。
- expirer线程,用于管理连接的线程,只有1个。管理过期的连接。
接下来看下configure()
方法对这些属性的初始化:
acceptThread
传进去的addr即客户端地址,即clientPort配置的端口号,默认2181。
3. 启动start()
属性配置完后就通过start()方法启动,源码过程如下:
start()的过程主要是启动了四类线程,至此,ServerCnxnFactory已经启动成功,下文继续分析它的工作原理。