[2]elasticsearch源碼深入分析——啟動(dòng)過程(Bootstrap)

本篇為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)行。如下圖所示:

通過distribution模塊打包發(fā)行版本.png

core:核心包,elasticsearch的源碼主要在這個(gè)里面

buildSrc:elasticsearch的構(gòu)建相關(guān)的代碼

client:作為連接elasticsearch的客戶端相關(guān)代碼,接口如下圖:

client

modules:作為elasticsearch除核心外的必備模塊相關(guān)代碼,結(jié)構(gòu)如下圖:

modules

plugins:作為elasticsearch必備的插件的相關(guān)代碼,結(jié)構(gòu)如下圖:

plugins

啟動(dòng)入口

在上面提到的distribution模塊中的src/main/resources/bin路徑下能看到elasticsearch的啟動(dòng)腳本。如下圖所示:

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)閉鉤子,

關(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)大家多多支持 ^ _ ^ !!!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,688評(píng)論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,285評(píng)論 6 342
  • 畢業(yè)10年了,終于下了決定換了個(gè)新公司。初來乍到新公司,kick off一個(gè)新的ES項(xiàng)目,打算借此機(jī)會(huì)去研究一下E...
    華安火車迷閱讀 2,903評(píng)論 4 14
  • 我現(xiàn)在就付諸行動(dòng) 我的幻想毫無價(jià)值,我的計(jì)劃渺如塵埃,我的目標(biāo)不可能達(dá)到。 一切的一切毫無意義,除非我付諸行動(dòng)。我...
    蘇北玄天一片云閱讀 499評(píng)論 0 0
  • 無青樹翠山,一樣細(xì)雨緲萬里??醋蠒詾跸?,相同心落廣寒宮。
    葉芙蓋妮婭瑪爾斯閱讀 600評(píng)論 0 0

友情鏈接更多精彩內(nèi)容