[2]elasticsearch源码深入分析——启动过程(Bootstrap)

96
飞来来
0.1 2017.12.11 10:29* 字数 1083

本篇为elasticsearch源码分析系列文章的第二篇,由于技术不精,而叙述的不好或不对的地方还请大家指出 ^ _ ^!!!

源码主要模块

distribution:elasticsearch的打包发行相关,将elasticsearch打成各种发行包(zip,deb,rpm,tar)的模块。具体用法如是,在相应的发行版本模块下执行publishToMavenLocal这个Task,如果执行成功的话就会在路径build/distributions下生成对应的发行包,这种打好的包就能在生产服务器上运行。如下图所示:

通过distribution模块打包发行版本.png

core:核心包,elasticsearch的源码主要在这个里面

buildSrc:elasticsearch的构建相关的代码

client:作为连接elasticsearch的客户端相关代码,接口如下图:

client

modules:作为elasticsearch除核心外的必备模块相关代码,结构如下图:

modules

plugins:作为elasticsearch必备的插件的相关代码,结构如下图:

plugins

启动入口

在上面提到的distribution模块中的src/main/resources/bin路径下能看到elasticsearch的启动脚本。如下图所示:

elasticsearch启动脚本

脚本先载入了jvm配置文件jvm.options(在我们下载解约的发行包的config文件夹中)

ES_JVM_OPTIONS="$ES_PATH_CONF"/jvm.options

然后载入我们在Run/Debug Configurations中配置的VM参数。

-Des.path.conf=D:\seymour\elasticsearch\elasticsearch-6.0.0-rc2
-Des.path.home=D:\seymour\elasticsearch\elasticsearch-6.0.0-rc2
-Dlog4j2.disable.jmx=true

最后启动org.elasticsearch.bootstrap.Elasticsearch这个主类中的main方法。

main方法首先添加了关闭钩子,

关闭钩子

然后配置日志输出器,

日志输出器

然后检查了elasticsearch的三个环境参数:

    putSystemPropertyIfSettingIsMissing(settings, "path.data", "es.path.data");
    putSystemPropertyIfSettingIsMissing(settings, "path.home", "es.path.home");
    putSystemPropertyIfSettingIsMissing(settings, "path.logs", "es.path.logs");

所有的检查做完后,代码流转到了*org.elasticsearch.bootstrap.Bootstrap
*类的init()方法,而正是Bootstrap类完成了elasticsearch的启动

Bootstrap.init(!daemonize, pidFile, quiet, initialEnv);

Bootstrap类

下面我们来看一下Bootstrap中的几个重要方法:

init
init(final boolean foreground,final Path pidFile,final boolean quiet,final Environment initialEnv) throws BootstrapException, NodeValidationException, UserException

这个方法不用说也知道是做了一些启动前的初始化工作

参数详解

  • foreground:标识elasticsearch是否是作为后台守护进程启动的,
  • pidFile:通过parser解析args后得到,实际是解析了默认命令行参数(verbose,E,silent,version,help,quiet,daemonize,pidfile)
  • quiet:同上
  • initialEnv:Environment实例化的环境参数对象,保存了一些类似于repoFile,configFile,pluginsFile,binFile,libFile等参数。

主要工作

  • 首先会实例化一个Bootstrap对象
  • 配置log输出器
  • 创建pid文件,会在磁盘上持久化一个记录应用pid的文件
  • 通过参数foreground和quiet来控制日志输出
  • 调用Bootstrap的setup方法和start方法
setup
setup(boolean addShutdownHook, Environment environment)throws BootstrapException 

主要工作

  • 通过environment生成本地插件控制器


  • 初始化本地资源


  • 在安全管理器安装之前初始化探针


  • 添加关闭钩子


  • 检查jar重复


  • 在安全管理器安装之前配置日志输出器


  • 安装安全管理器


  • 通过参数environment实例化Node


start
start() throws NodeValidationException 

主要工作

  • 启动已经实例化的Node
  • 启动keepAliveThread 线程,这个线程在Bootstrap初始化的时候就已经实例化了,该线程创建了一个计数为1的CountDownLatch,目的是在启动完成后能顺利添加关闭钩子,而这句:

意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁等操作。

可以看到启动的重点在setup方法中,启动过后就是Node的事了。

Node类

Node是通过NodeBuilder来实例化的,使用google的注入框架Guice的Injector进行注入与获取实例。elasticsearch里面的组件都是用上面的方法进行模块化管理,elasticsearch对guice进行了封装,通过ModulesBuilder类构建elasticsearch的模块:


Node的启动就是Node里每个组件的启动,同样的,分别调用不同的的start方法来启动这个组件,如下

至此elasticsearch就启动完成了,后面我会继续讲解elasticsearch细节内容,请大家多多支持 ^ _ ^ !!!

elasticsearch源码