本篇爲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細節內容,請你們多多支持 ^ _ ^ !!!