本篇为elasticsearch源码分析系列文章的第二篇,因为技术不精,而叙述的很差或不对的地方还请你们指出 ^ _ ^!!!bootstrap
distribution:elasticsearch的打包发行相关,将elasticsearch打成各类发行包(zip,deb,rpm,tar)的模块。具体用法如是,在相应的发行版本模块下执行publishToMavenLocal这个Task,若是执行成功的话就会在路径build/distributions下生成对应的发行包,这种打好的包就能在生产服务器上运行。以下图所示:安全
core:核心包,elasticsearch的源码主要在这个里面服务器
buildSrc:elasticsearch的构建相关的代码框架
client:做为链接elasticsearch的客户端相关代码,接口以下图:jvm
modules:做为elasticsearch除核心外的必备模块相关代码,结构以下图:elasticsearch
plugins:做为elasticsearch必备的插件的相关代码,结构以下图:模块化
在上面提到的distribution模块中的src/main/resources/bin路径下能看到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中的几个重要方法:
init(final boolean foreground,final Path pidFile,final boolean quiet,final Environment initialEnv) throws BootstrapException, NodeValidationException, UserException
复制代码
这个方法不用说也知道是作了一些启动前的初始化工做
参数详解
主要工做
setup(boolean addShutdownHook, Environment environment)throws BootstrapException
复制代码
主要工做
经过environment生成本地插件控制器
初始化本地资源
在安全管理器安装以前初始化探针
添加关闭钩子
检查jar重复
在安全管理器安装以前配置日志输出器
安装安全管理器
经过参数environment实例化Node
start() throws NodeValidationException
复制代码
主要工做
意思就是在jvm中增长一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的全部经过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。因此这些钩子能够在jvm关闭的时候进行内存清理、对象销毁等操做。
能够看到启动的重点在setup方法中,启动事后就是Node的事了。
Node是经过NodeBuilder来实例化的,使用google的注入框架Guice的Injector进行注入与获取实例。elasticsearch里面的组件都是用上面的方法进行模块化管理,elasticsearch对guice进行了封装,经过ModulesBuilder类构建elasticsearch的模块:
Node的启动就是Node里每一个组件的启动,一样的,分别调用不一样的的start方法来启动这个组件,以下
至此elasticsearch就启动完成了,后面我会继续讲解elasticsearch细节内容,请你们多多支持 ^ _ ^ !!!