[2]elasticsearch源码深刻分析——启动过程

本篇为elasticsearch源码分析系列文章的第二篇,因为技术不精,而叙述的很差或不对的地方还请你们指出 ^ _ ^!!!bootstrap

源码主要模块

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

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

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

buildSrc:elasticsearch的构建相关的代码框架

client:做为链接elasticsearch的客户端相关代码,接口以下图:jvm

client

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

modules

plugins:做为elasticsearch必备的插件的相关代码,结构以下图:模块化

plugins

启动入口

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

elasticsearch启动脚本

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

ES_JVM_OPTIONS="$ES_PATH_CONF"/jvm.optionsgoogle

而后载入咱们在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细节内容,请你们多多支持 ^ _ ^ !!!

相关文章
相关标签/搜索