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. 開始進行服務端的初始 這一步會進行判斷 判斷是否爲集羣模式下啓動 我們這裏先分析單機啓動

  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

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章