本篇为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.-rc2
-Des.path.home=D:\seymour\elasticsearch\elasticsearch-6.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细节内容,请大家多多支持 ^ _ ^ !!!
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3134217/ ,如需转载,请注明出处,否则将追究法律责任。