《Zookeeper》源码分析(四)之ServerCnxnFactory的启动过程

目录

  • ServerCnxnFactory
    • 1. 创建ServerCnxnFactory
    • 2. 配置属性configure()
    • 3. 启动start()

ServerCnxnFactory

Zookeeper使用ServerCnxnFactory管理与客户端的连接,服务端每与一个客户端就会创建一个ServerCnxn实例并由ServerCnxnFactory管理,ServerCnxnFactory是一个抽象类,它有两个实现,可在配置文件zoo.cfg中通过设置zookeeper.serverCnxnFactory属性指定具体实现,默认使用NIOServerCnxnFactory
在这里插入图片描述

QuorumPeerMain类集群方式启动的时关于ServerCnxnFactory的启动过程大致如下:
《Zookeeper》源码分析(四)之ServerCnxnFactory的启动过程_第1张图片

整个过程大体分为4步:

  1. 调用ServerCnxnFactory的静态方法createFactory()创建实例
  2. 根据配置文件的属性进行初始化
  3. 设置到QuorumPeer的属性中
  4. QuorumPeer调用start()方法启动ServerCnxnFactory实例

接下来逐步分析ServerCnxnFactory的创建及启动过程。

1. 创建ServerCnxnFactory

QuorumPeerMain启动过程中创建ServerCnxnFactory的代码如下:

《Zookeeper》源码分析(四)之ServerCnxnFactory的启动过程_第2张图片

默认情况下只创建cnxnFactory,接下来看下ServerCnxnFactory.createFactory()方法。
《Zookeeper》源码分析(四)之ServerCnxnFactory的启动过程_第3张图片

NIOServerCnxnFactory的无参函数是个空函数,后续通过调用configure()函数进行参数赋值及初始化。

2. 配置属性configure()

先看下NIOServerCnxnFactory的数据结构:
《Zookeeper》源码分析(四)之ServerCnxnFactory的启动过程_第4张图片

在这些属性中最重要的是四类线程:

  1. accept线程,此类线程只有一个。它主要是接收来自客户端的连接并将其分配给select线程
  2. select线程,有N个,可通过zookeeper.nio.numSelectorThreads设置。监听读写事件并交给worker线程具体处理。
  3. worker线程,用来负责socket的读写,有N个。处理具体的请求。
  4. expirer线程,用于管理连接的线程,只有1个。管理过期的连接。

接下来看下configure()方法对这些属性的初始化:
《Zookeeper》源码分析(四)之ServerCnxnFactory的启动过程_第5张图片

acceptThread传进去的addr即客户端地址,即clientPort配置的端口号,默认2181。

3. 启动start()

属性配置完后就通过start()方法启动,源码过程如下:
《Zookeeper》源码分析(四)之ServerCnxnFactory的启动过程_第6张图片

start()的过程主要是启动了四类线程,至此,ServerCnxnFactory已经启动成功,下文继续分析它的工作原理。
《Zookeeper》源码分析(四)之ServerCnxnFactory的启动过程_第7张图片

你可能感兴趣的:(Zookeeper,zookeeper)