本篇為elasticsearch源碼分析系列文章的第二篇坦仍,由于技術(shù)不精鳍烁,而敘述的不好或不對(duì)的地方還請(qǐng)大家指出 ^ _ ^!!!
源碼主要模塊
distribution:elasticsearch的打包發(fā)行相關(guān),將elasticsearch打成各種發(fā)行包(zip繁扎,deb幔荒,rpm,tar)的模塊。具體用法如是恬叹,在相應(yīng)的發(fā)行版本模塊下執(zhí)行publishToMavenLocal這個(gè)Task怕享,如果執(zhí)行成功的話就會(huì)在路徑build/distributions下生成對(duì)應(yīng)的發(fā)行包,這種打好的包就能在生產(chǎn)服務(wù)器上運(yùn)行姚垃。如下圖所示:
core:核心包,elasticsearch的源碼主要在這個(gè)里面
buildSrc:elasticsearch的構(gòu)建相關(guān)的代碼
client:作為連接elasticsearch的客戶端相關(guān)代碼盼忌,接口如下圖:
modules:作為elasticsearch除核心外的必備模塊相關(guān)代碼积糯,結(jié)構(gòu)如下圖:
plugins:作為elasticsearch必備的插件的相關(guān)代碼,結(jié)構(gòu)如下圖:
啟動(dòng)入口
在上面提到的distribution模塊中的src/main/resources/bin路徑下能看到elasticsearch的啟動(dòng)腳本谦纱。如下圖所示:
腳本先載入了jvm配置文件jvm.options(在我們下載解約的發(fā)行包的config文件夾中)
ES_JVM_OPTIONS="$ES_PATH_CONF"/jvm.options
然后載入我們?cè)赗un/Debug Configurations中配置的VM參數(shù)看成。
-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
最后啟動(dòng)org.elasticsearch.bootstrap.Elasticsearch這個(gè)主類中的main方法。
main方法首先添加了關(guān)閉鉤子跨嘉,
然后配置日志輸出器绍昂,
然后檢查了elasticsearch的三個(gè)環(huán)境參數(shù):
putSystemPropertyIfSettingIsMissing(settings, "path.data", "es.path.data");
putSystemPropertyIfSettingIsMissing(settings, "path.home", "es.path.home");
putSystemPropertyIfSettingIsMissing(settings, "path.logs", "es.path.logs");
所有的檢查做完后,代碼流轉(zhuǎn)到了*org.elasticsearch.bootstrap.Bootstrap
*類的init()方法,而正是Bootstrap類完成了elasticsearch的啟動(dòng)
Bootstrap.init(!daemonize, pidFile, quiet, initialEnv);
Bootstrap類
下面我們來看一下Bootstrap中的幾個(gè)重要方法:
init
init(final boolean foreground,final Path pidFile,final boolean quiet,final Environment initialEnv) throws BootstrapException, NodeValidationException, UserException
這個(gè)方法不用說也知道是做了一些啟動(dòng)前的初始化工作
參數(shù)詳解
- foreground:標(biāo)識(shí)elasticsearch是否是作為后臺(tái)守護(hù)進(jìn)程啟動(dòng)的窘游,
- pidFile:通過parser解析args后得到唠椭,實(shí)際是解析了默認(rèn)命令行參數(shù)(verbose,E,silent忍饰,version贪嫂,help,quiet艾蓝,daemonize力崇,pidfile)
- quiet:同上
- initialEnv:Environment實(shí)例化的環(huán)境參數(shù)對(duì)象,保存了一些類似于repoFile赢织,configFile亮靴,pluginsFile,binFile于置,libFile等參數(shù)茧吊。
主要工作
- 首先會(huì)實(shí)例化一個(gè)Bootstrap對(duì)象
- 配置log輸出器
- 創(chuàng)建pid文件,會(huì)在磁盤上持久化一個(gè)記錄應(yīng)用pid的文件
- 通過參數(shù)foreground和quiet來控制日志輸出
- 調(diào)用Bootstrap的setup方法和start方法
setup
setup(boolean addShutdownHook, Environment environment)throws BootstrapException
主要工作
-
通過environment生成本地插件控制器
-
初始化本地資源
-
在安全管理器安裝之前初始化探針
-
添加關(guān)閉鉤子
-
檢查jar重復(fù)
-
在安全管理器安裝之前配置日志輸出器
-
安裝安全管理器
-
通過參數(shù)environment實(shí)例化Node
start
start() throws NodeValidationException
主要工作
- 啟動(dòng)已經(jīng)實(shí)例化的Node
- 啟動(dòng)keepAliveThread 線程八毯,這個(gè)線程在Bootstrap初始化的時(shí)候就已經(jīng)實(shí)例化了搓侄,該線程創(chuàng)建了一個(gè)計(jì)數(shù)為1的CountDownLatch,目的是在啟動(dòng)完成后能順利添加關(guān)閉鉤子话速,而這句:
意思就是在jvm中增加一個(gè)關(guān)閉的鉤子讶踪,當(dāng)jvm關(guān)閉的時(shí)候,會(huì)執(zhí)行系統(tǒng)中已經(jīng)設(shè)置的所有通過方法addShutdownHook添加的鉤子泊交,當(dāng)系統(tǒng)執(zhí)行完這些鉤子后乳讥,jvm才會(huì)關(guān)閉。所以這些鉤子可以在jvm關(guān)閉的時(shí)候進(jìn)行內(nèi)存清理廓俭、對(duì)象銷毀等操作云石。
可以看到啟動(dòng)的重點(diǎn)在setup方法中,啟動(dòng)過后就是Node的事了白指。
Node類
Node是通過NodeBuilder來實(shí)例化的,使用google的注入框架Guice的Injector進(jìn)行注入與獲取實(shí)例酵紫。elasticsearch里面的組件都是用上面的方法進(jìn)行模塊化管理告嘲,elasticsearch對(duì)guice進(jìn)行了封裝,通過ModulesBuilder類構(gòu)建elasticsearch的模塊:
Node的啟動(dòng)就是Node里每個(gè)組件的啟動(dòng)奖地,同樣的橄唬,分別調(diào)用不同的的start方法來啟動(dòng)這個(gè)組件,如下
至此elasticsearch就啟動(dòng)完成了,后面我會(huì)繼續(xù)講解elasticsearch細(xì)節(jié)內(nèi)容参歹,請(qǐng)大家多多支持 ^ _ ^ !!!