本篇为elasticsearch源码分析系列文章的第二篇,由于技术不精,而叙述的不好或不对的地方还请大家指出 ^ _ ^!!!
源码主要模块
distribution:elasticsearch的打包发行相关,将elasticsearch打成各种发行包(zip,deb,rpm,tar)的模块。具体用法如是,在相应的发行版本模块下执行publishToMavenLocal这个Task,如果执行成功的话就会在路径build/distributions下生成对应的发行包,这种打好的包就能在生产服务器上运行。如下图所示:
core:核心包,elasticsearch的源码主要在这个里面
buildSrc:elasticsearch的构建相关的代码
client:作为连接elasticsearch的客户端相关代码,接口如下图:
modules:作为elasticsearch除核心外的必备模块相关代码,结构如下图:
plugins:作为elasticsearch必备的插件的相关代码,结构如下图:
启动入口
在上面提到的distribution模块中的src/main/resources/bin路径下能看到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细节内容,请大家多多支持 ^ _ ^ !!!