目录
- 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已经启动成功,下文继续分析它的工作原理。


![[C++项目] Boost文档 站内搜索引擎(5): cpphttplib实现网络服务、html页面实现、服务器部署...](https://img-blog.csdnimg.cn/img_convert/102f58fa9558f7fd22df58fc0a353b15.png)

















