elasticsearchElasticSearch深度解析大数据

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

2017-12-11  本文已影响388人  飞来来

本篇为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

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

参数详解

主要工作

setup
setup(boolean addShutdownHook, Environment environment)throws BootstrapException 

主要工作

start
start() throws NodeValidationException 

主要工作

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

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

Node类

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


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

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

上一篇下一篇

猜你喜欢

热点阅读