zk服务端代码启动流程

以下是启动的时序图:

以上两张是zk源码单机下启动的流程 下面对的每一个流程进行描述

第一张图

1. 在zk的启动脚本中zkServer.cmd中

setlocal
call "%~dp0zkEnv.cmd"

set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
echo on
echo %JAVA% "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %* 
call %JAVA% "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*

endlocal

可知QuorumPeerMain为启动的入口 但是我们这边需要设置启动文件zoo.cfg,因为是源码 我直接写到代码里去了

public static void main(String[] args) {
        QuorumPeerMain main = new QuorumPeerMain();
        
        try {
        	 File ff=new File("libresource/conf/zoo.cfg");
        	 args=new String[]{ff.getAbsolutePath()};
        	 System.out.println(args[0]);
            main.initializeAndRun(args);
        } catch (IllegalArgumentException e) {
            LOG.error("Invalid arguments, exiting abnormally", e);
            LOG.info(USAGE);
            System.err.println(USAGE);
            System.exit(2);
        } catch (ConfigException e) {
            LOG.error("Invalid config, exiting abnormally", e);
            System.err.println("Invalid config, exiting abnormally");
            System.exit(2);
        } catch (Exception e) {
            LOG.error("Unexpected exception, exiting abnormally", e);
            System.exit(1);
        }
        LOG.info("Exiting normally");
        System.exit(0);
    }

这一步server端开始启动

2. 解析zoo.cfg的信息 

3. 这一步会开启一个定时任务 不过具体干啥的没去深究

4. 开始进行服务端的初始 这一步会进行判断 判断是否为集群模式下启动 我们这里先分析单机启动

扫描二维码关注公众号,回复: 6130783 查看本文章
  if (args.length == 1 && config.servers.size() > 0) {
            runFromConfig(config);
        } else {
            LOG.warn("Either no config or no quorum defined in config, running "
                    + " in standalone mode");
            // there is only server in the quorum -- run as standalone
            ZooKeeperServerMain.main(args);
        }

5. 调用单机模式下服务端的初始化方法

6. 解析配置文件zoo.cfg的文件内容

7.根据配置文件的内容 进行服务端的启动

8.服务端参数配置初始化

9.创建连接服务端的处理工厂 可以在配配置文件中通过 zookeeper.serverCnxnFactor指定 默认使用 NIOServerCnxnFactory 

接下的分析 我们以NIOServerCnxnFactory进行展开

10. 连接工厂参数配置

11. 工厂(NIOServerCnxnFactory)启动

接第二张图

1.工厂线程启动这里使用nio来处理客户端发起的请求

2. zk服务端线程启动执行其run方法

3. 开始初始化zk的数据库或者进行恢复

6.zk服务端的启动方法

7. 启动zk的会话管理线程

8. 启动zk服务端的请求处理线程

9. 启动jmx服务

10. 修改zk服务的状态 唤醒被阻塞的线程

以上逻辑可以结合源码进行观看  

下一章 梳理服务端如何接入客户端请求 并进行响应

zk源码地址

 https://gitee.com/zhaoyu123/zookeeper-java-source-real.git

猜你喜欢

转载自blog.csdn.net/zhaoyu_nb/article/details/86979398