Edit me

[TOC]

主函数部分

主函数位于 /Users/chandler/WorkSpace/APA/Codes/nuls/node/src/main/java/io/nuls/Bootstrap.java文件中:

public class Bootstrap {

    public static void main(String[] args) {
        Thread.currentThread().setName("Nuls");
        try {
            sysStart();
        } catch (Exception e) {
            Log.error(e);
            System.exit(1);
        }
    }

主函数主要是调用了sysStart函数来启动系统,此函数做的工作如下:

MicroKernelBootstrap mk = MicroKernelBootstrap.getInstance();
mk.init();
mk.start();
initModules();
Thread.sleep(3000);

生成了一个类的实体,然后初始化并启动,接着初始化了每个模块,然后这个主线程就进入休眠状态,然后每10s去检测异常并进行系统打印。init和start部分是去查询了配置文件并启动了消息队列,initModules函数则去获取上面初始化的实体并依次启动每个模块。那么我们重点关注一下内核的类MicroKernelBootstrap。

内核类MicroKernelBootstrap

内核类的路径为 /Users/chandler/WorkSpace/APA/Codes/nuls/core/src/main/java/io/nuls/core/MicroKernelBootstrap.java 它继承了一个虚类BaseModuleBootstrap,基类定义了每个模块的id,状态以及名称还有各种基础操作。 如上所述,内核类的init主要是获取了配置文件,这里用到了新的类NulsContext和ConfigLoader,后面再看,我们重点关注它的start函数,里面启动了消息队列:

public void start() {
    QueueManager.start();
}

消息队列是用map实现的,并且在类中建立了一个线程池,此时消息队列只是启动了,还并未向里存放数据。 接下来便是要初始化各个模块了。

模块初始化

模块初始化部分代码如下:

private static void initModules() {
    Map<String, String> bootstrapClasses = null;
    try {
        bootstrapClasses = getModuleBootstrapClass();
    } catch (NulsException e) {
        Log.error(e);
    }
    if (null == bootstrapClasses || bootstrapClasses.isEmpty()) {
        return;
    }
    ModuleService.getInstance().startModules(bootstrapClasses);
}

这里需要首先搞明白配置文件是怎么读取的,然后初始化后如何运行的。

配置文件的路径为:

String USER_CONFIG_FILE = "nuls.ini";
String MODULES_CONFIG_FILE = "modules.ini";
String MODULE_BOOTSTRAP_KEY = "bootstrap";

文件路径是 /Users/chandler/WorkSpace/APA/Codes/nuls/node/src/main/resources/nuls.ini 以及 /Users/chandler/WorkSpace/APA/Codes/nuls/node/src/main/resources/modules.ini nuls.ini只是定义了编码标准,moduls.ini定义了模块信息:

[db]
bootstrap=io.nuls.db.module.impl.MybatisDbModuleBootstrap

[cache]
bootstrap=io.nuls.cache.module.impl.EhCacheModuleBootstrap

[account]
bootstrap=io.nuls.account.module.impl.AccountModuleBootstrap

[event-bus]
bootstrap=io.nuls.event.bus.module.impl.EventBusModuleBootstrap

[ledger]
bootstrap=io.nuls.ledger.module.impl.UtxoLedgerModuleBootstrap

[network]
bootstrap=io.nuls.network.module.impl.NetworkModuleBootstrap
network.server.port=8004
network.external.port=8004
network.magic=12345687

[consensus]
bootstrap=io.nuls.consensus.module.impl.PocConsensusModuleBootstrap
partake.packing=true
seed.nodes=2CWtY5qzYrthRggBZapPGW5hdKcpuEx

[notify]
bootstrap=io.nuls.notify.module.NotifyModuleBootstrap
notify.port=8002

[rpc]
bootstrap=io.nuls.rpc.module.impl.RpcServerModuleBootstrap
server.ip=127.0.0.1
server.port=8001
server.url=nuls
request.white.sheet=127.0.0.1,127.0.0.2
Tags: